作业帮 > 综合 > 作业

C++中static_cast和reinterpret_cast的区别?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/01 04:07:13
C++中static_cast和reinterpret_cast的区别?
请说的清楚一点,不要copy的啊!
static_cast(expression)

例如,假设你想把一个int转换成double,以便让包含int类型变量的表达式产生出浮点数值的结果.如果用C风格的类型转换,你能这样写:

int firstNumber, secondNumber;
...
double result = ((double)firstNumber)/secondNumber;

如果用上述新的类型转换方法,你应该这样写:

double result = static_cast(firstNumber)/secondNumber;

这样的类型转换不论是对人工还是对程序都很容易识别.

static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样.它也有功能上限制.例如,你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指针类型.

关于reinterpret_cast,使用这个操作符的类型转换,其的转换结果几乎都是执行期定义(implementation-defined).因此,使用reinterpret_casts的代码很难移植.

reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换.例如,假设你有一个函数指针数组:

typedef void (*FuncPtr)(); // FuncPtr is 一个指向函数
// 的指针,该函数没有参数
// 返回值类型为void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳
// 10个FuncPtrs指针的数组

让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组:

int doSomething();

你不能不经过类型转换而直接去做,因为doSomething函数对于funcPtrArray数组来说有一个错误的类型.在FuncPtrArray数组里的函数返回值是void类型,而doSomething函数返回值是int类型.

funcPtrArray[0] = &doSomething; // 错误!类型不匹配
reinterpret_cast可以让你迫使编译器以你的方法去看待它们:
funcPtrArray[0] = // this compiles
reinterpret_cast(&doSomething);

转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表示),在一些情况下这样的转换会产生不正确的结果