关键词 explicit的作用与理解
作用
- 只能用来修饰类构造函
- explicit修饰的构造函数不能被隐式调用
- 禁止类对象之间的隐式转换
代码案例
#include <iostream>
using namespace std;
class Demo{
public:
explicit Demo(int val) : value(val)
{
cout << __func__ << ":" << __LINE__ << endl;
}
~Demo()
{
cout << __func__ << ":" << __LINE__ << endl;
}
public:
void setval(int val)
{
this->value = val;
}
int getval() const
{
return this->value;
}
private:
int value;
};
int main()
{
Demo obj(0);
// obj = 123; //隐式转换 int -> Demo Error:explicit
cout << obj.getval() << endl;
obj = (Demo) 123;//explicit不会阻止显示类型转换
return 0;
}
运行结果
ubuntu@ubuntu-virtual-machine:~/C++/day8/lian$ ./a.out
Demo:9
0
Demo:9
~Demo:13
~Demo:13
如果构造函数被explicit修饰 则 因为obj = 123; 是隐式转换 int -> Demo 会被报如下的错误:
error: no match for ‘operator=’ (operand types are ‘Demo’ and ‘int’)
33 | obj = 123; //Demo tmp(123) -> obj = tmp; int -> Demo Error:explicit
| ^~~
没有给基类构造函数添加关键字explicit,隐式转换也不会报错。
int main()
{
Demo obj(0);
obj = 123; //隐式转换 int -> Demo Error:explicit
cout << obj.getval() << endl;
obj = (Demo) 123;//explicit不会阻止显示类型转换
return 0;
}
运行结果:
Demo:9
Demo:9
~Demo:13
123
Demo:9
~Demo:13
~Demo:13
把一个int类型的变量赋值给Demo基类型的变量看起来总归不是很好,并且当程序很大的时候出错之后也不容易排查。所以为了防止隐式转换可能带来的风险,一般都把类的单参构造函数声明的显示调用的,就是在构造函数加关键字``explicit`。