添加运算符重载复数

时间:2014-12-15 20:41:19

标签: c++

我编写了以下代码来对复数进行基本操作的运算符重载,这里我只添加了。运行它时,我得到了数万亿的错误。我已经看过其他几篇关于此的帖子,但我刚开始学习C ++。如果您能够指出我在运算符重载中所犯的错误,我将非常感激(这不是关于调试,但我会欣赏一些一般性的解释,因为我已经看到相同运算符重载的示例但无法理解几个功能比如使用指针和const)。提前致谢。

#include<iostream>

using namespace std;

class Complex 
{
private: 
    double real;
    double imaginary;

public:
    Complex(double r, double i);    
    // addition
    Complex operator+(Complex c1, Complex c2);      
};

Complex::Complex(double r, double i)
{
    real = r;
    imaginary = i;
}

Complex Complex::operator+(Complex c1, Complex c2) 
{
    Complex result;
    result.r = c1.r + c2.r;
    result.i = c1.i + c2.i;
    return result;
}

ostream ostream::operator<<(ostream out, Complex number)
{
    out << number.r << "+" << number.i << endl;
}

int main() {
    Complex y, z;
    Complex sum;
    y = Complex(2, 4);
    z = Complex(3, 0);

    cout << "y is: " << y << endl;
    cout << "z is: " << z << endl;

    sum = y+z;

    cout << "The sum (y+z) is: " << sum << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

这里存在大量错误,从错误尝试重载运算符到使用错误名称的数据成员。我会逐步完成我所看到的。


当将二进制operator+定义为成员函数时,它只需要一个参数,这是+的右手参数(左手是隐式的*this)。 / p>

您的运营商也会使用不存在的字段ri - 您可能需要realimaginary

class Complex
{
    // ...

public:
    // Wrong, will cause compile-time errors:
    // Complex operator+(Complex c1, Complex c2);  

    // Right:
    Complex operator+(Complex c);
};

Complex Complex::operator+(Complex c) 
{
    Complex result;
    result.real = real + c.real;
    result.imaginary = imaginary + c.imaginary;
    return result;
}

或者你可以将运算符定义为自由函数而不是作为类的成员,但是你必须使它成为类的朋友,因为它访问私有成员:

class Complex
{
    // ...

    friend Complex operator+(Complex, Complex);
};

Complex operator+(Complex c1, Complex c2) 
{
    Complex result;
    result.real = c1.real + c2.real;
    result.imaginary = c1.imaginary + c2.imaginary;
    return result;
}

同样,operator<<的{​​{1}}重载应该是免费功能,需要修复才能使用std::ostreamreal。但是,由于这些成员是imaginary的私有成员,除非您将此运算符设为Complex的朋友,否则这将失败。由于Complex是抽象类型,您无法通过值接受或返回实例,因此您需要使用引用。此外,你实际上没有返回任何东西。

ostream

您的class Complex { // ... friend ostream & operator<<(ostream &, Complex); }; ostream & operator<<(ostream & out, Complex number) { out << number.real << "+" << number.imaginary << endl; return out; } 类缺少默认构造函数,因此您无法声明Complex之类的变量,因为这需要存在默认构造函数:

Complex c;