在C++

2009-08-17 209 views
2

重载运营商在年底在C++

见编辑我试图重载C++中的+操作,让我补充两个复数。 (添加真实并添加想象)。

这里是我的重载函数:

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

return result; 
} 

我的复数构造函数接受两个整数和分配率先诠释真正和第二为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()返回双。

+2

你知道'std :: complex'模板吗? – 2009-08-17 15:42:21

+0

我想学习如何做 – 2009-08-17 15:42:56

+0

您需要发布所有'ComplexNum'类的代码。特别是数据成员的定义和你的拷贝构造函数和拷贝赋值操作符(如果用户定义的话)。 – 2009-08-17 15:44:16

回答

3

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

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

或者,也许它只是简单的getReal()方法。

1

它看起来像我的复制构造函数或赋值运算符已损坏。你可以发布这些代码吗?

0

附注:实施operator+的规范方式是作为成员operator+=之上的免费功能。 (同样为-=*=等,BTW)对于任何类型T,它应该是这样的:

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

此约定(其中,IIRC,Stroustrup的属性柯尼希)的理由:

  • ++=(和--=等)几乎相同;为了避免冗余,一个应该在另一个上面执行
  • +=需要更改左操作数,所以它应该是一个成员; +只留下它的论据,所以它应该是一个自由功能
  • 在成员之上实现非成员通常更容易和/或更高效;这种情况也不例外