当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>C++中通太重载避免隐式范例转换</b>[VC/C++编程]

赞助商链接



  本文“<b>C++中通太重载避免隐式范例转换</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

以下是一段代码,假如没有什么不平常的缘由,实在看不出什么东西:

class UPInt { // unlimited precision
 public: // integers 类
 UPInt();
 UPInt(int value);
 ...
};
//有关为什么返回值是const的注释,拜见Effective C++ 条款21
const UPInt operator+(const UPInt& lhs, const UPInt& rhs);
UPInt upi1, upi2;
...
UPInt upi3 = upi1 + upi2;
  这里还看不出什么令人惊奇的东西.upi1 和upi2都是UPInt对象,所以它们之间相加就会调用UPInts的operator函数.

目前考虑下面这些语句:

upi3 = upi1 + 10;
upi3 = 10 + upi2;
  这些语句也可以成功运行.办法是通过成立暂时对象把整形数10转换为UPInts(拜见条款19).

让编译器完成这种范例转换是确切是很便利,但是成立暂时对象举行范例转换工作是有开销的,而我们不想承当这种开销.就象大大都人只想从政府那边受益而不想为此付出一样,大大都C++程序员但愿举行没有暂时对象开销的隐式范例转换.但是在计算范畴里发生不了赤字现象,我们若何能这么做呢?

让我们回退一步,熟习到我们的目的不是真的要举行范例转换,而是用UPint和int做为参数调用operator.隐式范例转换只是用来到达目的的手段,但是我们不要混合手段与目的.还有一种办法可以成功举行operator的混合范例调用,它将消除隐式范例转换的需求.假如我们想要把UPInt和int对象相加,通过声明以下几个函数到达这个目的,每一个函数有差别的参数范例集.

const UPInt operator+(const UPInt& lhs, // add UPInt
const UPInt& rhs); // and UPInt
const UPInt operator+(const UPInt& lhs, // add UPInt
int rhs); // and int
const UPInt operator+(int lhs, // add int and
const UPInt& rhs); // UPInt
UPInt upi1, upi2;
...
UPInt upi3 = upi1 + upi2; // 精确,没有由upi1 或 upi2
// 生成的暂时对象
upi3 = upi1 + 10; // 精确, 没有由upi1 or 10
// 生成的暂时对象
upi3 = 10 + upi2; //精确, 没有由10 or upi2
//生成的暂时对象.
  一旦你开始用函数重载来消除范例转换,你就有大概这样声明函数,把自己陷入危险之中:

const UPInt operator+(int lhs, int rhs); // 错误!
  这个设法是合情公道的.关于UPInt和int范例,我们想要用全部大概的组合来重载operator函数.上面只给出了三种重载函数,唯一漏掉的是带有两个int参数的operator,所以我们想把它加上.

有原理么?在C++中有一条法则是每一个重载的operator必须带有一个用户定义范例(user-defined type)的参数.int不是用户定义范例,所以我们不能重载operator成为仅带有此范例参数的函数.(假如没有这条法则,程序员将能改变预定义的操作,这样做必定把程序引入混乱的地步.比方计划重载上述的operator,将会改变int范例相加的含义.)

操纵重载避免暂时对象的办法不只是用在operator函数上.比方在大大都程序中,你想答应在全部能利用string对象的地方,也一样可以利用char*,反之亦然.一样假如你正在利用numerical(数字)类,比方complex(拜见条款35),你想让int和double这样的范例可以利用在numerical对象的任何地方.因此任何带有string、char*、complex参数的函数可以采取重载方法来消除范例转换.

不过,必须服膺80-20法则(拜见条款16).没有必要实现大量的重载函数,除非你有来由确信程序利用重载函数今后其整体效率会有明显的提高.


  以上是“<b>C++中通太重载避免隐式范例转换</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .