目录
C++中存在四种强制转换:reinterpret_cast / const_cast / static_cast / dynamic_cast
1.reinterpret_cast
格式 : reinterpret_cast<type_id> (expression)
用于类型之间强制转换。
type_id 必须是指针、引用、函数指针、成员指针或者算术类型(int,float,char,bool等)。
2.const_cast
格式:const_cast<type_id> (expression)
用于修改类型的const或者volatile属性。除此之外,type_id和expression的类型必须一致。
3.static_cast
格式:static_cast<type_id> (expression)
用于将expression类型转换成type_id类型。但是运行时没有类型检查保证转换的安全性。
比如:
上行转换(子类转换成父类)是安全的;
下行转换(父类转换成子类)是不安全的。
注意:static_cast不能转换掉expression的const、volatile、_unaligned属性。
4.dynamic_cast
格式:dynamic_cast<type_id> (expression)
进行下行转换是安全的,进行上行转换是不安全的。用于将expression的类型转换成type_id类型,并且type_id必须是类的指针、类的引用、或者void*,如果type_id是类的指针,那么expression必须也是类的指针;如果type_id是类的引用,那么expression也必须是类的引用。
例子
#include <bits/stdc++.h>
using namespace std;
class Base
{
public:
Base() :b(1) {}
virtual void fun() {};
int b;
};
class Son : public Base
{
public:
Son() :d(2) {}
int d;
};
int main()
{
int n = 97;
//reinterpret_cast
int *p = &n;
//以下两者效果相同
char *c = reinterpret_cast<char*> (p);
char *c2 = (char*)(p);
cout << "reinterpret_cast输出:"<< *c2 << endl;
//const_cast
const int *p2 = &n;
int *p3 = const_cast<int*>(p2);
*p3 = 100;
cout << "const_cast输出:" << *p3 << endl;
Base* b1 = new Son;
Base* b2 = new Base;
//static_cast
Son* s1 = static_cast<Son*>(b1); //同类型转换
Son* s2 = static_cast<Son*>(b2); //下行转换,不安全
cout << "static_cast输出:"<< endl;
cout << s1->d << endl;
cout << s2->d << endl; //下行转换,原先父对象没有d成员,输出垃圾值
//dynamic_cast
Son* s3 = dynamic_cast<Son*>(b1); //同类型转换
Son* s4 = dynamic_cast<Son*>(b2); //下行转换,安全
cout << "dynamic_cast输出:" << endl;
cout << s3->d << endl;
if(s4 == nullptr)
cout << "s4指针为nullptr" << endl;
else
cout << s4->d << endl;
return 0;
}
//输出结果
// reinterpret_cast输出:a
// const_cast输出:100
// static_cast输出:
// 2
// 0
// dynamic_cast输出:
// 2
// s4指针为nullptr
由结果可知,dynamic_cast下行转换是安全的,如果下行转换不安全,会返回空指针。