【c++转型操作符】
goto语句一直被视为程序设计上的“贱民”,低阶转型动作它有的一拼,虽然它任然能够苟延残喘,不过,旧式的C转型方式并非是唯一选择。
旧式转型的语法结构:
由一对小括号加上一个对象名称(标识符)组成,而小括号和对象名称在C++的任何地方都能够被使用,因此,我们简直无法回答最基本的转型相关问题“这个程序张有使用过任何转型动作吗?”
<span style="font-size:18px;">(type)expression</span>
因此,C++中导入了4个新的转型操作符(cast operators):static_cast , const_cast , dynamic_cast 和reinterpret_cast。 对于大部分使用目的而言,你只要掌握使用方法就好。
换成C++方式,上面的代码就要改成:
static_cast<type>(expression)
举个例子,假设你想要将一个int转型成为一个double,以强迫一个整数表达式导出一个浮点数值来。采用C旧式转型,可以这么做:
int firstNumber,secondNumber; ... double result = ((double)firstNumber)/secondNumber;
采用新的C++转型法,应该这么写:
double result = static_cast<double>(firstNumber)/secondNumber;
这种形式十分容易被辨识出来,不论是对人类还是对工具程序而言。
1、static_cast 基本上拥有与C旧式转型相同的威力,以及相同的限制。例如,你不能够利用static_cast将一个struct转型为int,或将一个double 转型为pointer ;这些就是C旧式转型动作原本就不可以完成的任务。static_cast 甚至不能够移除表达式的常量性(constness),这是因为有一个新的转型操作符const_cast 专司其职。
2、const_cast 用来改变表达式中的常量性(constness)或者变易性(volatileness),使用const_cast 是对编译器的强调,通过这个转型操作符,你唯一打算改变的是某物的常量性或变易性。这项意愿有编译器贯彻执行。
注意:如果你将const_cast 用于上述以外的用途,那么转型动作会被拒绝。
例如:
#include <iostream> #include <string> using namespace std; class Widget {...} class SpecialWidget:public Widget{...}; void update(SpecialWidget *psw); SpecialWidget sw; //sw 是一个non-常对象 const SpecialWidget& csw = sw; //csw 却是一个代表sw的reference,并且是一个const 对象 update(&csw); //错误!不能将const SpecialWidget* 传给需要 SpecialWidget*的函数 update(const_cast<SpecialWidget*>(&csw)); //可以,&csw的常量性被去除了,也正因为如此,csw(也是sw)在此函数中可以被改变 update((SpecialWidget*)&csw); //c旧式转型方式,可以实现操作,但是 Widget *pw = new SpecialWidget; update(pw); //错误!,pw是Widget*但是update()需要的确实SpecialWidget*类型。 update(const_cast<SpecialWidget*>(pw)); //错误!cons_cast 只能用来改变常量性和变易性,对于继承体系的向下转型(cast down)动作无法操作。