解决问题
主要是针对C语言中的类型隐形转换以及手动转换,C++提供了四种机制全部用来手动转换添加了4个关键字,解决C中的强转的风险,提高代码的安全性和健壮性
取消类型的const或volatile属性
将const转成非const。主要针对的是指针,引用,this指针;普通的变量无法使用.
const int n = 10; //int k = const_cast<int>(n); //编译不通过 int* j = const_cast<int*>(&n); int& i = const_cast<int&>(n); std::cout << *j << " " << i << std::endl;
static_cast
无条件转换,静态类型转换
第一种用法:
int n = 5; float = f = 10.0f; f = n; //编译器默认会给你转换
编译器帮你做了转换,不好查询问题;而c++提供了static_cast转换,手动的转换关键字,代码层面更加直观。
f = static_cast<float>(n);
第二种用法:
子类与基类的转换。
父类转子类 不安全,但是编译可能也通过
子类转基类 可以转
dynamic_cast
有条件转换,动态类型转换,运行时检测
使用此关键字必须基类有虚函数,且基类与派生类之间指针与引用关联。
Base b; Base* pb = &b; Sub s; Sub* ps = &s; // 子转父 //pb = ps; // 父转子 不安全,只有在程序运行的时候才能发现, //希望有一种机制能检测转换不安全,而不是程序出现问题后才能发现 //ps = pb; //dynamic_cast机制 有额外的开销,引入RTTI,一般只有向下转才会使用 //ps = dynamic_cast<Sub*>(pb); //pb = dynamic_cast<Base*>(ps);
reinterpret_cast
等价与C语言中的强转
int n = 1; int *p = (int*)n; int *p = n;
C++提供一种统一的强转类型
int *p = reinterpret_cast<int*>(n);
可读性更好,适用于各种高危型的转换方式;整数转换指针,各种类型转换指针转换,父子类转换不做检测