Этот код вызывает утечку памяти, поскольку указатель a
автоматически удаляется после достижения конца области, и у вас нет возможности удалить память, выделенную в куче на new
. К несчастью для вас, вы разыменовали a
непосредственно перед его удалением в операторе return
, и вы смогли получить доступ к его значению, думая, что все в порядке.
ComplexNum& ComplexNum::operator+(const ComplexNum& other)
{
ComplexNum* a = new ComplexNum(real + other.getReal(), imaginary + other.getImaginary());
return *a;
}
Если честно, большая часть кода, которую вы имеете, может быть исключена с помощью спецификатора = default
или вообще без него. Используйте его, потому что он облегчает чтение кода.
Операторы, которые используются для возврата нового экземпляра класса (например, +,-,*,/
), не должны возвращаться по ссылке. Операторы, которые изменяют текущий экземпляр класса (например, =,+=,-=,*=,/=
), должны быть возвращены по ссылке.
#include <iostream>
struct ComplexNum
{
int real;
int imaginary;
ComplexNum() = default;
ComplexNum(int x, int y) : real(x), imaginary(y)
{;}
friend std::ostream& operator <<(std::ostream& out, const ComplexNum& a)
{
out << a.real << " & " << a.imaginary << "j";
return out;
}
ComplexNum operator + (const ComplexNum &other)
{
int r = this->real + other.real;
int i = this->imaginary + other.imaginary;
return ComplexNum(r,i);
}
ComplexNum& operator += (const ComplexNum &other)
{
this->real += other.real;
this->imaginary += other.imaginary;
return *this;
}
~ComplexNum() = default;
};
int main()
{
ComplexNum c1(3, 4);
std::cout << c1 << std::endl;
ComplexNum c2(5, 6);
std::cout << c2 << std::endl;
ComplexNum c3 = c1 + c2;
std::cout << c3 << std::endl;
c3 += c1;
std::cout << c3 << std::endl;
}
Результаты:
3 & 4j
5 & 6j
8 & 10j
11 & 14j
Пример кода онлайн: https://rextester.com/QNR88316