2

见文末编辑

我试图重载 C++ 中的 + 运算符以允许我添加两个复数。(添加实数并添加虚数)。

这是我的重载函数:

ComplexNum operator+(ComplexNum x, ComplexNum y){
ComplexNum result;
result.real = (x.getReal() + y.getReal());
result.imag = (x.getImag() + y.getImag());

return result;
}

我的复数构造函数接受两个整数,并将第一个分配给 int real,第二个分配给 int imag。

当我尝试添加它们时:

ComplexNum num1 = ComplexNum(1,1);
    ComplexNum num2 = ComplexNum(2,3);
    ComplexNum num3;
    num3 = num1 + num2;
    printf("%d",num3.getReal());

结果我得到0。结果应该是 3(添加了 num1 和 num2 的实部)

编辑:我知道出了什么问题。我有 .getReal() 和 .getImage() 返回双倍。

4

3 回答 3

3

由于 operator+ 的参数被声明为值,而不是引用,它们将通过复制传递,因此如果 ComplexNum 的复制构造函数不起作用,则可能导致 x 和 y 的实部为 0。

加法也有可能起作用,但是当您调用 num3 的赋值运算符时,您会丢失实部。

或者可能只是 getReal() 方法被破坏了。

于 2009-08-17T15:46:09.550 回答
1

在我看来,您的复制构造函数或赋值运算符已损坏。您也可以发布这些代码吗?

于 2009-08-17T15:44:44.387 回答
0

附带说明:实现的规范方法operator+是在 member 之上作为自由函数operator+=。(同样适用于-=*=,顺便说一句。)对于任何类型 T,它应该如下所示:

T operator+(const T& lhs, const T& rhs)
{
   T tmp(lhs); 
   tmp += rhs; //invoke +=
   return tmp;
}

该约定的基本原理(IIRC,Stroustrup 归因于 Koenig):

  • +and +=(and -and -=etc.) 做的几乎一样;为了避免冗余,一个应该在另一个之上实施
  • +=需要改变左操作数,所以应该是成员;+不理会它的参数,所以它应该是一个自由函数
  • 在成员之上实现非成员通常更容易和/或更有效;本案也不例外
于 2009-08-17T19:38:43.513 回答