explicit的用法
explicit关键字的作用是:禁止隐式调用类的单参数构造函数,主要禁用以下两种操作:
-
禁止隐式调用拷贝构造函数
-
禁止类对象之间的隐式转换
类对象之间的隐式转换是指利用一个已经存在的其它类型的对象来创建本类的新对象,且不显式的调用类的构造函数
类对象之间的隐式转换也很常见,例如:A a = 6;就是一个隐转换,它利用6创建一个A类的对象且没有显式调用A的构造函数A(66)
隐式调用具体实例如下:
#include <iostream>
using namespace std;
class A{
public:
int val;
A();
A(int val)
{
this->val = val;
}
friend void show(const A & a);
};
void show(const A & a)
{
cout << a.val << endl;
}
int main()
{
A a1 = 66;
A a2 = a1;
show(a1);
show(a2);
show(2333);
return 0;
}
程序输出结果如下所示:
66
66
2333
在以上程序中,A a1 = 66、A a2 = a1、show(2333)三条语句中调用了类A的单参数构造函数,这种隐式调用在C++中是允许的,但是略微影响可读性
为了屏蔽掉隐式调用单参构造函数,C++引入了关键字explicit,在类的定义中,在任意一个单参数构造函数前加explicit,即可该构造函数的隐式调用
explicit的使用实例如下:
#include <iostream>
using namespace std;
class A{
public:
int val;
A();
explicit A(int val)
{
this->val = val;
}
friend void show(const A & a);
};
void show(const A & a)
{
cout << a.val << endl;
}
int main()
{
A a1 = 66;
A a2 = a1;
show(a1);
show(a2);
show(2333);
return 0;
}
该程序和上方程序的区别就在于后者较前者只是多了一个explicit关键字,但是后者在编译时就会出现以下错误
如果需要取消这些错误,只需将main函数中的代码修改为以下内容:
A a1(66);
A a2(a1);
show(A(2333));
这样,程序中就不再含有隐式调用构造函数,代码的可读性将更高
explicit关键字使用须知:
- explicit关键字只可用于单参数构造函数,因为多参构造函数或无参构造函数总是显式调用的
- 如果需要禁止类A对象被隐式转换为类B对象,则可在类B中使用关键字explicit
文章来源: 陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008