
跟着侯捷视频写了下complex类的实现,不是完整版的,主要是重载+=和+运算符,实现复数相加以及复数与实数的相加,全局函数重载 *** 作符<<,实现复数的输出,代码及注释如下:
//这段复数类的实现是侯捷将标准库的复数类代码进行挑选后构成的,主要是保留复数相加的功能
#pragma once
#ifndef __COMPLEX__
#define __COMPLEX__
#include
class complex
{
public:
complex(double r = 0, double i = 0) : re(r), im(i){}
//重载+=
complex& operator += (const complex&);
//两个分别取出实部虚部的成员函数,不用改动属性,记得加const
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;//实部(real part)、虚部(imaginary part),也可以是float,int
friend complex& __doapl(complex*, const complex&);//do asignment plus
};
//重载了real(),imag()
inline double
real(const complex& x)
{
return x.real();
}
inline double
imag(const complex& x)
{
return x.imag();
}
inline complex&
__doapl(complex* ths, const complex& r)//r是指右边对象,ths是访问左边对象的指针,有this指针的作用
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
inline complex&
complex::operator += (const complex& r)
{
return __doapl(this, r);//把+=的 *** 作交给另一个函数去做,出于什么考量?
}
//将 + 号重载写成全局函数,因为实数也可以和复数相加,而不仅是复数之间相加
//两数相加,而不是之前成员函数右边对象加到左边对象里面,所以需要创建一个临时变量,因此返回值类型不能是引用
inline complex
operator + (const complex& x, const complex& y)
{
return complex(real(x) + real(y), imag(x) + imag(y));//临时对象的语法,类名();该类的作用域仅限于这条语句
//real(x)调用了重载后的全局函数
}
//复数和实数的相加
inline complex
operator + (const complex& x, double y)
{
return complex(real(x) + y, imag(y));
}
inline complex
operator + (double x, const complex& y)
{
return complex(x + real(y), imag(y));
}
// *** 作符重载,输出复数
inline std::ostream&
operator<<(std::ostream& os, const complex& x)
{
return os << '( ' << real(x) << ',' << imag(x) << ')';
}
#endif
后面有空看一下完整版的并写个测试,顺带看下MSVC的complex源码(挖个坑233)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)