首页 > 代码库 > [018]C++ explicit构造函数

[018]C++ explicit构造函数

explicit

[英][?k?spl?s?t][美][?k?spl?s?t]

adj.明确的,清楚的; 直言的; 详述的; 不隐瞒的; 

看到上面的英文解释,我们应该就知道explicit构造函数是什么意思了:显式的构造函数!

一、隐式构造函数

如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:

class Myclass {public:    Myclass(int num){};};

如果我们执行这样的操作,就相当于自动将整型转换为MyClass类对象

MyClass obj = 10; //ok,convert int to MyClass 

它与下面的代码相等:

MyClass temp(10);  MyClass obj = temp; 

二、显示构造函数

虽然隐式转换很方便,但是在有些时候,我们可能不需要这些隐式转换,比如:

1 class Myclass {2 public:3     Myclass(int num) {                       // 输出数字4         cout << num <<endl;5     }6     Myclass(const char* p) {                 // 输出字符7         cout << *p << endl;8     }9 };

如果我们按照下面的方式来定义:

Myclass obj2(2);Myclass obj3 = Myclass("b");

这样会各自调用各自的构造函数来进行打印,分别输出“2”和“b”。

但是如果我们继续按照隐式转换的方式来写:

Myclass obj = 10;Myclass obj1 = a;

虽然都会编译通过,但是会被隐式转换,obj1最后打印输出了b的ASCII码。

为了避免上面的情况的错误发生,我们可以声明显示的转换,使用explicit 关键字:

1 class Myclass {2 public:3     explicit Myclass(int num) {4         cout << num <<endl;5     }6     Myclass(const char* p) {7         cout << *p << endl;8     }9 };

这样下面的写法:

Myclass obj = 10;                   // 编译不通过Myclass obj1 = a;                 // 编译不通过Myclass obj2(2);                    // OKMyclass obj3 = Myclass(2);          // OK 

[018]C++ explicit构造函数