C++ 类型转换详解
C++ 为了兼容 C 语言,保留了原有的隐式和显式类型转换机制,但也引入了更安全的四种专用操作符。理解这些转换的边界和潜在风险,是编写健壮 C++ 代码的基础。
C 语言风格转换
在 C 语言中,如果赋值运算符左右两侧类型不匹配,或者函数参数与实参类型不一致,就会发生类型转换。主要分为隐式转换和强制转换两类。
隐式类型转换
隐式转换由编译器自动完成,通常发生在数值类型之间(如 int 转 double)。对于单参数构造函数,C++ 也支持隐式转换,这有时会导致意外的对象创建。
#include <iostream>
using namespace std;
class A {
public:
A(int a) : _a(a) {}
private:
int _a;
};
class B {
public:
B(int b, int c) : _b(b), _c(c) {}
private:
int _b;
int _c;
};
int main() {
// 基本类型隐式转换
int a = 0;
double b = a;
// 单参数构造函数隐式转换
A aa = 1;
// C++11 初始化列表支持多参数隐式转换
B bb = {2, 3};
return 0;
}
如果不需要隐式转换,可以使用 explicit 关键字修饰构造函数来禁止此类转换。
强制类型转换
显式强制转换需要用户手动指定,例如将指针转换为整数地址。虽然指针本质是地址编号,与整型有近似关系,但直接转换存在风险。
int main() {
int a = ;
* pa = ;
pa = (*)a;
;
}


