一、回顾 C 语言的类型转换
在深入 C++ 之前,先简单回顾一下 C 语言中的类型转换机制。主要分为两类:
隐式类型转换是编译器在特定场景下自动完成的,常见于不同类型表达式运算中,比如整型之间、整型与浮点型之间的转换。
int a = 1;
double b = 2.234;
a = b; // 隐式截断
强制类型转换则是通过显式语法手动指定,主要用于整型和指针、指针和指针之间的转换。
int a = 1;
char* p = (char*)a;
int* p1 = (int*)malloc(sizeof(int));
需要注意的是,并非所有类型都能直接转换。例如 double 就无法直接转为指针类型,强行转换会导致未定义行为。
二、C++ 中的类型转换
1. 内置类型转为自定义类型
随着面向对象编程的普及,C++ 支持了内置类型与自定义类型的相互转换。内置类型转换为自定义对象时,本质上相当于调用构造函数。
class A {
public:
A(int a) : a1(a), a2(a) {}
private:
int a1;
int a2;
};
这里有个关键点:如果构造函数前加上 explicit 关键字,该构造函数将不再支持隐式类型转换。这在使用智能指针等场景尤为重要,防止普通指针被悄悄转换为智能指针导致逻辑错误。不过,即使加了 explicit,强制类型转换依然有效。
2. 自定义类型转为内置类型
自定义类型对象若要转换为内置类型,需要在类内部重载转换运算符。写法为 operator 类型(),注意中间有空格。函数体内可以自定义转换逻辑。
class A {
public:
A(int a) : a1(a), a2(a) {}
operator int { a1 + a2; }
:
a1;
a2;
};


