C++中的explicit关键字

1. explicit关键字

explicit的中文含义是显示的,在C++中主要用于防止隐式转换的发生。那么什么是隐式转换,以如下的代码为例

#include <iostream>
using namespace std;

class Demo {
    public:
        Demo() {}
        Demo(int a) {
            _value1 = a;
        }
        int get_value() {
            return _value1;
        }
    private:
        int _value1;
};

int main() {
    Demo demo;
    demo = 2;  // 隐式转换
    cout << "_value1: " << demo.get_value() << endl;
    return 0;
}

上述代码的输出结果是:_value1: 2,在main函数中,demo = 2就发生了隐式转换,用户类的初始化。如果加上explicit关键字又会是怎样,在Demo(int a)前面加上explicit,结果在编译的时候就显示“no known conversion for argument 1 from ‘int’ to ‘const Demo&’”。

2. 构造函数

C++中的explicit关键字只能用于修饰只有一个参数或者多参数情况下,除了第一个参数外的其他参数都是默认值的构造函数中,对于无参或者除上述之外的多参数构造函数是无效的,如:

class Demo {
    public:
        explicit Demo() {};  // 无效
        explicit Demo(int a);  // 有效
        explicit Demo(int a, int b = 0);  // 有效
        explicit Demo(int a, int b);  // 无效

    private:
        int _value1;
        int _value2;
};

3. 总结

C++中explicit关键字可以防止隐式转换的发生,在使用时注意如下几点:

  1. 只能用于修饰只有一个参数的类构造函数,或者修饰多参数情况下除第一个参数外其余参数都是默认值的构造函数中;
  2. 无参构造函数或者多参数构造函数总是显示调用;
  3. 类构造函数默认情况下都是显示调用;