explicit 关键字
关键字explicit
主要用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
- 隐式类类型转换
类中的构造函数如果只含有一个参数,默认情况下存在隐式转换,但是这种转换并非总是合理的,甚至容易产生错误。因此,可以使用explicit
关键字,来限制隐式转换。
class A
{
public:
A() { cout << "A()" << endl; };
A(int a, float b = 0.f) { cout << "A(int,float)" << endl; }
A(float f) { cout << "A(float)" << endl; }
};
int main()
{
A a1; //调用 A()
A a2(1); //调用 A(int a,float b = 0.f)
A a3 = 1; //调用 A(int a,float b = 0.f) ,包含一次隐式转换
A a4(1, 1.f); //调用 A(int a,float b = 0.f)
A a5 = 1.0f; //调用 A(float f),包含一次隐式转换
}
explicit
关键字
可以阻止构造函数的隐式转换,但是只有一个参数或除了第一个参数外其余参数都有默认值的构造函数有效,其余的构造函数,explicit
无法进行约束。
class A
{
public:
A() { cout << "A()" << endl; };
explicit A(int a, float b = 0.f) { cout << "A(int,float)" << endl; }
explicit A(float f) { cout << "A(float)" << endl; }
};
int main()
{
A a3 = 1; //错误,不能进行隐式类类型转换
A a4(1, 1.f); //正确
A a5 = 1.0f; //错误,不能进行隐式类类型转换
}
使用关键字explicit之后,构造函数就不能进行隐式类类型转换。
当类的构造函数的声明和定义分别在两个文件里时,explicit只能写在构造函数的声明中,不能写在定义中
如有错误或不足欢迎评论指出!