C语言类型转换直接(Type)方式进行转换,该类转换时, 代码的阅读性不高,不做安全性检查,const类型可以转非const,父类可以转为子类,转换时存在一定隐患。为此C++引入了四类类型转换运算符,分别如下:
1. dynamic_cast
原型:dynamic_cast < type-id > ( expression )
用于多态类型间的转换,转换时做运行期类型检查,转换时相对安全的,但是仅用于指针类型和引用类型。
MSDN路径:https://docs.microsoft.com/en-us/cpp/cpp/dynamic-cast-operator?view=msvc-160
2. static_cast
原型:static_cast <type-id> ( expression )
仅根据表达式中存在的类型,将表达式转换为类型id的类型。用于非多态性类型的转换。 一般用于数字类型之间的转换;
或者有集成关系的指针类型间的转换。
此种类型转换不做运行时类型检查。dynamic_cast做检查;
其不能转换含有const, volatile, or __unaligned 属性的变量
MSDN路径:https://docs.microsoft.com/en-us/cpp/cpp/dynamic-cast-operator?view=msvc-160
转换举例1:
class B {};
class D : public B {};
void f(B* pb, D* pd) {
D* pd2 = static_cast<D*>(pb); // Not safe, D can have fields
// and methods that are not in B.
B* pb2 = static_cast<B*>(pd); // Safe conversion, D always
// contains all of B.
}
转换举例2:
class B {
public:
virtual void Test(){}
};
class D : public B {};
void f(B* pb) {
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
}
说明:如果pb == 0,以上转换返回相同结果为NULL,否则,pd1为NULL,pd2不为NULL
转换举例3:
typedef unsigned char BYTE;
void f() {
char ch;
int i = 65;
float f = 2.5;
double dbl;
ch = static_cast<char>(i); // int to char
dbl = static_cast<double>(f); // float to double
i = static_cast<BYTE>(ch);
}
3. const_cast
用于去掉const、volatile(易失的,易变的)和__unaligned属性。
MSDN路径:https://docs.microsoft.com/en-us/cpp/cpp/const-cast-operator?view=msvc-160
4. reinterpret_cast
用于简单的重新解释比特位,用于相差较大类型之间的转换,例如:将一个字符串转为LPARAM消息参数
reinterpret_cast<LPARAM>(L"类型强转")
MSDN路径:https://docs.microsoft.com/en-us/cpp/cpp/reinterpret-cast-operator?view=msvc-160
关于const_cast和reinterpret_cast:
使用const_cast和reinterpret_cast作为最后的手段,因为这两个转换存在与老式转换相同的危险。然而,为了完全取代旧风格的造型,它们仍然是必要的。