在尝试学习运算符重载时,我阅读了C++ Primer中的以下语句.坦率地说,我不太明白这些陈述想传达的信息是什么.示例包括定义成员二元运算符和非成员二元运算符.使用它们有什么不同吗?
通常我们将算术和关系运算符定义为非成员函数,并将赋值运算符定义为成员:
Sales_item& Sales_item:: operator (const Sales_item&)
Sales_item operator_(const Sales_item&, const Sales_item&);
Run Code Online (Sandbox Code Playgroud)
加法和复合赋值都是二元运算符,但这些函数定义了不同数量的参数.出现差异的原因是这个指针.
是的,实际使用存在差异.特别是,当您将运算符作为非成员函数重载时,转换可以应用于任一操作数(或两个操作数).使用成员函数重载二元运算符时,转换只能应用于右操作数.
这可能会导致一些奇怪的现象.例如,考虑编写一个"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
Run Code Online (Sandbox Code Playgroud)
相反,如果你operator+使用非成员函数重载,那么这两个操作都会起作用(假设你有一个构造函数来从int创建一个bignum,你几乎肯定想要).
甲几个运营商(尤其是赋值运算符,如=,+=,-=等等)是特殊的.转换创建一个临时对象,并且不允许分配给临时对象1),并且2)无论如何都没有意义或完成.因此,当您重载赋值运算符时,始终使用成员函数.