首页 > 代码库 > C++关键字之explicit(显式)

C++关键字之explicit(显式)

 C++ Code 
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
/*
    KeyWord_explicit.cpp
    C++关键字:explicit(显示)
    Author: Michael Joessy
    Date: 2017-06-07
    Marks:
    在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。
    再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。
    但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。
    了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的;而且在编写自己的代码时也可以尝试使用。
    既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用。
    按默认规定,只用传一个参数的构造函数也定义了一个隐式转换。

    原则上应该在所有的构造函数前加explicit关键字,当你有心利用隐式转换的时候再去解除explicit,这样可以大大减少错误的发生。
*/


#include <iostream>
using namespace std;

class classA
{
public:
    classA();
    
explicit classA(int x, int y = 23);
    ~classA();

private:
    
int m_x;
    
int m_y;
};

classA::classA()
{

}

classA::classA( 
int x, int y /*= 23*/ )
{
    m_x = x;
    m_y = y;
}

classA::~classA()
{

}

int main(void)
{
    classA ca1;
    classA ca2(
1224);
    classA ca3(
35);
    classA ca4 = 
18;  // 执行了隐式转换,这个地方调用了编译器为我们提供的默认复制构造函数
                      // 对于某些类型,这一情况非常理想。
                      // 但在大部分情况中,隐式转换却容易导致错误(不是语法错误,编译器不会报错)。
                      // 隐式转换总是在我们没有察觉的情况下悄悄发生,除非有心所为,隐式转换常常是我们所不希望发生的。
                      // 通过将构造函数声明为explicit(显式)的方式可以抑制隐式转换。
                      // 也就是说,explicit构造函数必须显式调用。
    /* Error
    1>error C2440: ‘initializing‘ : cannot convert from ‘int‘ to ‘classA‘
    1>        Constructor for class ‘classA‘ is declared ‘explicit‘
    */


    cin.get();
    
return 0;
}

C++关键字之explicit(显式)