【问题标题】:Error passing by value in operator overloading [duplicate]在运算符重载中按值传递错误[重复]
【发布时间】:2021-02-02 17:21:03
【问题描述】:

我试图理解为什么在简单的类定义中按引用传递有效,而按值传递却不行

#include <iostream>

class Rettangolo {
  int a, b;
  public:
    Rettangolo (Rettangolo& r) {
      a = r.a;
    }
    Rettangolo (int _a, int _b) : a(_a), b(_b) {};
    Rettangolo operator+= (Rettangolo r1);
    void print() {
      std::cout << a << ", " << b;
    }
};

Rettangolo Rettangolo::operator+= (Rettangolo r1) {
  a += r1.a;
  b += r1.b;
  return *this;
};

int main() {
  std::cout << "Hello World!\n";
  Rettangolo recta (1, 2);
  Rettangolo rectb (5, 6);
  recta += rectb;
  recta.print ();
}

如果我在 operator+= 的参数中使用 (Rettangolo r1) ,如上例所示,输出为“6,2”。 但是,如果我在参数中使用 (Rettangolo& r1),输出是“6, 8”,正如我所期望的那样

【问题讨论】:

  • 仅供参考,operator += 应该返回一个引用;不像您的价值副本。只是说。
  • 此代码包含多个问题。您应该阅读复制构造函数和运算符重载。
  • 您的复制构造函数应该采用 const 引用。

标签: c++ operator-overloading pass-by-reference


【解决方案1】:

这是因为您的复制构造函数没有完全发挥作用。它只复制a,而不是b。因此,当您调用operator+= 时复制rectb,通过值传递rectba 将被复制并添加到recta,但b 不会被复制,因此不会被添加到recta。要解决此问题,请在复制构造函数中添加 b 复制,或者将其删除,编译器将为您生成一个默认复制构造函数,该复制构造函数同时复制 ab

【讨论】:

    【解决方案2】:

    您的代码有几个问题。

    最重要的问题是您的复制构造函数根本没有复制b。当您将Rettangolo 按值 传递给operator+= 时,编译器必须对其进行复制,因此在您的operator+= 内部,复制的r1.b 值有一个indeterminate 值,在您的情况下恰好为 0,但这不能保证。传递 r1 通过引用 会跳过损坏的复制构造函数。

    另外,复制构造函数和operator+= 需要通过常量引用获取Rettangolo

    此外,您的 operator+= 没有通过引用返回 *this,因此它返回了另一个副本(您将忽略它)。

    试试这个:

    #include <iostream>
    
    class Rettangolo {
      int a, b;
      public:
        Rettangolo (int _a, int _b) : a(_a), b(_b) {}
    
        Rettangolo (const Rettangolo& r) : a(r.a), b(r.b) {}
        // or: Rettangolo (const Rettangolo &r) = default;
        // or: simply omit this constructor and let the compiler generate it for you!
    
        Rettangolo& operator+= (const Rettangolo &r1);
    
        void print() const {
          std::cout << a << ", " << b;
        }
    };
    
    Rettangolo& Rettangolo::operator+= (const Rettangolo &r1) {
      a += r1.a;
      b += r1.b;
      return *this;
    };
    
    int main() {
      std::cout << "Hello World!\n";
      Rettangolo recta (1, 2);
      Rettangolo rectb (5, 6);
      recta += rectb;
      recta.print ();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 2015-05-21
      • 2013-11-14
      • 2016-10-18
      • 1970-01-01
      相关资源
      最近更新 更多