概述
2.5 处理类型
2.5.1 类型别名
1、typedef可用于定义类型别名。e.g. typedef double wages, *p; // wages是double的同义词,p是double*的同义词
2、新标准定义类型别名的新方法:别名声明(alias declaration)。e.g. using SI = Sales_item; // SI是Sales_item的同义词
3、遇到使用类型别名的声明语句时,不要尝试直接替换回本来的样子去理解语句的意思。e.g. P61
2.5.2 auto类型说明符
1、auto类型说明符:通过它可以让编译器替我们去分析表达式所属的类型。auto定义的变量必须有初始值,并且若该语句定义多个变量,则所有变量的初始基本数据类型都必须一样。
2、编译器推断出来的auto类型有时候和初始值并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。
(1)使用引用初始化auto时,真正参与初始化的是引用对象的值,所以引用对象的类型为auto的类型。
(2)auto一般会忽略掉顶层const,而保留底层const。e.g. P62
const int ci = i, &cr = ci;
auto b = ci; // 虽然ci是常量,但是auto忽略顶层const,所以b是int
auto c = cr; // 虽然cr是底层const,但是真正参与初始化是cr引用的对象,也就是ci,ci是顶层const,所以c也是int
auto e = &ci; // &ci是底层const,所以e是指向整数常量的指针
(3)引用与auto:e.g.
auto &g = ci; // g绑定了常量ci,因此只能是整型常量引用
auto &h = 42; // h推演类型是int&,但是int型引用只能绑定int对象,不能绑定字面值,所以这么写是错的,而如果在auto前加上const,就是正确的。
2.5.3 decltype类型说明符
1、decltype:选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。如果decltype使用的表达式是一个变量,则decltype返回该变量的类型,而不会因为是顶层const或引用而做特殊处理。因此引用只有用在decltype处,不会作为其绑定对象的同义词。
2、decltype使用的表达式不是一个变量时,decltype返回表达式结果对应的类型。有些表达式将向decltype返回一个引用类型:(P63)
(1)表达式的内容是解引用操作时,decltype将得到引用类型。
(2)如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型;如果给变量加上了一层或多层括号,编译器就会把它当做一个表达式,这样的decltype会得到引用类型。
2.6 自定义数据结构
1、可以通过关键字struct定义类,类定义的最后需要加上分号。
2、一般将类定义在头文件中,头文件通常包含那些只能被定义一次的实体,如类,const和constexpr变量等。
3、头文件也经常用到其他头文件的功能,有必要在书写头文件时做适当处理,使其遇到多次包含的情况也能安全和正常地工作。
4、确保头文件多次包含仍能安全工作的常用技术是预处理器(preprocessor)。(P68)
(1)#include:编译器遇到它时会将指定头文件的内容代替#include
(2)头文件保护符:#ifndef,#define,#ifdef,#endif,使用它们能有效地防止重复包含的发生
(3)预处理器无视C++中关于作用域的规则
(4)整个程序中的预处理变量包括头文件保护符必须唯一,为了避免与程序中其他实体发生名字冲突,一般将预处理变量的名字全部大写
(5)头文件即使没有被包含在任何头文件中,也应该设置保护符。头文件保护符很简单,程序员只要习惯性地加上就可以了,没必要在乎你的程序到底需不需要
作业题:
练习2.33:不能把int值分配到int*与const int*的实体,所以d和e的赋值是错误的。练习2.37:最后一句括号中a = b这条语句不会执行,因为decltype只判断括号中的类型,不实际执行它。
练习2.39:实际运行的报错信息:
(1)foo后面接int是非法的(编译器认为定义了一个foo型变量“int”,但是int不能作为变量名)
(2)“main”的返回类型应为int而非foo
(3)return:无法从int转换为foo
所以一定要记得struct定义的最后要加分号!
最后
以上就是清爽店员为你收集整理的第二章 2.5-2.6的全部内容,希望文章能够帮你解决第二章 2.5-2.6所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复