C++ 类型转换
用类型名做强制类型转换运算符的做法,其实是C语言的老式做法,C++为了保持兼容而予以保留。在C++中,引入了4中功能不同的强制类型转换运算符以进行强制类型转换:static_cast,reinterpret_cast,const_cast,dynamic_cast。
强制类型转换是有一定风险的,有的转换并不一定安全。例如,把整数类型转换成指针,把基类转换成派生指针,把一种函数指针转换成另一种函数指针,把常量指针转换为非常量指针等,都是存在安全隐患的。C++引入新的强制类型转换,主要是为了克服C语言式的强制类型转换的3个缺点:
- 没有从形式上体现出不同类型转换的功能和风险的不同。例如,将int强制转换为double是没风险的,将常量指针转换为非常量指针、把基类指针转换为派生类指针都是高风险的,而且后两者带来的风险不同,C语言的强制类型转换形式对这些不同并不加以区分。
- 将多态基类指针转换成派生类指针时,不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象。
- 难以在程序中寻找到底什么地方进行了强制类型转换。强制类型转换是引发程序运行时错误的一个原因,因此程序出错时,可能就会想查一下是不是有哪些强制类型转换出了问题。如果采用C语言的老式做法,要在程序中找出所有进行了强制类型转换的地方,显然是很麻烦的,因为这些转换没有统一的格式。而用C++的方式,则只需要查找
_cast字符串就够了。甚至可以根据错误的类型,有针对性地专门查找某一种强制类型转换。
C++强制类型转换运算符的用法:
|
|
static_cast
static_cast 用来进行比较自然和低风险的转换,如整型和实数型、字符型之间的互相转换。另外,如果对象所属的类重载了强制类型转换运算符T(如T是int,int* 或者别的什么类型名),那么static_cast也能用来进行对象到T类型的转换。
static_cast 不同用来在不同类型的指针之间互相转换(基类指针和派生类指针之间转换可以用到它),也不能用于整型和指针之间的互相转换,当然也不能用于不同类型的引用之间的转换。因为这些转换属于风险比较高的。
|
|
reinterpret_cast
reinterpret_cast 用来进行各种不同类型的指针之间的转换、不同类型的引用之间的转换,以及指针和能容纳得下指针的整数类型之间的转换。转换的时候,执行的是逐个比特复制的操作。这种转换提供了很强的灵活性,但转换的安全性只能由程序员自己的细心来保证了。
|
|
const_cast
此运算符仅仅用来进行去除const属性的转换,它也是4个强制类型转换运算符中唯一一个能够去除const属性的。它用于将const引用转换为同类型的非const引用,将const指针转换成同类型的非const指针。
|
|
dynamic_cast
用reinterpret_cast可以将多态基类(包含虚函数的基类)的指针强制转换为派生类的指针,但是这种转换不检查安全性,即不检查转换后的指针是否确实指向一个派生类对象。dynamic_cast专门用于将多态基类的指针或引用强制转换为派生类的指针或引用,而且能够检查转换的安全性。对于不安全的指针转换,转换结果返回NULL指针。
dynamic_cast是通过 运行时类型检查来保证安全性的。dynamic_cast不能用于将来非多态基类的指针或引用强制转换为派生类的指针或引用,这种转换没法保证安全性,只好用reinterpret_cast来完成。
|
|
运行时类型检查
C++运算符 typeid是单目运算符,可以在程序运行过程中获取一个表达式的值的类型。typeid运算的返回值是一个 type_info类的对象,里面包含了类型的信息。type_info类是在头文件 typeinfo中定义的,一个type_info对象可以代表一种类型,它有成员函数 const char* name const,可以返回type_info对象所代表的类的名字。
两个type_info对象可以用 ==和 !=进行比较。
|
|
-
No backlinks found.