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;
}