转自 https://blog.csdn.net/qq_37233607/article/details/79051075
explicit是个C++关键字,但是关注过它的人远远没有其他关键字的多,但是往往忽略了它,就会在一些不经意的地方造成错误,而花费更多的时间去寻找.
看下下面这个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 1#include <iostream>
2using namespace std;
3
4class A
5{
6public:
7 A(int i = 5)
8 {
9 m_a = i;
10 }
11private:
12 int m_a;
13};
14
15int main()
16{
17 A s;
18 //我们会发现,我们没有重载'='运算符,但是去可以把内置的int类型赋值给了对象A.
19 s = 10;
20 //实际上,10被隐式转换成了下面的形式,所以才能这样.
21 //s = A temp(10);
22
23 system("pause");
24 return 0;
25}
26
27
我们发现成员变量的值被修改了.
由此可知:当类构造函数的参数只有一个的时候,或者所有参数都有默认值的情况下,类A的对象时可以直接被对应的内置类型隐式转换后去赋值的,这样会造成错误,所以接下来会体现出explicit这个关键词的作用.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 1#include <iostream>
2using namespace std;
3
4class A
5{
6public:
7 //这里用explicit关键词来修饰类构造函数.
8 explicit A(int i = 5, int j = 10)
9 {
10 m_a = i;
11 m_b = j;
12 }
13private:
14 int m_a;
15 int m_b;
16};
17
18int main()
19{
20 A s;
21 //这样直接赋值,会被提示错误,因为explicit抑制隐式转换的进行
22 s = 10;//这样会报错!!!
23 //当然显示转换还是可以的.
24 s = A(20);
25
26 system("pause");
27 return 0;
28}
29
30
通过两个例子我们知道:explicit可以抑制内置类型隐式转换,所以在类的构造函数中,最好尽可能多用explicit关键字,防止不必要的隐式转换.