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
时间: 2024-10-22 00:27:10