1.默认构造函数和explicit关键字的使用

来源:互联网 发布:网络十大作家排行榜 编辑:程序博客网 时间:2024/05/17 04:27

1.默认构造函数

C++里面有默认的构造函数,这样的构造函数要么不带有参数,要么每个参数都有相应的缺省值。下面我们来看一个例子:

#include <iostream>using namespace std;class A{public:A(){}};int main(){A aObj1();return 0;}

上面的我们定义了一个A类型的对象,使用了默认的构造函数。下面我们再来看一段代码:

#include <iostream>using namespace std;class A{public:A(int i = 0, bool b = true){}};int main(){A aObj1();return 0;}

2.explicit关键字

explicit关键字可以阻止对象被隐形类型转换,有些时候编译器会做一些人们无法预知的类型转换,下面我们来看一段代码:

#include <iostream>using namespace std;class B{public:B(int x = 0, bool b = true){}};void doSomething(B bObject){}int main(){B bObj1;doSomething(bObj1); // 没有问题B bObj2(28);        // 也没有问题       // 我去,竟然也没有问题,但是默认发生了隐式的转换(把一个整形隐式的转换成的一个B类型),但是这个是我们不想要       doSomething(28);doSomething(B(28));  // 没有问题return 0;}
红色加粗的代码在编译的时候没有出错是因为 int 和 B隐式的发生了类型转换,是不是很可怕,我们可以使用explicit关键字来阻止,看下面代码:

#include <iostream>using namespace std;class B{public:explicit B(int x = 0, bool b = true){}};void doSomething(B bObject){}int main(){B bObj1;doSomething(bObj1); // 没有问题B bObj2(28);        // 也没有问题// 报错:error C2664: 'doSomething' : cannot convert parameter 1 from 'const int' to 'class B'doSomething(28);doSomething(B(28));  // 没有问题return 0;}
所以一般构造函数之前添加一个 explicit 关键字会使得程序安全性更高,不会发生类型的隐式转换。





0 0
原创粉丝点击