上一篇讲了转换构造函数有什么用途,知道了转换构造函数经常会在不经意就被调用,当不希望发生转换时,哪有什么办法可以让它不要隐式调用转换吗?
是有的,就是关键字explicit作用。
以上一篇代码来修改,来介绍explicit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//zouzhongliang.com #include <iostream> using namespace std; class A { private: int a; public: A(){ cout<<"调用无参构造函数"<<endl; } ~A(){ cout<<"调用析构函数"<<endl; } explicit A(int a){ //加explicit后没有转换功能 this->a = a; cout<<"调用转换构造函数"<<endl; } void print(){ cout<<a<<endl; cout<<"成员函数print"<<endl; } }; int main() { int Num = 2; // A a2 = Num; 编译通不过 A a2(Num); return 0; } |
A a2 = Num; 这句代码编译通不过,说明没有办法把int类型转成A类型,不能隐式调用转换构造函数。
可以看出转换构造函数前加explicit后,就没有转换功能,只是单纯的带参数构造函数。
这样做的好处理,可以防止程序的隐式调用带来的错误。有很多时候并不是要转换,有可能是写错代码了。
explicit关键字用于转换运算符
1 2 3 4 5 6 7 8 9 10 11 12 |
class A { ..... operator double() const; explicit operator int() const; ..... }; A a; double d = a; //正确 int i = a; //错误,不能隐式转换 int j = int(a); //正确 |