c++有四种类型转换的方式
const_cast
用于去掉const,volatile和_unaligned属性
说到了const 在这里提一下
const
简单理解:const的目的就是定义一个“不会被修改的常量”,可以修饰变量,指针,引用,函数参数等等
使用const可以减少代码出错的概率,
int main() {
struct T {
int i= -1;
};
const T a;
//a.i = 100;
T& b = const_cast<T&>(a);
b.i = 100;
cout << a.i << endl;
return 0;
}
我们把上述代码放入编译器内 会发现 **a.i=100;**这句报错
因为const关键字的缘故

但是通过const_cast关键字就可以使其赋值
然后我们看下结果

static_cast
static_cast类似于C语言中的强制转换 进行无条件转换,静态类型转换
1.基类和子类之间的转换,子类指针转换为父类指针是安全的,但是父类指针转换为子类指针是不安全的
2.static_cast可以转换基本数据类型如:int char float enum struct 不能转换无关类型比如非基类和子类的转换
3.把任何类型的表达式转换成void类型
4.static_cast 不能去掉类型的const volatile类型(用const_cast)
static_cast不提供运行时检查 所以在编写的时候要确认安全性
int main() {
int n = 100;
double t = static_cast<double>(n);
char t = static_cast<char>(n);
//基本类型转换
int* pn = &n;
//无关转换类型转换错误
double& t = static_cast<double*>(&n);
//转换正确
void* p = static_cast<void*>(&n);
}
dynamic_cast
相比static_cast来说,dynamic_cast在转换之前会检测类型转换是否合法,具有一定安全性 同时额外消耗一些性能
有条件的转换,动态类型的转换,运行的时候检查类型安全(转换失败返回NULL)
1.安全的基类和子类之间的转换
2.必须带有虚函数
3.相同基类,不同子类之间的交叉转换,但是结果必须返回NULL
class Base {
public:
int i;
virtual void foot() {};//虚函数时必须的 保证多态特性才能使用
};
class sub :public Base {
public:
char* name[100];
void bar() {};
};
int main() {
Base* pb = new sub();
sub* ps1 = static_cast<sub*>(pb);//子类->父类 用static_cast将Base*转换成为sub*
sub* ps2 = dynamic_cast<sub*>(pb);//动态转换
Base* pb2 = new Base();
sub* ps3 = static_cast<sub*>(pb2);//虽然没有报错 但是比较危险 访问子类name成员越界
sub* ps4 = dynamic_cast<sub*>(pb2);//动态类型转换
return 0;
}
注意上边定义了一个虚函数,只有存在虚函数才能保证多态性
reinterpret_cast
仅仅重新解释类型,但没有进行二进制的转换
1.转换的类型必须是一个指针,引用,算术类型,函数指针或者是成员指针
2.在比特级上的转换,可以把一个指针转换成一个正数,也可以把一个整数转换成一个指针
3.最普通的用途就是函数指针类型之间进行转换
4.很难保证移植性
他可以转换任何内置的数据类型为其他任何的数据类型
也可以转化任何指针类型为其他类型,甚至可以转换内置数据类型为指针
非常激进的类型转换,在编译期完成,可以转换任何类型的指针,极不安全,非极端情况不要使用
总结
去const属性用const_cast
基本类型转换用static_cast
多态类之间类型转换用dynamic_cast
不同类型的指针类型转换用 reinterpret_cast
希望我所写的对大家有帮助


1709

被折叠的 条评论
为什么被折叠?



