[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
adj.明确的,清楚的; 直言的; 详述的; 不隐瞒的;
看到上面的英文解释,我们应该就知道explicit构造函数是什么意思了:显式的构造函数!
一、隐式构造函数
如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
如果我们执行这样的操作,就相当于自动将整型转换为MyClass类对象
它与下面的代码相等:
二、显示构造函数
虽然隐式转换很方便,但是在有些时候,我们可能不需要这些隐式转换,比如:
如果我们按照下面的方式来定义:
这样会各自调用各自的构造函数来进行打印,分别输出“2”和“b”。
但是如果我们继续按照隐式转换的方式来写:
虽然都会编译通过,但是会被隐式转换,obj1最后打印输出了b的ASCII码。
为了避免上面的情况的错误发生,我们可以声明显示的转换,使用explicit 关键字:
这样下面的写法: