首页 > 解决方案 > 在运算符重载中按值传递错误

问题描述

我试图理解为什么在简单的类定义中按引用传递和按值传递不起作用

#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”,正如我所料

标签: c++operator-overloadingpass-by-reference

解决方案


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


推荐阅读