#include "Complex.h"
// 求平方宏
#define SQUARE(__X__) ((__X__) * (__X__))
// 默认构造函数
CComplex::CComplex (void)
: _dReal (0.f)
, _dImage (0.f)
{
cout << "Default Ctor Called." << endl;
}
// 重载的构造函数
CComplex::CComplex (double dReal, double dImage /*= 0.f*/)
: _dReal (dReal)
, _dImage (dImage)
{
cout << "Overloaded Ctor Called." << endl;
}
// 拷贝构造函数
CComplex::CComplex (const CComplex &other)
{
_dReal = other._dReal;
_dImage = other._dImage;
cout << "Copy Ctor Called." << endl;
}
// 析构函数
CComplex::~CComplex (void)
{
}
// = 运算符重载
CComplex CComplex::operator= (const CComplex &B)
{
this->_dReal = B._dReal;
this->_dImage = B._dImage;
cout << "CComplex::operator= () Called." << endl;
return *this;
}
// + 运算符重载
CComplex CComplex::operator+ (const CComplex &B)
{
CComplex ret;
ret._dReal = this->_dReal + B._dReal;
ret._dImage = this->_dImage + B._dImage;
return ret;
}
// - 运算符重载
CComplex CComplex::operator- (const CComplex &B)
{
CComplex ret;
ret._dReal = this->_dReal - B._dReal;
ret._dImage = this->_dImage - B._dImage;
return ret;
}
// 前++ 运算符重载
CComplex CComplex::operator++ (void)
{
++this->_dReal;
return *this;
}
// 前-- 运算符重载
CComplex CComplex::operator-- (void)
{
--this->_dReal;
return *this;
}
// * 运算符重载
CComplex operator* (const CComplex &A, const CComplex &B)
{
CComplex ret;
ret._dReal = A._dReal * B._dReal - A._dImage * B._dImage;
ret._dImage = A._dReal * B._dImage + A._dImage * B._dReal;
return ret;
}
// / 运算符重载
CComplex operator/ (const CComplex &A, const CComplex &B)
{
CComplex ret;
// 分母的值,有理化后
double denom = SQUARE (B._dReal) + SQUARE (B._dImage);
if (fabs (denom) < 1E-6) {
throw "不能除以0.";
}
ret._dReal = (A._dReal * B._dReal + A._dImage * B._dImage) / denom;
ret._dImage = (-A._dReal * B._dImage + A._dImage * B._dReal) / denom;
return ret;
}
// 后++ 运算符重载
CComplex operator++ (CComplex &complex, int)
{
CComplex ret = complex;
complex._dReal++;
return ret;
}
// 后-- 运算符重载
CComplex operator-- (CComplex &complex, int)
{
CComplex ret = complex;
complex._dReal--;
return ret;
}
// 输入流 >> 运算符重载
istream& operator>> (istream &in, CComplex &complex)
{
cout << "Input Real Part:";
in >> complex._dReal;
cout << "Input Image Part:";
in >> complex._dImage;
return in;
}
// 输出流 << 运算符重载
ostream& operator<< (ostream &out, const CComplex &complex)
{
// 如果实部不为0或者实部虚部都为0,输出
if (fabs (complex._dReal) > 1E-6 || fabs (complex._dImage) < 1E-6)
{
out << complex._dReal;
}
// 如果虚部为0,不输出
if (fabs (complex._dImage) > 1E-6)
{
out << (complex._dImage > 0 ? "+" : "-");
// 如果虚部为正负1,不显示
if (fabs (fabs (complex._dImage) - 1) > 1E-6)
{
out << fabs (complex._dImage);
}
out << "i";
}
return out;
}