gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:59:01 24 4
gpt4 key购买 nike

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

Ordinarily we define the arithmetic and relational operators as nonmember functions and we define assignment operators as members:

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

Both addition and compound assignment are binary operators, yet these functions define a different number of parameters. The reason for the discrepancy is the this pointer.

最佳答案

是的,实际使用是有区别的。特别是,当您将运算符重载为非成员函数时,可以将转换应用于任一 操作数(或两个操作数)。当您使用成员函数重载二元运算符时,转换只能应用于正确的操作数。

这可能会导致一些奇怪的情况。例如,考虑编写一个“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) 无论如何都没有意义或完成不了多少。因此,当您重载赋值运算符时,您总是使用成员函数。

关于c++ - 运算符重载中的成员二元运算符和非成员二元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5100480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com