您的位置:首页 > 编程语言 > C语言/C++

C++类型别名

2016-04-05 16:08 393 查看
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 SomeType<OtherType, second, 5> TypedefName; // 在C++是不合法的


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

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

template< typename second>
using TypedefName = SomeType<OtherType, second, 5>;


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

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


参考资料:

《C++ Primer中文版(第5版)》

C++11 理解 (十五) 之 模板的别名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++