Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复数的加法运算符重载_C++ - Fatal编程技术网

C++ 复数的加法运算符重载

C++ 复数的加法运算符重载,c++,C++,我已经编写了以下代码来对复数的基本运算进行运算符重载,这里我只添加了加法。运行它时,我会遇到数万亿个错误。我已经看到了其他一些关于这方面的帖子,但我刚刚开始学习C++。如果您能大体上指出我在运算符重载中所犯的错误,我将不胜感激(这与调试无关,但我希望您能给出一些一般性的解释,因为我已经看到了相同运算符重载的示例,但无法理解一些特性,例如指针和常量的使用)。提前谢谢 #include<iostream> using namespace std; class Complex { p

我已经编写了以下代码来对复数的基本运算进行运算符重载,这里我只添加了加法。运行它时,我会遇到数万亿个错误。我已经看到了其他一些关于这方面的帖子,但我刚刚开始学习C++。如果您能大体上指出我在运算符重载中所犯的错误,我将不胜感激(这与调试无关,但我希望您能给出一些一般性的解释,因为我已经看到了相同运算符重载的示例,但无法理解一些特性,例如指针和常量的使用)。提前谢谢

#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;
}
#包括
使用名称空间std;
阶级情结
{
私人:
双实数;
双重想象;
公众:
复合物(双r,双i);
//加成
复数运算符+(复数c1,复数c2);
};
复数::复数(双r,双i)
{
实=r;
假想=i;
}
复数复数::运算符+(复数c1,复数c2)
{
复杂结果;
结果r=c1.r+c2.r;
结果i=c1.i+c2.i;
返回结果;
}

ostream ostream::operator这里有大量错误,从错误尝试重载运算符到使用错误名称的数据成员。我会仔细检查我看到的


将二进制
运算符+
定义为成员函数时,它只接受一个参数,即
+
的右侧参数(左侧隐式地是
*此

此外,您的运算符使用不存在的字段
r
i
——您可能指的是
real
virtual

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@w.b谢谢,修好了。我还将运算符更改为通过引用返回ostream,因为通过值返回抽象类型是毫无意义的。free
operator+()
函数的参数应该采用对const的左值引用。@0x499602D2很好地理解了这一点。我曾想过通过引用来传递
复杂的
对象,但我决定不这样做,因为从技术上讲这不是一个错误,默认的copy-ctor会做正确的事情。最糟糕的情况是效率低下。顺便说一句,操作员
class Complex
{
    // ...

    friend ostream & operator<<(ostream &, Complex);
};

ostream & operator<<(ostream & out, Complex number)
{
    out << number.real << "+" << number.imaginary << endl;
    return out;
}
class Complex
{
    // ...

public:
    Complex();
};

Complex::Complex() : real(0), imaginary(0) { }