C++学习笔记 处理类型(未完成)

类型别名

类型别名是一个名字,它是某种类型的同义词;使用类型别名可以让复杂的类型名字变得简单明了、易于理解和使用,有助于更清楚地直到使用该类型的真实目的

有两种方法可以定义类型别名:

a)使用关键字typedef

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

其中关键字typedef作为声明语句中的基本数据类型的一部分出现,含有typedef的声明语句定义的不再是变量而是类型别名

声明符可以包含类型修饰,从而也能构造出复合类型

b)使用别名声明

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

 其中关键字using作为别名声明的开始,其后紧跟别名和等号,起作用是把等号左侧的名字规定成等号右侧的名字的别名

类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名

指针、常量和类型别名

指代复合类型或常量的类型别名用到声明语句中会产生意想不到的后果

1 typedef char *pstring;
2 const pstring cstr = 0;   // cstr是指向char的常量指针
3 const pstring *ps;        // ps是一个指针,它的对象是指向char的常量指针

上述两条声明语句的基本数据类型都是const pstring,而pstring实际上是指向char的指针,从而const pstring是指向char的常量指针,而非指向常量字符的指针

如果直接把类型别名替换成它本来的样子来理解,是错误的

1 const char *cstr = 0;

声明语句中用到pstring时,其基本数据类型时指针,可是用char*重写了声明语句后,数据类型就变成了char,* 成了声明符的一部分,此时,const char成了基本数据类型

 

auto类型说明符

C++11引入了auto类型说明符,它能让编译器替我们去分析表达式所属的类型

auto让编译器通过初始值来推算变量的类型;auto定义的变量必须具有初始值

1 auto item = val1 + val2;

此处编译器根据val1和val2相加的结果来推断item的类型

使用auto也能在一条语句中声明多个变量,但是该语句中所有变量的初始基本数据类型都必须一样

1 auto i = 0, *p = &i;      // 正确:i是整数,p是整型指针
2 auto sz = 0, pi = 3.14;   // 错误:sz和pi的类型不一样

复合类型、常量和auto(待补充)

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

a)当引用被作为初始值时,编译器以引用的对象的类型作为auto的类型

b)auto一般会忽略顶层const,同时底层const会保留下来

c)如果希望推断出的auto类型是一个顶层const,需要明确指出

d)可以将引用的类型设为auto,此时原来的初始化规则依然适用

 

decltype类型提示符

C++11引入了类型说明符decltype,它的作用是选择并返回操作数的数据类型:编译器分析表达式并得到它的类型,却不实际计算表达式的值

 如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内)

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

decltype和引用(待补充)

 

posted @ 2020-02-20 23:25  缘木  阅读(145)  评论(0)    收藏  举报