C++与C强转异同(上)https://developer.aliyun.com/article/1429075
四种强转详解:
C++的类型转换只是语法上的解释,本质上与C风格的类型转换没什么不同,C语言做不到事情的C++也做不到。
语法:
static_cast<目标类型>(表达式); const_cast<目标类型>(表达式); reinterpret_cast<目标类型>(表达式); dynamic_cast<目标类型>(表达式);
一、static_cast
用于内置数据类型之间的转换
除了语法不同,C和C++没有区别。
#include <iostream> using namespace std; int main(int argc, char* argv[]) { int ii = 3; long ll = ii; // 绝对安全,可以隐式转换,不会出现警告。 double dd = 1.23; long ll1 = dd; // 可以隐式转换,但是,会出现可能丢失数据的警告。 long ll2 = (long)dd; // C风格:显式转换,不会出现警告。 long ll3 = static_cast<long>(dd); // C++风格:显式转换,不会出现警告。 cout << "ll1=" << ll1 << ",ll2=" << ll2 << ",ll3=" << ll3 << endl; }
用于指针之间的转换
C风格可以把不同类型的指针进行转换。
C++不可以,需要借助void *。
#include <iostream> using namespace std; void func(void* ptr) { // 其它类型指针 -> void *指针 -> 其它类型指针 double* pp = static_cast<double*>(ptr); } int main(int argc, char* argv[]) { int ii = 10; double* pd1 = ⅈ // 错误,不能隐式转换。 double* pd2 = (double*)ⅈ // C风格,强制转换。 double* pd3 = static_cast<double*>(&ii); // 错误,static_cast不支持不同类型指针的转换。 void* pv = ⅈ // 任何类型的指针都可以隐式转换成void*。 double* pd4 = static_cast<double*>(pv); // static_cast可以把void *转换成其它类型的指针。 func(&ii);
二、const_cast
static_cast不能丢掉指针(引用)的const和volitale属性,const_cast可以。
示例:
#include <iostream> using namespace std; int main(int argc, char* argv[]) { int num = 4; const int* aa = # int* bb = (int*)aa; // C风格,强制转换,丢掉const限定符。 int* cc = const_cast<int*>(aa); // C++风格,强制转换,丢掉const限定符。 *bb = 6; cout << *bb << endl; cout << *cc << endl; }
输出:
6 6
三、reinterpret_cast
static_cast不能用于转换不同类型的指针(引用)(不考虑有继承关系的情况),reinterpret_cast可以。
reinterpret_cast的意思是重新解释,能够将一种对象类型转换为另一种,不管它们是否有关系。
语法:reinterpret_cast<目标类型>(表达式);
<目标类型>和(表达式)中必须有一个是指针(引用)类型。
reinterpret_cast不能丢掉(表达式)的const或volitale属性。
应用场景:
reinterpret_cast的第一种用途是改变指针(引用)的类型。
reinterpret_cast的第二种用途是将指针(引用)转换成整型变量。整型与指针占用的字节数必须一致,否则会出现警告,转换可能损失精度。
reinterpret_cast的第三种用途是将一个整型变量转换成指针(引用)。
示例:
#include <iostream> using namespace std; void func(void* ptr) { long long ii = reinterpret_cast<long long>(ptr); cout << "ii=" << ii << endl; } int main(int argc, char* argv[]) { long long ii = 10; func(reinterpret_cast<void *>(ii)); }
输出:
4 4