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