-
用来声明类构造函数是显示调用的,而非隐式调用,所以只用于修饰单参构造函数。
-
因为无参构造函数和多参构造函数本身就是显示调用的。再加上explicit关键字也没有什么意义, 但是也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数。
-
跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).。
官方说明:This keyword is a declaration specifier that can only be applied to in-class constructor declarations . An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object 。
-
意外发现该关键字还可以修饰operator
#include <iostream>
class A
{
public:
/*explict*/ A(int n) //#2
:m_a(n)
{
}
/* explicit*/ operator int() //#1
{
return m_a;
}
private:
int m_a;
};
int main()
{
A a1 = 10; //若#1处使用了explicit关键字,则此处编译失败。
A a2(10);
std::cout << "a2 is:" << a2 << std::endl;//若#2处使用了explicit关键字,则此处编译失败,必须修改为显示类型转换:(int)a
return 0;
}
- google的c++规范 中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显式构造的,只有极少数情况下拷贝构造函数可以不声明成explicit。例如作为其他类的透明包装器的类。
- effective c++ 中提到被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。我鼓励你遵循相同的政策。