处理类型:类型别名

类型别名是一个名字,它是某种类型的同义词。

有两种方法可用于定义类型别名,传统的方法是使用关键词typedef:

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

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

和以前的声明符一样,这里的声明符也包含类型修饰,从而也能由基本的数据类型构造出复合类型来。

新标准定义了一种新的方法,使用别名声明来定义类型的别名:

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

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

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

wages hourly, weekly;//等价于double hourly, weekly;
SI item;//等价于 Sales_item item;

指针、常量和类型别名

如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句可能产生意想不到的后果:

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

pstring实际上是指向char的指针,const pstring就是指向char的常量指针,而非指向常量字符的指针。

遇到一条使用了类型别名的声明语句时,人们往往会错误地尝试把类型别名替换成它本来地样子,以理解该语句地含义

const char *cstr = 0;//是对const pstring cstr的错误理解

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

这样改写的结果是,const char成为了基本数据类型。

前者声明了一个指向char的常量指针,后者的形式则声明了一个指向const char的指针。

猜你喜欢

转载自www.cnblogs.com/suomeimei/p/10620379.html
今日推荐