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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值