一、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:函数传参的隐式转换
();
;
}


