explicit

首先看下面这个例子

#include <iostream>
#include <string>
using namespace std;

class A {
public:
    A(int number) {
        num = number;
    }
    void setNumber(int number) {
        num = number;
    }
    int getNumber() {
        return num;
    }
private:
    int num;
};

int main() {
    A a = 10;
    cout << a.getNumber() << endl;
    return 0;
}

可以看到在主函数中定义了类 A 的一个对象 a ,并直接将整型 10 赋值给了 a 。为什么可以这样做呢?其实是因为这一步在 C++ 中做了隐式的(implicit)转换,将整型 10 转换为了类 A 的对象,并且 10 在这里会作为类 A 的构造函数的参数 number 。所以这个转换有一个限制,就是这个类的构造函数必须有零个或者一个没有默认值的形参,因为只有单一一个变量比如整型 10 可以做隐式转换,这也就只能对应到唯一一个没有默认值的形参。

而关键字 explicit 就是用来禁止这种隐式转换:

#include <iostream>
#include <string>
using namespace std;

class A {
public:
    explicit A(int number) {  // 构造函数前加上explicit
        num = number;
    }
    void setNumber(int number) {
        num = number;
    }
    int getNumber() {
        return num;
    }
private:
    int num;
};

int main() {
    A a = 10;  // 报错
    cout << a.getNumber() << endl;
    return 0;
}

这里在运行的时候就会报错,因为禁止了隐式的转换,所以 a = 10 在这里是非法的。
但你仍然可以先做一次显式的转换:

int main() {
    A a = (A)a;
    cout << a.getNumber() << endl;
    return 0;
}
Last modification:March 26th, 2020 at 06:00 pm