在 C++ 中,static_cast
、dynamic_cast
、const_cast
和 reinterpret_cast
是四种不同的类型转换运算符,它们各自有着不同的用途和特点,下面为你详细介绍:
static_cast
是编译时类型转换运算符,用于执行一些较为常规的类型转换,在编译时就确定转换结果。它可以用于以下几种常见情况:
- 基本数据类型转换:如将
int
转换为 double
,或者将 float
转换为 int
等。
- 类层次结构中的转换:包括向上转换(从派生类到基类)和向下转换(从基类到派生类),不过向下转换时不进行运行时类型检查,需要开发者确保转换的安全性。
- 显式的类型转换:例如将
void*
指针转换为其他类型的指针。
dynamic_cast
是运行时类型转换运算符,主要用于在类层次结构中进行安全的向下转换(从基类指针或引用转换为派生类指针或引用)。它会在运行时检查转换是否合法,如果合法则返回转换后的指针或引用,否则返回空指针(对于指针类型)或抛出 std::bad_cast
异常(对于引用类型)。dynamic_cast
依赖于运行时类型信息(RTTI),因此要求目标类必须有虚函数。

#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "Base::print()" << std::endl;
}
virtual ~Base() {}
};
class Derived : public Base {
public:
void print() override {
std::cout << "Derived::print()" << std::endl;
}
};
int main() {
Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) {
derivedPtr->print();
}
delete basePtr;
return 0;
}
View Code
const_cast
主要用于修改对象的 const
或 volatile
限定符。它可以将 const
对象转换为非 const
对象,或者将 volatile
对象转换为非 volatile
对象。不过需要注意的是,使用 const_cast
去除 const
限定符后修改原本 const
的对象是未定义行为,除非该对象本身不是 const
的。

#include <iostream>
void printNonConst(int& num) {
std::cout << "Non-const num: " << num << std::endl;
}
int main() {
const int num = 10;
int& nonConstNum = const_cast<int&>(num);
// 注意:修改 num 是未定义行为,这里仅作演示
// nonConstNum = 20;
printNonConst(nonConstNum);
return 0;
}
View Code
reinterpret_cast
是一种非常危险的类型转换运算符,它可以将任何指针类型转换为其他指针类型,甚至可以将指针转换为整数类型,或者将整数类型转换为指针类型。这种转换仅仅是重新解释内存中的二进制数据,不进行任何类型检查和转换逻辑,因此使用时需要非常谨慎,否则可能会导致未定义行为。

#include <iostream>
int main() {
int num = 10;
int* numPtr = #
// 将指针转换为整数
long long intPtrValue = reinterpret_cast<long long>(numPtr);
std::cout << "Pointer value as integer: " << intPtrValue << std::endl;
// 将整数转换回指针
int* newNumPtr = reinterpret_cast<int*>(intPtrValue);
std::cout << "Value through new pointer: " << *newNumPtr << std::endl;
return 0;
}
View Code
static_cast
:编译时进行类型转换,不进行运行时检查。
dynamic_cast
:运行时进行类型检查,确保转换的安全性。
const_cast
:编译时进行转换,不涉及运行时类型检查。
reinterpret_cast
:编译时进行转换,不进行类型检查,只是简单地重新解释内存数据。
static_cast
:在向下转换时不保证安全性,需要开发者自行确保转换的正确性。
dynamic_cast
:提供较高的安全性,会在运行时检查转换是否合法。
const_cast
:如果不正确使用(如修改原本 const
的对象)会导致未定义行为。
reinterpret_cast
:非常危险,使用不当很容易导致未定义行为。
static_cast
:适用于基本数据类型转换、类层次结构中的常规转换等。
dynamic_cast
:主要用于类层次结构中的安全向下转换。
const_cast
:用于去除对象的 const
或 volatile
限定符。
reinterpret_cast
:在需要进行底层的指针或整数类型转换时使用,但要谨慎使用。