C++ 中的 explicit 关键字
在 C++ 开发中,类型安全至关重要。explicit 关键字常用于修饰构造函数,其核心作用是禁止编译器进行隐式类型转换。
隐式转换的风险
当一个类的构造函数只接受一个参数时,编译器会默认允许将该参数类型隐式转换为该类对象。这种机制虽然方便,但也容易引发问题。例如:
class MyClass {
public:
MyClass(int num);
};
MyClass obj = 10; // 合法,但可能非预期行为
上述代码中,编译器实际上将其视为:
MyClass temp(10);
MyClass obj = temp;
这意味着整数 10 被自动转换为了 MyClass 实例。在某些场景下(如函数重载),这种隐式转换会导致歧义或逻辑错误。
使用 explicit 禁止转换
为了避免此类风险,可以在构造函数声明前加上 explicit 关键字。这将强制调用者必须显式地构造对象。
class MyClass {
public:
explicit MyClass(int num);
};
MyClass obj = 10; // 编译错误:无法进行非 explicit 转换
修改后,直接赋值整数的写法将不再通过编译,开发者必须明确写出 MyClass obj(10);。这不仅消除了潜在的隐式转换陷阱,也让代码意图更加清晰。
总结来说,对于单参数构造函数,建议默认加上 explicit,除非你确实需要支持隐式转换。

