【问题标题】:member binary operator and nonmember binary operator in operator overloading运算符重载中的成员二元运算符和非成员二元运算符
【发布时间】:2011-02-24 13:04:38
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2019-03-30
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多