标签:
C++提供keywordexplicit,你应该不能阻止的转换构造隐式转换发生的同意。声明explicit的构造不能在一个隐式转换使用。
我们先来看一段演示样例代码:
class A { public: A(int v):var(v){};//带一个int型值的构造函数 bool isSame(const A& ref) const {return var == ref.var;}//判等函数 private: int var;//成员变量var }; void main() { A a(5);//构造a对象 A b(5);//构造b对象 if (a.isSame(b)) cout<<"a==b"<<endl; else cout<<"a!=b"<<endl; }
因为构造函数须要传入一个int型初始值,因此能够觉得这是一个隐式转换。把一个int型值转换为一个A类型的对象。
所以假设改动main函数为例如以下代码。
class A { public: A(int v):var(v){};//带一个int型值的构造函数 bool isSame(const A& ref) const {return var==ref.var;}//判等函数 private: int var;//成员变量var }; void main() { A a(5);//构造a对象 if (a.isSame(5))//这里会由于构造函数的隐式转换。因而正确运行isSame cout<<"a==b"<<endl; else cout<<"a!=b"<<endl; }这看起来不错,好像还省了不少力气。可是这种使用依赖于用户是否有对应的需求,有时候它将成为一个bug。所以更好的办法是抑制这种由构造函数引起的隐式转换。
class A { public: explicit A(int v):var(v){};//带一个int型值的构造函数 bool isSame(const A& ref) const {return var==ref.var;}//判等函数 private: int var;//成员变量var }; void main() { A a(5);//构造a对象 if (a.isSame(5)) cout<<"a==b"<<endl; else cout<<"a!=b"<<endl; }
//输出结果 error C2664: “A::isSame”: 不能将參数 1 从“int”转换为“const A &” 1> 原因例如以下: 无法从“int”转换为“const A” 1>这样一来构造函数就无法进行隐式转换,
class A { public: explicit A(int v):var(v){};//带一个int型值的构造函数 bool isSame(const A& ref) const {return var==ref.var;}//判等函数 private: int var;//成员变量var }; void main() { A a(5);//构造a对象 if (a.isSame(A(5))//显示使用构造函数 cout<<"a==b"<<endl; else cout<<"a!=b"<<endl; }
版权声明:本文博主原创文章,博客,未经同意不得转载。
标签:
原文地址:http://www.cnblogs.com/yxwkf/p/4801598.html