C++ explicit关键字的作用
explicit的作用
这个关键字只能用于类的构造函数,被修饰的构造函数不能发生相应的隐式类型转换,只能以显式的方式进行类型转换。
另外,这个关键字只能用于单个参数(这里的单个参数包括多参但是具有默认参数的函数)的构造函数。
例子
现在有一个小孩:
class child {
public:
explicit child(int age) : age(age) {}
void say() {
cout << "age: " << age << endl;
}
private:
int age;
};
在这种情况下,我们可以在创建对象时输入一个年龄:
#include <iostream>
using namespace std;
class child {
public:
child(int age) : age(age) {
cout << "child(int age)" << endl;
}
void say() {
cout << "age: " << age << endl;
}
private:
int age;
};
int main() {
child ch(10); // 可以传入构造参数
child ch2 = 12; // 也可以赋值,这里调用的就是一个隐式的转换构造
ch.say();
ch2.say();
return 0;
}
输出结果:
但是给孩子赋值一个年龄这件事在逻辑上有些说不过去,你如果想要避免别人使用这种行为,就需要 explicit
关键字:
#include <iostream>
using namespace std;
class child {
public:
explicit child(int age) : age(age) { // 加上explicit避免这种行为
cout << "child(int age)" << endl;
}
void say() {
cout << "age: " << age << endl;
}
private:
int age;
};
int main() {
child ch(10);
child ch2 = 12; // 正常的有LSP的这里已经报错了
ch.say();
ch2.say();
return 0;
}
再次编译就会报错:
补充
当然,不只是单个参数的可以,如果你的其他参数具有默认参数,也可以使用这个参数。