详解C++中的四种强制转换reinterpret_cast / const_cast / static_cast / dynamic_cast
目录
1.reinterpret_cast
2.const_cast
3.static_cast
4.dynamic_cast
例子
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_castint *p = &n;//以下两者效果相同char *c = reinterpret_cast<char*> (p); char *c2 = (char*)(p);cout << "reinterpret_cast输出:"<< *c2 << endl;//const_castconst 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_castSon* 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_castSon* 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;elsecout << s4->d << endl;return 0;
}//输出结果
// reinterpret_cast输出:a
// const_cast输出:100
// static_cast输出:
// 2
// 0
// dynamic_cast输出:
// 2
// s4指针为nullptr
由结果可知,dynamic_cast下行转换是安全的,如果下行转换不安全,会返回空指针。