参考[C/C++不常见语法特性]_[强制显式调用构造函数explicit]
为什么一些书里的构造函数都要写个explicit呢?原来C++中带一个参数的构造函数,在默认情况下会在多种情况下自动调用,而explicit就是为了防止隐式使用拷贝构造函数。
#include <iostream> using namespace std; class A { public: int x; A(int x1) { x = x1; cout << "A" << endl; } }; class B { public: int x; explicit B(int x1) { x = x1; cout << "B" << endl; } }; void f1(A a){} void f2(B b){} int main() { f1(10); //输出A f2(B(20)); //输出B //f2(20); //编译出错,提示conversion from `int' to non-scalar type `B' requested }
f1(10)中,10并不是A对象呀,为什么仍然可以成功调用函数呢?
原来编译器隐式调用了构造函数,构造了一个值为10的A对象。
而f2(20)会编译失败,因为explicit关键字阻止了这种隐式调用。