C++Primer2.5节 处理类型知识梳理

**C++Primer2.5节 处理类型知识梳理 **

2.5.1 类型别名
1、类型别名:是指给已存在的类型定义另一个名字,使其简单易懂,以便于记忆和使用。
2、类型别名定义的形式:
①传统的方法使用typedef来定义,例如;
typedef int p; //p就是int的别名,可以用来定义int型的变量。
typedef int *a;//a就是整型指针的别名,可以用a来定义指向整型对象的指针。
②使用别名声明,具体形式:using 别名=已存在的类型;
例如:using cn=const int; //cn就是const int的别名。
3、指针、常量和类型别名
①当类型别名是一个复合类型时,比如using pststring=char *;pstring是一个指向字符型对象的指针。当运行下列程序时,
typedef char *pstring;
const pstring cnt=nullptr; //相当于const char *const cnt=nullptr,表示这是一个指向字符对象的常量指针。
②注意点:
A:const是对基本类型的修饰。const修饰的是pstring,而pstring的基本类型是指针,所以const修饰的是指针,修饰后变成了常量指针。
B:不能将语句中的类型别名直接替换成其原来的类型,不然会造成对该语句的理解错误。
例如:将上面语句改写成const char *cnt=nullptr;则会把语句解释成这是一个指向字符常量的指针,初始值为0。这与原来的语句解释是完全不一样的。

2.5.2 auto类型说明符
1、定义:auto类型会自动将表达式的所属类型赋予给变量。
2、使用auto的条件:
①所以auto定义变量必须要初始化。
②在一条语句中,auto能够定义多个变量。因为一条声明语句中只能有一种基本数据类型,所以在auto定义的语句中所有变量的初始值的基本数据类型必须要相同。
3、复合类型、常量和auto。
①以引用的对象的类型作为auto的类型。
②auto一般会忽略顶层const,但会保留底层const。比如初始值是指向常量的指针。例如:
const int cn=20;
auto ci=&cn; // ci是指向整型常量的指针
③设置一个类型为auto的引用时,初始值的顶层常量属性仍然保留。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。(这句话在我单独写的另外一篇文章有解释)
④当在一条语句中定义多个变量时,要注意*和&只是声明符的一部分,不属于基本数据类型的一部分,要注意每个变量的初始值的类型要相同。

2.5.3 decltype 类型说明符
1、定义:decltype作用是选择并返回操作数的数据类型,在此过程中,编译器会分析表达式并得到它的类型,却并不实际计算出表达式的值。
2、具体形式:decltype(表达式)变量;decltype不一定进行初始化,视返回的类型而定。
3、与auto的对比:decltype处理顶层const和引用的方式与auto有些不同。表达式不同,情况就不同。
①当表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内)。例如;
const int x=10,&y=x;
deltype(x) z=0; //z是一个const int 类型的对象
deltype(y) k=x; //k是一个const int&类型的对象
注意一种特殊的情况: 当变量名加上一对括号,那么decltype则会返回引用类型。
②当表达式不是一个变量,则decltype则返回表达式结果所对应的数据类型。例如
int i=10,&j=i;
decltype(j+0) k; //则j+0表达式的结果是int型的,则decltype的返回类型是int型,而非int &;
③当表达式的结果对象能作为一条赋值语句的左值(对象可以被修改)时,decltype将会返回一个引用类型。
A:表达式的内容是解引用符(*p)时,则decltype会返回一个引用类型。例如:
int x=20,*p=x;
decltype(*p)y=x; //*p是指针指向的对象,可以作为赋值语句的左值,所以decltype返回一个引用类型。
B:表达式是加了括号的变量,此时变量是一种可以作为赋值语句的左值的特殊表达式。

猜你喜欢

转载自blog.csdn.net/qq_47466050/article/details/106396307