C++类型别名
2016-04-05 16:08
393 查看
1、类型别名定义
类型别名(type alias)是一个名字,它是某种类型的同义词。使用类型别名有很多好处,它让复杂的类型名字变得简单明了、易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的。有两种方法可用于定义类型别名。
(1)传统的方法是使用关键字typedef:
含有typedef的声明语句定义的不再是变量而是类型别名。
(2)用关键字using作为别名声明的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。
类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名。
2、指针、常量和类型别名
如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名:
上述两条声明语句的基本数据类型都是const pstring,和过去一样,const是对给定类型的修饰。pstring实际上是指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常量字符的指针。遇到一条使用了类型别名的声明语句时,人们往往会错误地尝试把类型别名替换成它本来的样子,以理解该语句的含义:
这种理解是错误的。声明语句中用到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)
使用
4、模板的别名
在标准 C++,typedef 可定义模板类型一个新的类型名称,但是不能够使用 typedef 来定义模板的别名。举例来说:
这不能够通过编译。为了定义模板的别名,C++11 将会增加以下的语法:
using 也能在 C++11 中定义一般类型的别名,等同 typedef:
参考资料:
《C++ Primer中文版(第5版)》
C++11 理解 (十五) 之 模板的别名
类型别名(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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性