运算符重载中的成员二元运算符和非成员二元运算符

时间:2011-02-24 04:49:44

标签: c++

在尝试学习运算符重载时,我阅读了C ++ Primer中的以下语句。坦率地说,我不太明白这些陈述想传达的信息是什么。示例包括定义成员二元运算符和非成员二元运算符。使用它们有什么不同吗?

  

通常我们将算术和关系运算符定义为非成员函数,并将赋值运算符定义为成员:

Sales_item& Sales_item:: operator (const Sales_item&)
Sales_item operator_(const Sales_item&, const Sales_item&);
  

加法和复合赋值都是二元运算符,但这些函数定义了不同数量的参数。出现差异的原因是这个指针。

1 个答案:

答案 0 :(得分:6)

是的,实际使用存在差异。特别是,当您将运算符作为非成员函数重载时,转换可以应用于 操作数(或两个操作数)。使用成员函数重载二元运算符时,转换只能应用于 right 操作数。

这可能导致一些奇怪的事情。例如,考虑编写一个“bignum”包,你想重载operator+来处理bignums。如果你把它作为一个成员函数重载,你会得到这样的奇怪:

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)。

少数运算符(特别是赋值运算符,例如=+=-=等)是特殊的。转换创建一个临时对象,并且不允许分配给临时对象1),并且2)无论如何都没有意义或完成。因此,当您重载赋值运算符时,始终使用成员函数。