explicit 关键字的核心定义
explicit 是 C++ 中的修饰符关键字,它唯一的作用场景就是修饰类的构造函数。核心功能很简单:禁止编译器对被修饰的构造函数执行「隐式类型转换」或「隐式构造」行为。
前置知识:什么是隐式构造?
要理解 explicit,得先搞清楚它要禁止的行为是什么。当类满足以下条件时,编译器就具备了「隐式转换」的能力:
- 构造函数是单参数构造函数(只有 1 个入参);
- 或者,多参数构造函数,但除第一个参数外,其余参数都有默认值(本质等价于「可单参数调用」)。
这时候,编译器会自动将「单个入参的值」转换为「当前类的临时对象」。这个过程不需要程序员手动写构造代码,所以叫「隐式」。虽然方便,但往往也是风险的来源。
不加 explicit 时:隐式构造生效(反面示例)
下面的代码展示了不加 explicit 的情况,直观看到隐式构造的效果,这也是 explicit 要解决的场景:
#include <iostream>
using namespace std;
class Test {
public:
int num;
// 单参数构造函数:无 explicit 修饰,支持隐式构造
Test(int n):num(n) {
cout << "构造函数执行:num = " << num << endl;
}
};
// 测试函数:入参为 Test 类型对象
void printTest(Test t) {
cout << "printTest: " << t.num << endl;
}
int main() {
// 场景 1:直接赋值的隐式转换
Test t1 = 10; // ✅ 编译通过!编译器自动把 10 → Test(10) 临时对象 → 赋值给 t1
cout << "t1.num = " << t1.num << endl;
// 场景 2:函数传参的隐式转换
printTest(20); // ✅ 编译通过!编译器自动把 20 → Test(20) 临时对象 → 传给函数
;
}


