首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > More Effective C++ 条款21:通过重载避免隐式类型转换
【标  题】:More Effective C++ 条款21:通过重载避免隐式类型转换
【关键字】:More,Effective,C++,21
【来  源】:http://blog.csdn.net/wang_junjie/archive/2006/09/13/1218047.aspx

More Effective C++ 条款21:通过重载避免隐式类型转换

以下是一段代码,如果没有什么不寻常的原因,实在看不出什么东西:
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类型,我们想要用所有可能的组合来重载oper
ator函数。上面只给出了三种重载函数,唯一漏掉的是带有两个int参数的operator,所
以我们想把它加上。
有道理么?在C++中有一条规则是每一个重载的operator必须带有一个用户定义类型(u
ser-defined type)的参数。int不是用户定义类型,所以我们不能重载operator成为仅
带有此类型参数的函数。(如果没有这条规则,程序员将能改变预定义的操作,这样做
肯定把程序引入混乱的境地。比如企图重载上述的operator,将会改变int类型相加的含
义。)
利用重载避免临时对象的方法不只是用在operator函数上。比如在大多数程序中,你想
允许在所有能使用string对象的地方,也一样可以使用char*,反之亦然。同样如果你正
在使用numerical(数字)类,例如complex(参见条款35),你想让int和double这样的
类型可以使用在numerical对象的任何地方。因此任何带有string、char*、complex参数
的函数可以采用重载方式来消除类型转换。
不过,必须谨记80-20规则(参见条款16)。没有必要实现大量的重载函数,除非你有
理由确信程序使用重载函数以后其整体效率会有显著的提高。
 
计算出k的阶乘k!全部有效数字。:【上一篇】
More Effective C++ 条款20:协助完成返回值优化:【下一篇】
【相关文章】
  • C++的学习方法及书籍推荐
  • 学习C++的五十个观点
  • C++ Gossip: 使用 dynamic_cast
  • scsi刻录机,plextor 1210ts,plextor 4012ts
  • seagate st52160n,seagate st51080n,seagate st39216n
  • quamtum tm21s,quamtum st2100s,quantum 2160s
  • st3600n,st39173n,st31230n,st32430n,st34572n,st3921
  • st32155n,st32550n,st32171n,st32151n,st34573n
  • st32171n,st32550n,st32151n,st34520n,st34573n,st392
  • 《C++编程思想》总结 之一
  • 【随机文章】
  • 利用XMLBean轻轻松松读写XML(最好的数据对象 XMLBean)
  • 线性表
  • ADSL究竟是怎么了?!
  • active在web上使用小结,windows环境,原创
  • 字符串截取函数
  • linux 的库操作命令 ar和nm(zz)
  • 3DS Max 7.0 PF Source粒子全攻略(34)
  • CMMI v1.2模型变更之一:模型变更概述
  • 综合布线方案集锦
  • Python应用:分类归档--建立批处理,一次执行Shell调用
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.