文章
C++中explicit关键字怎么用
在构造函数前面加上 explicit,就会禁止该构造用于隐式类型转换和隐式拷贝初始化。
目录
- 若想禁止这种隐式转换,就可以把 Percent(double) 改成 explicit Percent(double)。这样,所有 printPercent(0.5) 或者 Percent(0.1) + 0.2 的用法都将编译报错,要求你必须写成 printPercent(Percent(0.5))、Percent(0.1) + Percent(0.2) 等显式形式。
- 2. explicit 的语法与基本用法
- 3. explicit 修饰多参数构造函数
- Y y = {3}; // ❌ 编译错误,因为 explicit 构造不能做拷贝列表初始化 ```
- 4. C++11 以后,explicit 也可修饰转换运算符
- 5. 什么时候要加 explicit
- struct S { explicit S(int x); // …… }; ``` 2. 多参数且带默认值的构造函数 如果写了一个形如 T(int, double = 0.0) 这类构造函数,也建议加 explicit,因为当你调用 T t = 1; 时,编译器也能隐式地把 1 当作 T(1, 0.0)。加了 explicit 后,需要改成 T t(1); 或者 T t{1};,避免因为看似简单的赋值而触发意外的构造逻辑。 3. 易产生隐式转型二义性的场景 当你发现某个类型的隐式转换可能导致歧义、性能问题或理解成本增高时,就应该考虑把构造标记为 explicit。例如: - 不能让 std::string 的单参构造从 const char* 隐式转成 std::string(其实 std::string 的构造本身在某些库中也就是 explicit 的)。 - 不能让 “带单位的数值类型” 如 Millimeter(double) 从 double 隐式转换。
- 6. 例子:不加 explicit 与加 explicit 的对比
- 7. 小结
- 📎 参考文章