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(12, 24); 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; } |