More Effective C++----(21)通过重载避免隐式类型转换
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了More Effective C++----(21)通过重载避免隐式类型转换,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2057字,纯文字阅读大概需要3分钟。
内容图文
Item M21:通过重载避免隐式类型转换
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;
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成为仅带有此[int]类型参数的函数。(如果没有这条规则,程序员将能改变预定义的操作,这样做肯定把程序引入混乱的境地。比如企图重载上述的operator,将会改变int类型相加的含义。)
利用重载避免临时对象的方法不只是用在operator函数上。比如在大多数程序中,你想允许在所有能使用string对象的地方,也一样可以使用char*,反之亦然。同样如果你正在使用numerical(数字)类,例如complex(参见条款M35),你想让int和double这样的类型可以使用在numerical对象的任何地方。因此任何带有string、char*、complex参数的函数可以采用重载方式来消除类型转换。
不过,必须谨记80-20规则(参见条款M16)。没有必要实现大量的重载函数,除非你有理由确信程序使用重载函数以后其整体效率会有显著的提高。
总结:有时候发生隐式转换就转换了,真的没必要为了一个函数功能重载很多函数,这样只会让效率低下!
原文:http://blog.csdn.net/qianqin_2014/article/details/51333626
内容总结
以上是互联网集市为您收集整理的More Effective C++----(21)通过重载避免隐式类型转换全部内容,希望文章能够帮你解决More Effective C++----(21)通过重载避免隐式类型转换所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。