前言
随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性有两方面:
(1)一些类型难以“拼写”,它们的名字既难记住用容易出错,还无法明确体现其真实目的和含义;
(2)有时候根本搞不清楚到底需要什么类型,程序员不得不回头从程序的上下文寻求帮助。
这里主要针对(1)来分析。
类型别名(type alias)是一个名字,它是某种类型的同义词。可以是复杂的名字更简单、易懂,也让使用者知道该类型的使用目的。
有两种方法可以定义类型别名。传统的方法是使用关键字typedef。
typedef
typedef double wages; //wages是double的同义词
typedef wages base, *p; //base是double的同义词,p是double*的同义词
注意上面都是语句,结尾有分号。
typedef还有个常用的地方就是函数指针
1 #include<iostream>
2
3 typedef int (*pFun)();
4
5 int display()
6 {
7 std::cout << "function pointer!" << std::endl;
8 return 0;
9 }
10
11 int main()
12 {
13 pFun p = display;
14 (*p)();
15 return 0;
16 }
using
C++11规定了一种新的方法,使用别名声明来定义类型的别名:
using SI = Sales; //Sales是一个类,SI是Sales的同义词
(注意,using还有很多别的用法)
指针、常量和类型别名
如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。
例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名:
typedef char *pstring;
const pstring cstr = 0; //cstr是一个指向char的常量指针
const pstring *ps; //ps是一个这指针,它的对象是指向char的常量指针
上述的两条声明语句的基本类型都是const pstring,和过去一样,const是对给定类型的修饰。pstring实际上是指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常量字符的指针。
通常,我们理解上述声明语句时,会错误尝试把类型别名替换成它本来的样子,以理解该语句的含义:
const char *cstr = 0; //是对const pstring cstr的错误理解
强调:声明语句中用到pstring时,其基本类型就是指针。可是用char*重写了声明语句后,数据类型就变成了char, 而 * 成为了声明符的一部分。这样改写的结果是,const char成为了基本类型。这两者的含义完全不一样。