2011-02-24 159 views
1

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

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

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

加法和复合赋值是二进制运算符,但这些功能定义一个不同数量的参数。这个差异的原因是这个指针。

回答

6

是的,实际使用有差异。特别是,当您将运算符超载为非成员函数时,转换可以应用于操作数(或两个操作数)。当您使用成员函数过载二元运算符时,转换只能应用于右侧的运算对象

这可能会导致一些古怪。例如,可以考虑编写一个“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,你几乎可以肯定想要)。

几个运营商(尤其是赋值运算符,如=+=-=等)是特殊的。转换会创建一个临时对象,并且不允许将临时对象分配给1),并且2)无论如何都不合理或完成任务。因此,当您重载赋值运算符时,您始终使用成员函数。