强制类型转换
核心为四个cast类型
分别是:
- static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
补充:转换是否安全
首先,派生类内一定有基类。
基类指针可以指向派生类
如果将指向基类的指针指向派生类,派生类对象在内存中的布局通常会以基类部分的开头,派生类可以看做是对基类的成员和方法补充拓展。因此,基类指针或引用可以直接指向派生类对象,可以看做指向的是派生类中的基类部分。
派生类指针不能指向基类
与上面相反,因为派生类存在重写基类后。基类对象没有派生类的扩展部分,或者说派生类指针指向的区域比实际指向的"大",如果强制转换,可能会导致访问无效的内存区域或错误的数据。
转换相关内容后续会有独立文章,敬请期待!
正文
static_cast
用于基本类型之间的转换,以及具有继承关系的指针或引用之间的转换,例如将指向派生类的指针或引用转换为指向基类的指针或引用。静态转换在编译时进行类型检查,不会进行运行时类型检查。
int i = 10;
double d = static_cast<double>(i);
由于静态时类型检测,因而对于不同类转化可能存在风险,不如Dynamic_cast安全,但是效率比较高。
dynamic_cast
主要用于多态类型之间的安全向下转型(派生类到基类的转换)。它在运行时进行类型检查,只能用于包含虚函数的类(多态类型)。
Base *base_ptr = new Derived();
Derived *derived_ptr = dynamic_cast<Derived*>(base_ptr);
if (derived_ptr) {
// 成功将 base_ptr 转换为 Derived* 类型
} else {
// 转换失败,base_ptr 指向的对象不是 Derived 类型
}
const_cast
用于删除指针或引用的常量性(const 或 volatile 限定符),允许修改被指向对象的值。const_cast 主要用于修改函数的形参类型,使其可以修改实参的值。
const int ci = 10;
int *i_ptr = const_cast<int*>(&ci);
*i_ptr = 20; // 可以修改 ci 的值,尽管 ci 声明为 const
reinterpret_cast
用于不同类型的指针之间的转换,或者将指针转换为整数类型,通常用于底层编程和对位操作的需求。它提供了最低层次的转换能力,编译器只是简单地将一个类型的位模式解释为另一个类型的位模式。
int value = 10;
void *void_ptr = reinterpret_cast<void*>(&value); // 将 int* 转换为 void*
int *new_value_ptr = reinterpret_cast<int*>(void_ptr); // 将 void* 转换回 int*