码迷,mamicode.com
首页 > 编程语言 > 详细

More Effective C++ 条款21 利用重载技术避免隐式类型转换

时间:2015-09-24 22:46:15      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:

1. 正如条款19条款20所言,临时对象的构造和析构会增加程序的运行成本,因此有必要采取措施尽量避免临时对象的产生.条款20介绍了一种用于消除函数返回对象而产生临时对象的方法——RVO,但它并不能解决隐式类型转换所产生的临时对象成本问题.在某些情况下,可以考虑利用重载技术避免隐式类型转换.

2. 考虑以下类UPInt类用于处理高精度整数:

技术分享
class UPInt{
public:
    UPInt();
    UPInt(int value);
    ...
};
const UPInt operator+(const UPInt& lhs,const UPInt& rhs);
View Code

    那么以下语句可以通过编译:

技术分享
UPInt upi1;
...
UPInt  upi2=2+upi1;
upi3=upi1+2;
View Code

    原因在于UPInt的单int参数构造函数提供了一种int类型隐式转换为UPInt类型的方法:先调用UPInt的单int参数构造函数创建一临时UPInt对象,再调用operator+.此过程产生了一临时对象,用于调用operator+并将两个UPInt对象相加,但实际上要使int与UPInt相加,不需要隐式类型转换,换句话说,隐式类型转换只是手段,而不是目的.要避免隐式类型转换带来的临时对象成本,可以对operator+进行重载:

UPInt operator+(int,const UPInt&);
UPInt operator+(const UPInt&,int);

3. 2中用函数重载取代隐式类型转换的策略不局限于操作符函数,在string与char*,Complex(复数)与int,double等的兼容方面同样可以采用此策略,但此策略要权衡使用,因为在增加一大堆重载函数不见得是件好事,除非它确实可以使程序效率得到大幅度提高.

More Effective C++ 条款21 利用重载技术避免隐式类型转换

标签:

原文地址:http://www.cnblogs.com/reasno/p/4836674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!