一、处理类型
1.1 类型别名
  类型别名(type alias)是一个名字,它是某种类型的同义词,使用类型别名可让类型名字变得简单明了、易于理解和使用,以及清楚地知道使用该类型的目的,有两种方法定义类型别名,分别是:
  ①使用关键字typedef,关键字typedef是作为声明语句中的基本数据类型的一部分出现,含有typedef的声明语句定义的不再是变量而是类型别名。

typedef double wages;         //wages是double的同义词
typedef wages base,*p;        //base是double的同义词,p是double*的同义词

  另外一种定义类型别名的方法是使用别名声明(alias declaration)来定义类型的别名,使用关键字using作为别名声明的开始,其后紧跟别名和等号,即把等号左侧的名字规定为右侧的别名:

using SI = Sales_item;         //SI是Sales_item的同义词

  如果某个类型别名只带的是复合类型或变量,那么我们不能尝试地把类型别名换成它本来的样子用来理解该语句的含义,这样是错误的!

typedef char *pstring;
const pstring cstr = 0;        //cstr是指向char的常量指针
const char *cstr = 0;          //这是对上面语句的错误理解!
const pstring *ps;             //ps是一个指针,它的对象是指向char的常量指针

  const是对给定类型的修饰,而pstring实际上是指向char的指针,因此const pstring是指向char的常量指针。

1.2 auto类型说明符
  编程时常常需要把表达式的值赋给变量,这要求在声明变量时清楚知道表达式的类型,但往往很难做到这一点,C++11新标准引入了auto类型说明符,它可以让编译器通过初始值来推算变量的类型,因而auto定义的变量必须有初始值,同时需要注意的是auto可以在一条语句中声明多个变量,但是所有变量的出啊是基本类型必须都一样。

auto item = val1 + val2;        //item初始化为val1和val2相加的结果
auto sz = 0, pi = 3.14;         //错误,sz和pi的类型不一致

  编译器推断出来的auto类型有时候和初始值的类型不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。

int j = 0, &r = j
auto a = r;                     //a是一个整数,因为r是j的别名,j是一个整数
const int ci = j, &cr = ci;
auto b = ci;                    //b是一个整数,ci的顶层const被忽略
auto c = cr;                    //c是一个整数,cr是ci别名,ci是顶层const
auto d = &j;                    //d是一个正向指针,整数的地址就是指向整数的指针
auto e = &ci;                   //e是指向整数常量的指针,auto不会被忽略低层const

  还可以将引用的类型设为auto,此时原来的初始化规则仍然适用:

auto &g = ci;                    //g是一个整型常量引用,绑定到ci
auto &h = 42;                    //错误,不能为非常量引用绑定字面值
const auto &j = 42;              //正确

1.3 deltype 类型说明符
  有时我们想从表达式的类型推断出定义的变量类型,但是不想用表达式初始化变量,C++11新标准引入了第二种类型说明decltype,它的作用是选择并返回操作数的数据类型,下面的语句中编译器并不实际调用函数,只是返回假如调用f的话其会返回的那个类型。

decltype(f()) sum = x;         //sum的类型就是函数f的返回类型

  decltype处理顶层和引用的方式与auto有些不同,如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内):

const int ci = 0, &cj = ci;
decltype(ci) x = 0;            //x的类型是const int
decltype(cj) y = x;            //y的类型是const int&,y绑定到变量x
decltype(cj) z;                //z是一个引用,必须初始化

  如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型,如下,r是一个引用,decltype(r)的结果是引用类型,但是如果想让结果类型是r所指的类型,可以把r作为表达式的一部分,即r+0,那么这个表达式的结果是一个具体值而不是引用;另一方面解引用指针可以得到指针所指的对象,而且还能给这个对象赋值,因此decltype(*p)的结果类型是int&,即得到引用类型;以及decltype所用的表达式,如果给变量加上一层或多层括号,那么编译器就会把它当成一个表达式,因为变量是一种可以作为赋值语句左值的特殊表达式,所以这样的decltype就会得到引用类型。

int j = 42, *p =&j, &r = j;
decltype(r+0) b;               //正确,加法的结果是int,故b是一个为初始化的int
decltype(*p) c;               //错误,c是int&,必须初始化
decltype((j)) d;               //错误,d是int&,必须初始化

二、自定义数据结构
2.1 定义Sales_data类型
  我们编写类以关键字struct开始(还可以用关键字class来定义自己的数据结构),紧跟着类型名和了体,类体由花括号包围形成一个新的作用域,类内部定义的名字必须唯一,但可以与类外部定义的额名字重复,类体右侧表示结束的花括号必须写一个分号:

struct Sales_data { /* ... */ };

2.2 编写自己的头文件
  一般地,类不定义在函数体内,当函数体外部定义类时,在各个指定的源文件中可能只有一处该类的定义,为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在的头文件的名字应与类的名字一样,例如库类型string在名为string的头文件中定义,Sales_data类应定义在Sales_data.h的头文件中。
  头文件通常包含哪些只能被定义一次的实体,如类、const和constexpr变量等,头文件也经常用到其他头文件的功能,例如Sales_data类包含一个string成员,所以Sales_data.h必须包含string.h头文件,同时使用Sales_data类的程序为了能操作类成员需要再一次包含string.h头文件,这样使用Sales_data类的程序先后两次包含了string.h头文件,所以可以在书写头文件时做适当处理,使其遇到多次包含时也能安全和正常地工作。
  确保头文件多次包含仍能安全工作的常用技术是预处理器(preprocessor),如果之前已经用到了一项预处理功能#include,当预处理器看到#include标记时机会用制定的头文件的内容代替#include。
  C++程序还会用到一项预处理功能是头文件保护符(header guard),头文件保护符依赖于预处理变量,预处理变量有两种状态:已定义和未定义。#define指令把一个名字设定为预处理变量,#ifdef当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真,一旦检查结果为真,则执行后续操作直到#endif制定为止。

#ifndef SALES_DATA_H
#define SALEA_DATA_H
#include <string>
strcut Sales_data{std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};
#endif

  整个程序中的预处理变量包括头文件保护符必须唯一,通常的做法是基于头文件中的类的名字全部大写来构建保护符的名字,一确保唯一性,头文件及时没有被包含在其他任何头文件中,也应该设置保护符,这是一个良好的习惯。

参考文献:
①C++ Primer 第五版。

【C++学习笔记】处理类型和自定义数据结构相关推荐

  1. Java 学习笔记 - 数组类型互转

    Java 学习笔记 - 数组类型互转 数组类型转换 字符串数组 to (Integer.Long.Double)列表 传统方式 Java8 Stream方式 数组 to 数组 字符串数组 to (in ...

  2. 20171220-python学习笔记--函数类型

    20171220-python学习笔记--函数类型 备注: #位置参数 #传入两个参数 def power(x, n):s = 1while n > 0:n = n - 1s = s * xre ...

  3. Python学习笔记之类型判断,异常处理,终止程序操作小结

    Python学习笔记之类型判断,异常处理,终止程序操作小结 运行结果: 这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发. 爬虫.数据分析.数据可视化.机 ...

  4. JavaScript学习笔记:类型检测

    JavaScript学习笔记:类型检测 1.利用typeof检测数据类型 注意:type of null,返回的不是"null",而是"object".type ...

  5. sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

    sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之 ...

  6. 区块链学习笔记2——BTC中的数据结构

    区块链学习笔记2--BTC中的数据结构 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 本文主要介绍 ...

  7. 【算法竞赛学习笔记】pb_ds-超好懂的数据结构

    title : pb_ds date : 2021-8-21 tags : ACM,数据结构 author : Linno 简介 pb_ds库全称Policy-Based Data Structure ...

  8. Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画

    文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...

  9. python的程序异常类型,Python3.4学习笔记之类型判断,异常处理,终止程序操作小结...

    本文实例讲述了Python3.4类型判断,异常处理,终止程序操作.分享给大家供大家参考,具体如下: python3.4学习笔记 类型判断,异常处理,终止程序,实例代码: #idle中按F5可以运行代码 ...

最新文章

  1. phpmailer发送邮件
  2. 开启php缩略图,PHP生成缩略图
  3. sql空字符串判断函数_Excel数据还可这样来查询:用SQL查询输出工作表指定区域更高效!...
  4. 对!这就是你要的pandas练习题(❤️❤️)
  5. Mysql8报You need either to explicitly disable SSL by setting useSSL=false
  6. JAVE实现音频截取并上传OSS
  7. Linux下mysql数据恢复
  8. border缩写属性
  9. word中mathtype的公式后面的光标位置
  10. 用LoopBack接口配置EBGP邻居
  11. 来谈谈O2O线上线下电商解决方案
  12. VMware虚拟机提示“锁定文件失败 打不开磁盘”解决方法
  13. 【智能制造】MES在工业4.0标准下的规范和功能
  14. C语言实验——用*号输出字母C的图案
  15. 【趣谈】| 编程的尽头是玄学?
  16. MFC/C++调用易语言的整数型+文本型与VS2010互动
  17. H3C Inode查看卸载密码的方法
  18. django rest framework学习准备,面向对象中类的使用。
  19. 使用curl下载压缩文件
  20. LCHub:低代码黑帕云正式关停,创始人陈金洲现又正式离职飞书

热门文章

  1. html中div是什么意思
  2. 远程手机教学|简单实用,1键远程协助老人使用智能手机
  3. python3.7 win10 64位系统下用pyinstaller打包的程序在32位系统下无法运行
  4. BLOCKCHAINS VS. DISTRIBUTED DATABASES: DICHOTOMYAND FUSION
  5. 常用C++开发环境介绍
  6. html5 渐变动画效果图,html5+css3城市场景动画_觉唯设计
  7. AdBlock/AdBlock Plus 屏蔽广告
  8. macOS 神器 Workflow ,让效率翻倍!
  9. 高新技术企业申报流程!
  10. 怎html样在图片两边加上空白,怎样在博客两边空白处加上自己喜欢的图片?