代码之家  ›  专栏  ›  技术社区  ›  irl_irl

C++中的重载运算符

  •  2
  • irl_irl  · 技术社区  · 16 年前

    见结尾处的编辑

    我试图在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()返回double。

    3 回复  |  直到 16 年前
        1
  •  3
  •   sepp2k    16 年前

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

    添加也可能有效,但当调用num3的赋值运算符时,会丢失实际部分。

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

        2
  •  1
  •   Kaz Dragon    16 年前

    在我看来,您的复制构造函数或赋值运算符已损坏。你也可以把代码贴上去吗?

        3
  •  0
  •   sbi    16 年前

    附带说明:实现的规范方法 operator+ 在成员的顶部作为自由函数 operator+= . (同样适用于 -= , *= 等等,顺便说一句),对于任何类型的T,它应该是这样的:

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

    本公约的基本原理(其中,IIRC,stroustrup属于koenig):

    • + += (和) - -= 等等)做的差不多;为了避免冗余,一个应该在另一个之上实现。
    • += 需要更改左操作数,因此它应该是成员; + 只保留其参数,因此它应该是一个自由函数
    • 在成员之上实现非成员通常更容易和/或更高效;这种情况也不例外。
    推荐文章