标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
- static_cast
- const_cast
- dynamic_cast
- reinterpret_cast
static_cast
语法为:
static_cast<new_type> (expression)
//new_type为目标数据类型,expression为原始数据类型变量或者表达式。
static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换
void test() {
double d = 12.34;
int a = static_cast<int>(d);
cout << a << endl;
}

const_cast
const限定符通常被用来限定变量,用于表示该变量的值不能被修改。
const_cast则正是用于强制去掉这种不能被修改的常数特性,但需要特别注意的是const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。
void test(){
const int a = 2;
int* p = const_cast<int*>(&a);
*p = 3;
cout << a << endl;
}

dynamic_cast
dynamic_cast操作符将基类类型对象的指针或引用转换为同一继承层次中其他类型的指针或引用。(C++ Primer 中文版 p647)
向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
向下转型:父类对象指针/引用- >子类指针/引用(用dynamic_cast转型是安全的)
注意:
- dynamic_cast只能用于含有虚函数的类 (多态类型)
- dynamic_cast会先检查指针或引用能否转换成功,能成功则转换,不能则返回空指针(转换指针)或抛异常(转换引用)
- dynamic_cast对空指针使用,返回结果为空指针
class A{
public:
virtual void f() {}
};
class B : public A
{};
void fun(A* pa){
// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回
B* pb1 = static_cast<B*>(pa);
B* pb2 = dynamic_cast<B*>(pa);
cout << "pb1:" << pb1 << endl;
cout << "pb2:" << pb2 << endl;
}
int main(){
A a;
B b;
fun(&a);
fun(&b);
return 0;
}

强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。
强烈建议:避免使用强制类型转换
reinterpret_cast
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,即重新解释内存里的值,用于将一种类型转换为另一种不同的类型。
- 指针和整数之间的转换
- 不同类型的指针/成员指针/引用之间的转换
本文详细介绍了C++中的四种类型转换操作符:static_cast、const_cast、dynamic_cast和reinterpret_cast的功能与使用方法,并通过示例代码说明了它们的应用场景。
190

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



