c++中四种_cast类型转换的作用的简述
优点
使用四种变幻方便在转换出现错误的时候检查错误,比如说,我只查询_cast关键字就能得到左右的类型转化位置。
同时,四种变还也能保证变幻的安全性。
简述
- static_cast
static_cast
不能用于不同类型的指针、不同类型的引用、整形和指针之间的转换,可以用于整形、浮点形、字符之间的相互转换。基本上就是用于静态类型的转换(没有虚函数,不是多态类) const_cast
主要用于将const常量属性去掉和增加const属性
使用方法:
type expr = const_cast<type>(expression)
// type只有三种选择: reference(引用), pointer-to-object(指向对象指针), pointer-to-data-member(指向数据的指针)
在四种强制转换中,只有他能脱掉或加上const属性,脱掉const属性时其他的方法会报错(如果你使用(type)这种形式的强制转换为指针或者引用,其实也能将const去掉
),但是加上const属性时,这四种方法都可以
例如:
#include<iostream>
using namespace std;
class Base
{
public:
virtual void f1(){}
};
class Child : public Base
{
public:
virtual void f1(){}
};
int main()
{
//去掉const
const Base s;
Base& p = const_cast<Base &>(s); // 不包错
Base& p = reinterpret_cast<Base &>(s); //报错
Base& p = dynamic_cast<Base &>(s); //报错
Base& p = (Base &)(s); //不报错
// 添加const
Base bb;
// const Base &p = (const Base &)bb; //成功
// const Base &p = const_cast<const Base &>(bb);//成功
// const Base &p = dynamic_cast<const Base &>(bb); //成功
// const Base &p = reinterpret_cast<const Base &>(bb); //成功
// const Base &p = static_cast<const Base &>(bb); //成功
return 0;
}
- reinterpret_cast
用于不同类型指针之间、不同类型引用之间、整数和指针之间的转换,这种转换是逐bit的进行转换,转换的过程其实是可能会引发一些错误,在转换的过程中,程序是不会提示的。
比如将基类指针转化为派生类指针,实际上就会产生错误、再或者没有多态的基类和派生类在派生类转换为基类的时候,其调用的函数都会是基类的函数,这回产生一些逻辑错误,这种错误实际上可以通dynamic_cast来进行避免。 - dynamic_cast
可以对进行转化的指针、引用进行检查,如果出现错误的话,其返回的指针就会为空!在基类中没有实现多态的话,那么转化的过程中会直接编译不通过。所以dynamic_cast用于实现了多态的类
#include<iostream>
using namespace std;
class Base
{
public:
int xx ;
Base(){
this->xx = 10;
}
virtual void f1(){}
};
class Child : public Base
{
public:
virtual void f1(){}
};
int main()
{
Base * pb;
Child * pc;
Base b;
Child c;
// dynamic_cast<>
// pb = reinterpret_cast<Base *>(&c);
pb = dynamic_cast<Base *>(&c);
if(pb == NULL)cout<<"派生类转化为基类错误"<<endl;
// pc = reinterpret_cast<Child *>(&b);
pc = dynamic_cast<Child *>(&b);
if(pc == NULL)cout<<"基类转化为派生类出现错误"<<endl; //基类转化派生类是一种不安全的行为
return 0;
}
参考自:
6. const_cast - 胖子许木木的文章 - 知乎
7. (C++ 成长记录) —— C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast) - 赵萱婷的文章 - 知乎