首页 > 代码库 > [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构造函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。