c++ explicit关键字
考虑以下代码: 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() < } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |