explicit是个C++关键子,但是关注过它的人远远没有其他关键字的多,但是往往忽略了它,就会在一些不经意的地方造成错误,而花费更多的时间去寻找.
看下下面这个例子:
#include <iostream>
using namespace std;class A
{
public:A(int i = 5){m_a = i;}
private:int m_a;
};int main()
{A s;//我们会发现,我们没有重载'='运算符,但是去可以把内置的int类型赋值给了对象A.s = 10;//实际上,10被隐式转换成了下面的形式,所以才能这样.//s = A temp(10);system("pause");return 0;
}
我们发现成员变量的值被修改了.
由此可知:当类构造函数的参数只有一个的时候,或者所有参数都有默认值的情况下,类A的对象时可以直接被对应的内置类型隐式转换后去赋值的,这样会造成错误,所以接下来会体现出explicit这个关键词的作用.
#include <iostream>
using namespace std;class A
{
public://这里用explicit关键词来修饰类构造函数.explicit A(int i = 5, int j = 10){m_a = i;m_b = j;}
private:int m_a;int m_b;
};int main()
{A s;//这样直接赋值,会被提示错误,因为explicit抑制隐式转换的进行s = 10;//这样会报错!!!//当然显示转换还是可以的.s = A(20);system("pause");return 0;
}
通过两个例子我们知道:explicit可以抑制内置类型隐式转换,所以在类的构造函数中,最好尽可能多用explicit关键字,防止不必要的隐式转换.