c++类型别名

1、类型别名定义
类型别名(type alias)是一个名字,它是某种类型的同义词。使用类型别名有很多好处,它让复杂的类型名字变得简单明了、易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的。有两种方法可用于定义类型别名。
(1)传统的方法是使用关键字typedef:

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

含有typedef的声明语句定义的不再是变量而是类型别名。
(2)用关键字using作为别名声明的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。
类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名。
2、指针、常量和类型别名
如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。例如下面的声明语句用到了类型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成了基本数据类型。前后两种声明含义截然不同,前者声明了一个指向char的常量指针,改写后的形式则声明了一个指向const char的指针。
3、函数指针别名
(1)给函数指针bool (*comp)(const Sales_item&,const Sales_item&)起个别名为comp,也就是这样以后comp和bool (*comp)(const Sales_item&,const Sales_item&)等价。这条语句的作用是定义了一个新的函数指针类型comp,这种类型的变量将会指向一个返回值为bool类型的并且接受两个const Sales_item&类型的量作为参数的函数。
comp pa;//等价于bool (*pa)(const Sales_item&,const Sales_item&);
因为函数指针的定义和平常的数据类型看起来有些特殊,所以typedef函数指针的时候看起来也有点不同,但本质是一样的。
(2)typedef void(HANDLER)(char)
使用HANDLER myhandler; 相当于void(myhandler)(char);
4、模板的别名
在标准 C++,typedef 可定义模板类型一个新的类型名称,但是不能够使用 typedef 来定义模板的别名。举例来说:

template< typename first, typename second, int third>
class SomeType;

template< typename second>
typedef SomeType5> TypedefName; // 在C++是不合法的

这不能够通过编译。为了定义模板的别名,C++11 将会增加以下的语法:

template< typename first, typename second, int third>
class SomeType;

template< typename second>
using TypedefName = SomeTypesecond, 5>;

using 也能在 C++11 中定义一般类型的别名,等同 typedef:

typedef void (*PFD)(double);            // 传统语法
using PFD = void (*)(double);           // 新增语法

你可能感兴趣的:(c++查漏补缺)