我们为什么需要类型别名?
C++中任何一个基本概念的出现的都是为了解决相应的问题,类型别名也不例外。类型别名为了简化程序中复杂类型名的书写,同时类型别名还可以提供给变量便于理解和记忆的名字。
类型别名的定义方法
1. 传统的typedef关键字
typedef double wages; //wages和double是同义词
typedef wages base,*p; //base是double的同义词,p是double*的同义词
为什么举了这样两个例子呢?其实这两个例子表示的不同的方面,第一例子描述的是基本类型,第二个例子描述的是复合类型(指针)。
2.C++11使用别名声明
using SI=Sales; //SI是类Sales的别名
很明显,新标准类型别名的声明更容易理解和记忆。
如何理解类型别名的声明
typedef char *pstring;
const pstring cstr=0; //cstr是一个指向char的常量指针
const pstring *ps; //ps是一个指针,它的对象是指向char的常量指针
上述两条声明中基本的数据类型都是const pstring,const是修饰pstring的,pstring实际上是指向char的指针(pointer to char),因此const pstring是指向char的常量指针(const pointer)。
特别需要指出的是,把类型别名替换为他本来的形式实际上是一种错误的理解。例如,对于上面的例子,如果理解成下面的形式:
const char *cstr=0;//cstr是一个pointer to const char
这是对别名的一种错误的理解,这是因为在原来的例子中基本的数据类型为pointer to char,重写之后的基本类型变为const char,*变为修饰符。因此,修改后语句的含义是cstr是一个指向const char的指针,而原来语句的含义是指向char的常量指针。
那么通过上面的例子,我们来总结以下如何理解类型别名的声明的关键是什么。简单声明理解简单,我们就不再赘述。对于含有别名的复合类型的声明,关键是将别名作为整体去看待,然后找出声明中的基本类型,例如
const pstring ctr=0;
修改之前的基本类型是const pstring。
const char * ctr=0;
修改之后的类型别名的基本类型是const char。