如何在声明期间将操作分配给复数
How to assign an operation to a complex number during the declaration?
我正在为复数编写一个类,当我声明其中一个时,我必须在我可以为其分配操作之前和之后声明它。
例如:
这有效:
ComplexNumber Number;
Number = AnotherComplex + (or -) AgainAnotherComplex;
这不起作用:
ComplexNumber Number = AnotherComplex + (or -) AgainAnotherComplex;
我留在这里的是.h文件:
#ifndef COMPLEX_NUMBERS_H_INCLUDED
#define COMPLEX_NUMBERS_H_INCLUDED
#include <iostream> // for std namespace
class ComplexNumber
{
public:
ComplexNumber();
ComplexNumber(float RealPart, float ImaginaryPart);
ComplexNumber(ComplexNumber &NewComplexNumber);
~ComplexNumber();
void SetRealPart(float RealPart);
void SetImaginaryPart(float ImaginaryPart);
friend ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend std::ostream & operator<<(std::ostream &output, const ComplexNumber &NumberToDsiplay);
friend std::istream & operator >>(std::istream &input, ComplexNumber &NumberToInput);
bool operator==(const ComplexNumber Complex);
bool operator!=(const ComplexNumber Complex);
private:
float RealPart;
float ImaginaryPart;
};
#endif // COMPLEX_NUMBERS_H_INCLUDED
我还在这里留下了.cpp文件:
#include "Complex Numbers.h"
ComplexNumber::ComplexNumber()
{
RealPart = 0;
ImaginaryPart = 0;
}
ComplexNumber::ComplexNumber(float RealPart, float ImaginaryPart)
{
SetRealPart(RealPart);
SetImaginaryPart(ImaginaryPart);
}
ComplexNumber::~ComplexNumber()
{
}
ComplexNumber::ComplexNumber(ComplexNumber &NewComplexNumber)
{
RealPart = NewComplexNumber.RealPart;
ImaginaryPart = NewComplexNumber.ImaginaryPart;
}
void ComplexNumber::SetRealPart(float RealPart)
{
this->RealPart=RealPart;
}
void ComplexNumber::SetImaginaryPart(float ImaginaryPart)
{
this->ImaginaryPart=ImaginaryPart;
}
ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2)
{
ComplexNumber TemporaryComplexNumber;
TemporaryComplexNumber.RealPart = Complex1.RealPart + Complex2.RealPart;
TemporaryComplexNumber.ImaginaryPart = Complex1.ImaginaryPart + Complex2.ImaginaryPart;
return TemporaryComplexNumber;
}
ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2)
{
ComplexNumber TemporaryComplexNumber;
TemporaryComplexNumber.RealPart = Complex1.RealPart - Complex2.RealPart;
TemporaryComplexNumber.ImaginaryPart = Complex1.ImaginaryPart - Complex2.ImaginaryPart;
return TemporaryComplexNumber;
}
std::ostream & operator<<(std::ostream &output, const ComplexNumber &NumberToDsiplay)
{
if(NumberToDsiplay.ImaginaryPart > 0)
output << std::endl << NumberToDsiplay.RealPart << "+" << NumberToDsiplay.ImaginaryPart << "i";
else if(NumberToDsiplay.ImaginaryPart < 0)
output << std::endl << NumberToDsiplay.RealPart << "" << NumberToDsiplay.ImaginaryPart << "i";
else if(NumberToDsiplay.ImaginaryPart == 0)
output << std::endl << NumberToDsiplay.RealPart << " (The imaginary part is equal to 0)";
return output;
}
std::istream & operator >>(std::istream &input, ComplexNumber &NumberToInput)
{
std::cout << "Enter the real part: ";
input >> NumberToInput.RealPart;
std::cout << "Enter the imaginary part: ";
input >> NumberToInput.ImaginaryPart;
}
bool ComplexNumber::operator==(const ComplexNumber Complex)
{
return RealPart==Complex.RealPart && ImaginaryPart==Complex.ImaginaryPart;
}
bool ComplexNumber::operator!=(const ComplexNumber Complex)
{
if(RealPart != Complex.RealPart && ImaginaryPart != Complex.ImaginaryPart)
return true;
else if(RealPart != Complex.RealPart && (!(ImaginaryPart != Complex.ImaginaryPart)))
return true;
else if(ImaginaryPart != Complex.ImaginaryPart && (!(RealPart != Complex.RealPart)))
return true;
return false;
}
只需像这样声明复制构造函数
ComplexNumber( const ComplexNumber &NewComplexNumber);
^^^^^
否则,编译器无法将非常量引用绑定到作为表达式结果的临时引用
AnotherComplex + (or -) AgainAnotherComplex
调用任一运算符
friend ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2);
反过来应该声明为:
friend ComplexNumber operator+(const ComplexNumber &Complex1, const ComplexNumber &Complex2);
friend ComplexNumber operator-(const ComplexNumber &Complex1, const ComplexNumber &Complex2);
也就是说,参数应该是引用的类型。
而这个运算符定义
bool ComplexNumber::operator!=(const ComplexNumber Complex)
{
if(RealPart != Complex.RealPart && ImaginaryPart != Complex.ImaginaryPart)
return true;
else if(RealPart != Complex.RealPart && (!(ImaginaryPart != Complex.ImaginaryPart)))
return true;
else if(ImaginaryPart != Complex.ImaginaryPart && (!(RealPart != Complex.RealPart)))
return true;
return false;
}
没有多大意义。
定义它像
bool ComplexNumber::operator!=(const ComplexNumber &Complex) const
{
return not( *this == Complex );
}
注意参数列表后面的限定符const
。您需要添加到operator ==
的相同限定符。
声明
中的=
不是赋值。
ComplexNumber a = b + c;
只是另一种写作方式
ComplexNumber a(b + c);
即,它通过调用复制构造函数从b + c
初始化a
。
复制构造函数声明为
ComplexNumber(ComplexNumber &NewComplexNumber);
它通过引用来接受其论点。引用不能绑定到临时值,例如表达式的结果(例如 a + b
,a - b
(。
修复:
ComplexNumber(const ComplexNumber &NewComplexNumber);
根据经验,复制构造函数应始终通过 const 引用获取其参数。
添加一个常量复制构造函数:
ComplexNumber::ComplexNumber(const ComplexNumber & NewComplexNumber)
该行ComplexNumber Number = a + b;
调用类的复制构造函数。但是,a + b
的结果是 r 值,您提供的唯一复制构造函数仅采用 l 值。
相关文章:
- 使用操作重载对象重新分配对象
- 在可拆卸线程完成操作时取消分配内存
- 奇怪的 while 循环与分配操作C++
- 操作后通过运算符分配对象
- 我的移动分配操作程序重载的分段错误
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 如何在声明期间将操作分配给复数
- 为什么在执行增量操作之前分配指针值
- 是``if`语句''在modulo之前和分配操作之前的冗余
- 特征库,简单的线性代数操作,具有稀疏的矩阵,增加了其分配的尺寸
- Valarray 就地操作作为临时分配给出不同的结果
- 成员初始化器列表中的分配操作
- 此副本分配操作安全吗?
- 此对象创建期间发生哪些复制/分配操作
- 重载分配操作/流
- 我可以在两个istream_iterators之间执行分配操作吗?
- 在单个语句中将类类型分配给该类的取消引用指针时执行哪些操作
- c++ 的默认分配操作行为是什么?
- 为什么检查分配操作的结果有效,但不能与其他条件相结合
- 是否有一个std模板类用于管理带有指针的对象并提供复制/移动/分配操作