C++四种强制类型转换关键字

C++四种强制类型转换关键字有:

static_cast   编译时
dynamic_cast  运行时
const_cast    编译时
reinterpret_cast  编译时

在早期的C++语言中,显式的进行强制类型转换包含两种形式:

type(expr);  //函数形式的强制类型转换
(type)expr;  //C语言风格的强制类型转换

根据所涉及的类型不同,旧式的强制类型转换分别具有与const_cast、static_cast和reinterpret_cast相似的行为。
新式的强制类型转换更加清晰明了,一旦转换过程出现问题,便于追踪。

static_cast
任何具有明确定义的类型,只要不包含底层const,都可以使用。
主要用于基本类型之间和具有继承关系的类型之间的转换。

//基本类型转换
int i = 0;
double d = static_cast<double>(i);  //相当于double d = double(i);
//转换继承类的对象为基类对象
class Base{};
class Derived: public Base{};
Derived d;
Base b = static_cast(d);  //相当于Base(d)

const_cast
一种涉及const的强制类型转换。将底层const对象转换为对应的非常量类型,或者执行相反的操作。注意此转换只改变const(常量)属性,不改变类型

const int *pci = 0;
//将常量转换为非常量
int *pk = const_cast<int*>(pci);  //相当于int *pk = int*(pci);
const A* pca = new A;
A *pa = const_cast(pca); //相当于A *pa = A*(pca);

出于安全性考虑,const_cast无法将非指针常量转换为普通变量。

dynamic_cast
1.只能在类继承对象的指针或引用之间进行类型转换,和继承及运行时类型识别一起使用。
2.没有继承关系,但被转换类有虚函数。 否则,其他操作不能通过编译。

此转换是在运行时进行转换分析的,并非在编译时进行,与static_cast相对,是动态转换,区别于其他三种类型转换操作。

进行转换时,会根据当前运行时类型信息,判断类型对象之间的转换是否合法。dynamic_cast的指针转换失效,可通过是否为NULL检测,引用转换则抛出一个bad_cast异常。

class Base{};
class Derived: public Base{};
//派生类指针转换为基类指针
Derived *pd = new Derived;
Base *pb = dynamic_cast(pd);
//检测
if(!pb){
  std::cout << "Failed Cast!";
}
//没有继承关系,但被转换类有虚函数
class A{
    virtual ~A();
};
class B{};
A *pa = new A;
B *pb = dynamic_cast(pa);

reinterpret_cast
把运算对象的内容重新解释为另外一种类型,这种强制类型转换本质上依赖于机器而且非常危险。不能用于非指针类型的转换。

//基本类型指针的类型转换
double d = 9.2;
double *pd = &d;
int *pi = reinterpret_cast<int*>(pd); //相当于int *pi = (int*)pd;
//不相关的类的指针类型转换
class A{};
class B{};
A *pa = new A;
B *pb = reinterpret_cast(pa); //相当于B *pb = (B*)pa;
//指针转换为整数
int *pi = 0;
long L = reinterpret_cast<long>(pi);  //相当于long L = (long)pi;

强制类型转换干扰了正常的类型检查,在C++primer中建议程序员慎用。每次书写了一条强制类型转换语句,都应该反复斟酌能否以其他方式实现相同的目标。

你可能感兴趣的:(C++基础)