在尝试学习运算符重载时,我阅读了 C++ Primer 中的以下陈述。坦白说,我不太明白这些言论想要传递什么信息。这些示例包括定义成员二元运算符和非成员二元运算符。使用时有什么区别吗?
通常我们将算术和关系运算符定义为非成员函数,并将赋值运算符定义为成员:
Sales_item& Sales_item:: operator (const Sales_item&)
Sales_item operator_(const Sales_item&, const Sales_item&);
加法和复合赋值都是二元运算符,但这些函数定义了不同数量的参数。差异的原因是 this 指针。
是的,实际使用中还是有区别的。特别是,当您将运算符重载为非成员函数时,可以将转换应用于either操作数(或两个操作数)。当您使用成员函数重载二元运算符时,转换只能应用于right操作数。
这可能会导致一些奇怪的情况。例如,考虑编写一个“bignum”包并且您想要重载operator+
处理bignum。如果将其重载为成员函数,则会出现如下奇怪的情况:
int x = 2;
bignum y = 3;
bignum z;
z = y + x; // works fine.
z = x + y; // doesn't work: x isn't a bignum, and can/won't be converted to one
相反,如果你超载operator+
使用非成员函数,这两个操作都可以工作(假设您有一个构造函数可以从 int 创建 bignum,这几乎肯定是您想要的)。
A few运算符(特别是赋值运算符,例如=
, +=
, -=
等)是特殊的。转换创建一个临时对象,并且分配给临时对象 1) 是不允许的,并且 2) 无论如何都没有意义或完成太多任务。因此,当您重载赋值运算符时,您始终使用成员函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)