【C++基础】complex类的实现

【C++基础】complex类的实现,第1张

跟着侯捷视频写了下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)

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1352985.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-14
下一篇2022-06-14

发表评论

登录后才能评论

评论列表(0条)

    保存