C++类型别名(typedef和using)

前言

随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性有两方面:

(1)一些类型难以“拼写”,它们的名字既难记住用容易出错,还无法明确体现其真实目的和含义;

(2)有时候根本搞不清楚到底需要什么类型,程序员不得不回头从程序的上下文寻求帮助。

这里主要针对(1)来分析。

类型别名(type alias)是一个名字,它是某种类型的同义词。可以是复杂的名字更简单、易懂,也让使用者知道该类型的使用目的。

有两种方法可以定义类型别名。传统的方法是使用关键字typedef。

 

typedef

typedef double wages;         //wages是double的同义词

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

注意上面都是语句,结尾有分号。

 

typedef还有个常用的地方就是函数指针

  1 #include
  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成为了基本类型。这两者的含义完全不一样。

你可能感兴趣的:(C/C++)