C++的四种转型操作
1.C语言的旧式转型操作
旧式转型的语法结构是由一对小括号加上一个对象名称组成
(type) expression
缺点在于:
- 几乎允许将不论什么类型转换为不论什么其它类型,有其自身的缺陷,不能精确的指明转型的意图;
- 旧式转型难以辨识,而这种语法结构在C++的任何地方都有可能使用,这就无法很直观地判断出是否是转型操作。
为解决C旧式转型的缺点,C++导入了4个新的转型操作符:static_cast、const_cast、dynamic_cast、reinterpret_cast。
下面分别介绍:
- static_cast: 基本与拥有与C旧式转型相同的威力与意义,以及相同的限制。
int a=10 ,b=15;
double c = double(a) / b;//旧式的转型操作
double d = static_cast<double>(a) / b;//新式的转型操作
- const_cast: 用来改变表达式中的常量性(constness)或易变性(volatileness)
int a;
const int* pa = &a;
int* pa1 = pa;//error:cannot convert from 'const int*' to 'int*'
int* pa2 = (int*)pa;//旧式的转型操作
int* pa3 = const_cast<int*>(pa);
- dynamic_cast: 运用于继承体系中“安全的向下转型或跨系转型动作”。
你能够利用dynamic_cast。将”指向base class objects的pointers或references“转型为”指向derived(或sibling base)class objects的pointers或references“,并得知转型是否成功。
假设转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是reference)表现出来。
class Cbase{};
class Dbase:public Cbase {};
Dbase db;
Dbase* pdb=&db;
Cbase* pcb=dynamic_cast<Dbase*>(pdb);
Cbase& rcb=dynamic_cast<Dbase&>(db);
- reinterpret_cast: 最常用的用途是转换"函数指针"类型,实际结果取决于编译器。
typedef void(*funcPtr)(void);//funcPtr是一个指向返回值为空参数为空类型的函数指针
int iFunc(){ return 0; }//iFunc是一个返回值为整数参数为空的函数
void func(funcPtr f){}//func是一个返回值为空参数为funcPtr函数指针的函数
int main ()
{
func(iFunc);//error!iFunc的类型不是funcPtr
func(reinterpret_cast<funcPtr>(iFunc));//用reinterpret_cast转换符将一个返回值为整数参数为空的
//函数指针类型转换为一个指向返回值为空参数为空类型的函数指针
}
参考网站
C++转型操作符 https://www.cnblogs.com/einyboy/p/3181299.html
C++中的四种转型操作符 https://www.cnblogs.com/mengfanrong/p/5241696.html