手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C 中通过重载避免隐式类型转换

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
以下是一段代码,假如没有什么不寻常的原因,实在看不出什么东西:

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)。没有必要实现大量的重载函数,除非您有理由确信程式使用重载函数以后其整体效率会有显著的提高。



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS