一、前言
在编写 C++ 代码时,explicit 关键字出现的频率很高。理解其作用对于掌握类型转换机制至关重要。
二、explicit 关键字是什么?
explicit 是 C++ 中的关键字,用于修饰只有一个参数的类构造函数,表明该构造函数是显式的,而非隐式的。当使用 explicit 修饰构造函数时,它将禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数。
三、构造函数还具有类型转换的作用
单参构造函数
通过日期类进行讲解:
class Date {
public:
// 构造函数
Date(int year) : _year(year) {}
private:
int _year;
int _month = 3;
int _day = 31;
};
对于下面的代码,d1 和 d2 都会调用构造函数:
int main() {
Date d1(2022);
Date d2 = 2023;
return 0;
}
Date d2 = 2023 这种写法也会调用构造函数。这是因为存在隐式类型转换。将 int 类型的数值赋值给 double 类型的数据时,会产生隐式类型转换,中间会构造一个临时变量。
同理,2023 会先去构造一个临时对象(类型为 Date),将其 year 初始化为 2023,然后再通过这个临时对象进行拷贝构造给到 d2。编译器通常会优化这一过程,将【构造 + 拷贝构造】优化为【一个构造】。
若尝试将内置类型直接引用赋值给类类型对象:
Date& d3 = 2024;
这会报错,因为 d3 是 Date 类型,2024 是内置类型。但如果加 const 修饰:
const Date& d3 = { 2024, 4 };
则不会出现问题,因为产生的临时变量具有常性,可以与 const 引用绑定。
引出 explicit 关键字
如果不想让这种隐式类型转换发生,可以使用 explicit 关键字。它加在构造函数的前面进行修饰,有了它就不会发生上面的隐式转换。
explicit Date( year) : _year(year) {}


