设为首页 加入收藏

TOP

建议17:提防隐式转换带来的麻烦(2)
2013-10-07 14:47:28 来源: 作者: 【 】 浏览:52
Tags:建议 提防 转换 带来 麻烦

建议17:提防隐式转换带来的麻烦(2)

使用具名转换函数

来看一段代码:

  1. class Rational  
  2. {  
  3. public:  
  4.     Rational(int numerator = 0, int denominator = 1)  
  5.         :m_num(numerator),m_den(denominator){}  
  6.  
  7.     operator double() const  
  8.     {  
  9.    return ((double)m_num/(double)m_den);  
  10.     }  
  11. private:  
  12.      int m_num;  
  13.      int m_den;  
  14. };  
  15.  
  16. Rational r(1,2);  
  17. cout<<r<<endl

上面代码的本意是打印类似n/m的形式,可是结果输出的却是0.5。问题出现在哪里?当调用operator<<时,编译器会发现没有合适的函数存在,所以它就试图找到一个合适的隐式类型转换顺序,以使函数得到正常调用。本来程序中并不存在将Rational转为其他类型的转换规则,但是Rational::operator double函数告诉编译器Rational类型可以转换为double类型,所以就有了上述结果的出现。为了避免此类问题的出现,建议使用非C/C++(www.cppentry.com)关键字的具名函数,代码如下所示:
  1. class Rational  
  2. {  
  3. public:  
  4.      Rational(int numerator = 0, int denominator = 1);  
  5.      operator as_double() const;  
  6. private:  
  7.      int m_num;  
  8.      int m_den;  
  9. };  
  10.  
  11. Rational r(1,2);  
  12. cout<<r<<endl; // 提示无operator<<Rational重载函数 

使用 explicit 限制的构造函数

这种方式针对的是具有一个单参数构造函数的用户自定义类型。代码如下所示:

  1. class Widget  
  2. {  
  3. public:  
  4.      Widget( unsigned int factor);  
  5.    Widget( const char* name, const Widget* other = NULL);  
  6. }; 

上述代码片段中,用户自定义类型Widget的构造函数可以是一个参数,也可以是两个参数。具有一个参数时,其参数类型可以是unsigned int,亦可以是char*。所以这两种类型的数据均可以隐式地转换为Widget类型。控制这种隐式转换的方法很简单:为单参数的构造函数加上explicit关键字:
  1. class Widget  
  2. {  
  3.   explicit Widget(unsigned int factor);  
  4.   explicit Widget(const char* name, const Widget* other = NULL);  
  5. }; 

请记住:

提防隐式转换所带来的微妙问题,尽量控制隐式转换的发生;通常采用的方式包括:(1)使用非C/C++(www.cppentry.com)关键字的具名函数,用operator as_T()替换operato T()(T为C++(www.cppentry.com)数据类型)。(2)为单参数的构造函数加上explicit关键字。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇建议13:掌握变量定义的位置与时机 下一篇建议17:提防隐式转换带来的麻烦..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: