[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);                    // OK
Myclass obj3 = Myclass(2);          // OK 
原文地址:https://www.cnblogs.com/hustcser/p/4172192.html