类型转换操作符
C++通过引进四个新的类型转换操作符克服了 C 风格类型转换的缺点,这四个操作符是:
- static_cast
- const_cast
- dynamic_cast
- reinterpret_cast
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a=5;
//c风格类型转换
double result = (double)(a)/2.0;
cout<<result<<endl;
//C++风格的类型转换
double result2 = static_cast<double>(a)/2.0;
cout<<result2<<endl;
return 0;
}
使用C++风格的类型转换避免了很多不必要的麻烦。
- 如不能用 static_cast 象用 C 风格的类型转换一样把 struct 转换成 int 类型或者把 double 类型转换成指针类型,另外,static_cast 不能从表达式中去除 const 属性(改用const_cast)
dynamic_cast
- 它被用于安全地沿着类的继承关系向下进行类型转换
- dynamic_cast 把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)
reinterpret_cast
- 操作符的类型转换,其 的 转 换 结 果 几 乎 都 是 执 行 期 定 义
- 主要用在函数指针类型之间进行转换
typedef void (*FuncPtr)(); // FuncPtr is 一个指向函数
// 的指针,该函数没有参数
// 返回值类型为 void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳
// 10 个 FuncPtrs 指针的数组
int doSomething();//假设有一个叫doSomething的函数需要放进funcPtrArray数组
funcPtrArray[0] = &doSomething; // 错误!类型不匹配
//reinterpret_cast 可以让你迫使编译器以你的方法去看待它们:
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);// this compiles
此方法的代码是不可移植的,C++不保证所有的函数指针都被用一样的方法表
示