在c 中,有四种强制类型转换方式,它们分别是:静态转换(static_cast)、const_cast、动态转换(dynamic_cast)、重新解释转换(reinterpret_cast)。
静态转换(static_cast):
用于非多态类型之间的转换。在进行静态转换时,编译器会在编译时检查转换的合法性,因此在使用时要确保转换是安全的。
静态转换通常用于基本类型之间的转换,例如将整数转换为浮点数,或者在类之间进行显式的转换。
整数转换为浮点数:
int intvalue = 10;
double doublevalue = static_cast(intvalue);
类之间进行显式的转换:
#include
class base {
public:
virtual ~base() {} // 基类析构函数需要为虚函数,以便正确销毁派生类对象
virtual void print() const {
std::cout << "base" << std::endl;
}
};
class derived : public base {
public:
void print() const override {
std::cout << "derived" << std::endl;
}
};
int main() {
base base;
derived derived;
// 在基类指针和派生类指针之间进行静态转换
base* baseptr = &base;
derived* derivedptr = static_cast(baseptr);
// 执行转换后,调用派生类的成员函数
derivedptr->print(); // 输出 "derived"
return 0;
}
const_cast:
用于添加或删除 const 和 volatile 修饰符。
这种转换通常用于修复传入的函数参数的 const 修饰符,或者在需要时去除 const 修饰符以修改变量。
#include
void modifyvalue(int* ptr) {
*ptr = 20;
}
int main() {
const int constvalue = 10;
// 尝试修改 const 变量会导致编译错误
// constvalue = 20;
// 使用 const_cast 去除 const 修饰符以修改变量
int* nonconstptr = const_cast(&constvalue);
modifyvalue(nonconstptr);
// 输出修改后的值
std::cout << "modified constvalue: " << constvalue << std::endl;
return 0;
}
运行结果:
modified constvalue: 20
动态转换(dynamic_cast):
用于在继承关系中进行安全的向下转型(派生类向基类)和向上转型(基类向派生类)。
动态转换会在运行时进行类型检查,如果转换是不安全的,则返回空指针(对于指针类型)或抛出std::bad_cast异常(对于引用类型)。
base* baseptr = new derived();
derived* derivedptr = dynamic_cast(baseptr);
if (derivedptr) {
// 转换成功
} else {
// 转换失败
}
重新解释转换(reinterpret_cast):
提供了最不安全的类型转换,允许在不同类型之间进行任意位模式的转换。
这种转换通常用于将指针转换为整数类型或者将整数类型转换为指针类型,但使用时要特别小心,因为它会绕过类型系统的检查。
int intvalue = 10;
double* doubleptr = reinterpret_cast(&intvalue);
c 中的这四大强制类型转换的函数,我们一般代码中前两个是用的比较多的,使用比较熟悉,后两个大家可以根据自身情况按需使用。