关键字总结-explicit
0 - 前言
参考:
[C++ 中explicit的作用](https://www.cnblogs.com/diligenceday/p/5781408.html)
1 - 含义
explicit关键字用来防止隐式调用构造函数。既然如此,那么explicit就是修饰类的构造函数的。explicit 关键字只能用于类内部的构造函数声明上
类构造函数默认情况下即声明为implicit(隐式)
什么叫做隐式调用构造函数呢?既然有隐式,就必然有显式调用构造函数,来看一个例子:
class A{
public:
A(int a)//
{
cout<<a<<endl;}
};
class B{
public:
explicit B(int b)
{
cout<<b<<endl;}
};
int main(){
//构造函数默认 隐式调用
A A1(12); //显式调用构造函数
A A2 = 23; //隐式调用构造函数
A1 = 45; //允许,隐式
A2 = A1; //允许,隐式
//构造函数使用explicit修饰,只允许显示调用构造函数
B B1(12); //显式
//B B2 = 23;//这样就是不允许的
//B1 = 45;//不允许,取消隐式
//B2 = B1;//不允许,取消隐式
return 0;
}
2 - 适用场景
explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了
class B{
public:
explicit B(int b1, int b2)
{
cout<<b<<endl;}
};
//此时有无explicit都一样,不会发生隐式转换
也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数,看例子:
class B{
public:
explicit B(int b1, int b2 = 0)
{
cout<<b<<endl;}
};
//此时,仍旧要依靠explicit来区分是否允许因式转换