explicit关键字用于禁止单参数构造函数及转换运算符的隐式类型转换,仅允许显式初始化或强制转换,提升类型安全与语义清晰性。

explicit 关键字用于修饰单参数构造函数(或多个参数但除第一个外都有默认值的构造函数),目的是禁止编译器自动进行隐式类型转换。
防止意外的隐式转换
没有 explicit 时,编译器可能悄悄把一个类型转成类对象,导致逻辑难察觉、行为不符合预期。比如:
class String {
public:
String(int size) { /* 分配 size 字节 */ }
};这时 String s = 10; 或 func(String(20)); 调用接受 String 的函数时传入整数 20,都会触发隐式转换——编译通过但语义模糊。
显式调用才允许构造
加上 explicit 后,只有直接初始化或显式转型才合法:
立即学习“C++免费学习笔记(深入)”;
-
String s(10);✅ 允许(直接初始化) -
String s = 10;❌ 编译错误(拷贝初始化,触发隐式转换) -
func(String(20));✅ 允许(显式构造) -
func(20);❌ 错误(若 func 参数是 String)
适用于转换运算符(C++11起)
explicit 也能修饰类型转换函数,防止隐式转出:
class Number {
int val;
public:
explicit operator int() const { return val; }
};此时 int x = num; 不再自动转换,必须写 int x = static_cast 或 int x = (int)num;。
什么时候该加 explicit?
只要该构造函数的语义不是“这个参数天然就代表这个类型”,就建议加:
- 用 int 构造缓冲区大小 → 加 explicit(不是“整数就是字符串”)
- 用 const char* 构造字符串 → 通常不加("hello" 天然可看作 String)
- 智能指针用原始指针构造 → 加 explicit(避免 delete 混乱)









