
考虑以下代码:
class A
{
private:
int a;
public:
A(int i):a(i){}
};
int main()
{
A a1 = 1; //OK
return 0;
}
上面main中1是内置的int型,但是编译器把它隐式地转化成了A类型,因为刚好A的构造函数只有一个参数且该参数为int型。
这看起来很方便,但有时却可能带来不想要的结果,如下例:
class myString
{
public:
string str = "";
myString(int len)
{
str.resize(len);
}
myString(const char p)
{
str.append(1,p);
}
};
int main()
{
myString s = '0';
cout << s.str < cout << s.str.size() < } 这里我们的想法是要把s变成‘0’这个字符,然后输出的却是空字符且长度为48——这是因为编译器隐式地把‘0’转化成了int,也就是48(‘0’的ACII码),然后用这个48去调用myString(int)这个构造函数。这就是编译器的方便性、却带来了不想要的结果。 为了不发生这种意想不到的情况,需要在构造函数前加explicit关键字: class myString { public: string str = ""; explicit myString(int len) //explicit构造函数 { str.resize(len); } explicit myString(const char p) //explicit构造函数 { str.append(1,p); } }; int main() { myString s = '0'; //错误:‘0’没法再隐式转化成myString类了 myString s('0'); //OK cout << s.str < cout << s.str.size() < } 以上是内存溢出为你收集整理的c++ explicit关键字全部内容,希望文章能够帮你解决c++ explicit关键字所遇到的程序开发问题。 如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。 欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)