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

商业专用设备2021年09月06日

以下是一段代码,如果没有什么不寻常的原因,实在看不出什么东西:

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

查看本文来源

西宁治疗子宫内膜炎医院
沈阳哪医院治疗白癜风好
潍坊检查男科医院
相关阅读
蒋勤勤高清照片被修复,老戏骨陈建斌的太太,颜值比甄嬛还美

蒋勤勤较亚洲台图片被复建,才想到老戏骨陈建斌的老婆,原来这么迷人。 ...

2023-10-18
员工下班后才同意签下劳动合同,南宁一公司被判补偿2.7万余元!

劳动合同续期当天, 在午饭42分钟后 梧州一的公司才准许员工孙继海, 傍晚...

2023-09-23
北京积水潭医院参赞昌平区隔离点医疗队:不畏挑战,不辱使命

2022年5月末9日,收到公立医院紧急状况通知,北京积水潭公立医院10名医护医...

2023-09-19
沪高校就业协议编号前百号均来自这所高校,001号签订合同航天领域

4月19日,澎湃新闻(www.thepaper.cn)记者从南京大学获悉,无锡市高校许多学生...

2023-09-16
破除算法暗箱需形成四人

亦同,正中央网信办牵头开展“清朗·2022年正则表达式综合治理”专项行动,...

2023-09-15
身高管理成焦点,一文揭晓6大趋势

编者按: 体重减缓已经已是世界性性弊端,愈来愈多的购买者开始瞩目BMI管...

2023-09-13
友情链接