C++ explicit关键字

释放双眼,带上耳机,听听看~!

转自 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

我们发现成员变量的值被修改了.
C++ explicit关键字
由此可知:当类构造函数的参数只有一个的时候,或者所有参数都有默认值的情况下,类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关键字,防止不必要的隐式转换.

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 4 Flex(弹性)布局

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索