条款2:最好使用C++转型操作符

来源:互联网 发布:ubuntu镜像下载地址 编辑:程序博客网 时间:2024/06/04 00:29

**
印象笔记:
为解决C旧式转型的缺点,C++导入4个新的转型操作符(cast operators):static_cast, const_cast, dynamic_castreinterpret_cast
**

对大部分使用目的而言,面对这些操作符你唯一需要知道的便是,过去习惯的写码形式:

(type) expression

现在应该改为这样:

static_cast<type>(expression) 

举个例子,假设将一个int转型为一个double,以强迫一个整数表达式导出一个浮点数值来。可以这么做:

int firstNumber, secondNumber;double result=static_cast<double>(firstNumber)/secondNumber;

const_cast用来改变表达式中的常量性或变易性。使用const_cast便是对人类(以及编译器)强调,通过这个转型操作符,你唯一打算改变的是某物的常量性或变易性。这项意愿将由编译器贯彻执行。
const_cast最常见的用途就是将某个对象的常量性去除掉。

dynamic_cast,用来执行继承体系中“安全的向下转型或跨系转型动作”。也就是说可以利用dynamic_cast,将“指向base
class objects的pointers或references”转型为“指向derived或sibling base)class objects的pointers或references”,并得知转型是否成功。如果转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是reference)表现出来。

注:dynamic_cast只能用来协助巡航于继承体系中。它无法应用在缺乏虚函数的类型身上,也不能改变类型的常量性。

如果你想为一个不涉及继承机制的类型执行转型动作,可使用static_cast;要改变常量性,则必须使用const_cast。

最后一个转型操作符是reinterpret_cast,最常用的用途是转换“函数指针”类型。
假设有一个数组,存储的都是函数指针,有特定的类型:

typedef void (*FuncPtr)();  //FuncPtr是个指针,指向某个函数                            //这个函数无需任何自变量,返回值为voidFuncPtr funcPtrArray[10];   //funcPtrArray是个数组,内有10个                    FuncPtrs

但由于某种原因,你希望将以下函数的一个指针放进funcPtrArray中:

int doSomething();

如果没有转型,不可能办到这一点。因为doSomething的类型int与funcPtrArray所能接受的void类型不同。

funcPtrArray[0]=&doSomething;   //错误

使用reinterpret_cast,可以强迫编译器了解你的意图。

funcPtrArray[0]=reinterpret_cast<FuncPtr>(&doSomething);

使用新式转型法,比较容易被解析,编译器也因此得到诊断转型错误(旧式转型法侦测不到)。这些都是促使我们舍弃旧式转型语法的重要原因,而且让转型动作既丑陋又不易键入,或许未尝不是件好事。

0 0