explicit 关键字
防止类的初始化的时候进行隐式转换。
class MyClass {
string m_s;
int m_a, m_b;
public:
MyClass(string const& s, int const& a=10, int const& b=10):m_s(s),m_a(a), m_b(b){}
};
int main() {
MyClass c = string("abc"); //这里会进行隐式转换:MyClass c = MyClass(string("abc"))
MyClass cc = {string("abc"), 11}; //这也会进行隐式转换 MyClass c = MyClass(string("abc"),11)
return 0;
}
以上代码都是可以通过编译的.但是在构造函数MyClass
前加上exolicit
,编译就会报错。因为一些项目里,隐式转换经常会造成一些难以察觉的bug,所以写类的构造函数的时候最好用上explicit
。当然,用上explicit
之后还是可以进行显示转换的。MyClass c = MyClss(string("ABC"));
这个是合法的。