跟着侯捷视频写了下complex类的实现,不是完整版的,主要是重载+=和+运算符,实现复数相加以及复数与实数的相加,全局函数重载操作符<<,实现复数的输出,代码及注释如下:
//这段复数类的实现是侯捷将标准库的复数类代码进行挑选后构成的,主要是保留复数相加的功能 #pragma once #ifndef __COMPLEX__ #define __COMPLEX__ #includeclass 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)



