C++中explicit构造函数接收自定义类型参数时的作用是什么?
关于explicit修饰入参为自定义类型的构造函数的价值
你当前的测试代码看不出二者差异的核心原因是:C++标准规定不允许连续执行两次用户自定义类型的隐式转换,你写的pointA pa = 10;需要先把int转X、再把X转pointA,属于两次隐式转换,本来就不符合语法规则,所以不管加不加explicit都会编译失败,没法验证二者的区别。
你可以用如下场景验证二者的差异:
struct X {X(int x);}; struct pointA { pointA(X x);}; struct pointB {explicit pointB(X x);}; int main() { X x_obj(10); // 无explicit修饰的pointA支持隐式转换,编译通过 pointA pa = x_obj; // 有explicit修饰的pointB不支持隐式转换,编译报错 pointB pb = x_obj; // 必须显式调用构造才能编译通过 pointB pb2(x_obj); return 0; }
explicit修饰入参为自定义类型的构造函数的核心价值如下:
- 阻止非预期的隐式构造:比如有函数
void draw_point(pointA p);,无explicit的情况下直接传X类型对象作为参数,编译器会隐式构造临时的pointA对象,这种自动生成对象的行为往往不是开发者的预期,还可能引入性能损耗或者逻辑bug。加了explicit之后,这种传参方式会直接编译报错,强制开发者必须显式构造pointA对象再传入,避免误操作。 - 消除重载匹配歧义:如果类存在多个重载构造函数,或者自定义类型有双向转换运算符时,没有explicit修饰的构造函数很容易导致重载匹配歧义,要么编译失败,要么匹配到不符合预期的重载分支。
- 提升代码可读性:explicit相当于给其他开发者明确的标识,说明这个构造函数不允许被隐式调用,只有开发者主动写构造语法的时候才会触发,减少了代码的「暗箱操作」空间,后期维护成本更低。
内容的提问来源于stack exchange,提问作者kishoredbn
相关产品推荐
相关产品推荐

