C++ 第六章 类型与声明 - 6.5 类型别名

第六章 类型与声明

6.5 类型别名

有时,我们需要为某种类型起个新名字。可能的动机包括:

  • 原来的名字太长、太复杂或者太难看(在某些程序员眼中)。
  • 某项程序设计技术要求在同一段上下文中,不同类型有相同的名字。
  • 在某处提及某种类型仅仅是为了便于后期维护。

例如:

using Pchar = char*;		//字符串指针
using PF = int(*)(double);	//函数指针。该函数接受一个double且返回一个int

相似类型可以定义同一个名字作为成员别名:

template<class T>
class vector{
	using value_type = T;	//每个容器都有一个value_type
	//...
};

template<class T>
class list{
	using value_type = T;	//每个容器都有一个value_type
	//...
};

无论如何,类型别名绝不代表一种新类型,它只是某种已有类型的同义词。换句话说,别名就是类型的另外一个名字而已。例如:

Pchar p1 = nullptr;			//p1的类型是char*
char* p3 = p1;				//正确

如果你想实现一种新类型,并且它的语义和表达形式与某种已有类型一致,应该使用枚举(见8.4节)或者类(第16章)。

早期还有一种语法也可以用在类似的语境中,我们使用typedef关键字,然后把要生命的类型别名放在一般声明语句中变量所在的位置上。例如:

typedef int int32_t;			//等价于“using int32_t = int;”
typedef short int16_t;			//等价于“using int16_t = short;”
typedef void(*PtoF)(int);		//等价于“using PtoF = void(*)(int);”

使用别名有助于我们把代码与机器细节分离开来。名字int32_t明确指出我们想用它表示占32个二进制位的整数。与“普通的int”相比,使用int32_t可以让我们把代码平滑地移植到一台sizeof(int)==2的机器上。我们要做的只是修改一处int32_t的定义令其表示一个尺寸更大的整数类型即可:

using int32_t = long;

后缀_t通常用来表示类型别名(源自typedef关键字)。int16_t、int32_t以及其他一些类型别名都定义在 < cstdint >中(见43.7节)。类型的别名应该尽可能反映出该类型的目的和作用,而不是类型的实现细节(见6.3.3节)。

using关键字可用于引入一个template别名(见23.6节),例如:

template<typename T>
	using Vector = std::vector<T, My_allocator<T>>;

不允许在类型别名前加修饰符(如unsigned),例如:

using Char = char;
using Uchar = unsigned Char;		//错误
using Uchar = unsigned char;		//OK
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hank_W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值