栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968590.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号