C++ 类型转换:四种运算符的用法与取舍
C 语言里的类型转换太随意了,C++ 用四种显式运算符来约束这种随意,提升安全性和可读性。下面从 C 的转换说起,看看每种运算符适合什么场景。
C 语言里的转换
在 C 里,类型不匹配时编译器会自动做隐式转换,比如 int 转 double。单参数构造函数也能触发隐式转换,但 C++ 可以用 explicit 禁止。
// 隐式转换的例子
class A {
public:
explicit A(int a) : _a(a) {}
private:
int _a;
};
// A aa = 1; // 编译错误
C 风格的强制转换 (type) 很粗暴,可以把指针和整数互转,但完全不管类型安全。
int a = 0;
int* pa = (int*)a; // 没任何检查
对 const 变量强制去 const 然后修改,属于未定义行为,编译器可能缓存初始值。加上 volatile 能让编译器每次都从内存读。
volatile const int c = 0;
int* pc = (int*)&c;
(*pc)++;
// c 的值可能真变了
C++ 四种转换运算符
C++ 引入四个明确的关键字,目的就是告诉读代码的人'这里在做什么转换'。
static_cast
用于相关类型的静态转换,基本等于编译器能接受的隐式转换,但显式写出来更清晰。数值转换、向上转型(子类到基类)都用它。
int a = 0;
double b = static_cast<double>(a);
reinterpret_cast
这是最危险的,对底层比特位直接重新解释。通常用于指针类型之间的强转,比如整数转指针。它不检查类型是否相关,也不去掉 const,万一用错只能自己扛。
int* pa = reinterpret_cast<int*>(a);


