第8周-任务1-方案2-复数类中运算符重载(非成员函数实现)

简介: 接:第8周-任务1-方案1-复数类中运算符重载(成员函数实现) 本文用方案二求解:用类的友元函数,而不是成员函数,完成上面提及的运算符的重载; 【讲解视频】 【参考解答】 #include <iostream>using namespace std;class Complex{public: Complex(){real=0;imag=0;}

接:第8周-任务1-方案1-复数类中运算符重载(成员函数实现)

本文用方案二求解:用类的友元函数,而不是成员函数,完成上面提及的运算符的重载;

【讲解视频】


【参考解答】

#include <iostream>
using namespace std;
class Complex
{
public:
	Complex(){real=0;imag=0;}
	Complex(double r,double i){real=r;imag=i;}
	friend Complex operator+(Complex &c1, Complex &c2);
	friend Complex operator-(Complex &c1, Complex &c2);
	friend Complex operator*(Complex &c1, Complex &c2);
	friend Complex operator/(Complex &c1, Complex &c2);
	void display();
private:
	double real;
	double imag;
};

//复数相加:(a+bi)+(c+di)=(a+c)+(b+d)i. 
Complex operator+(Complex &c1, Complex &c2)
{
	Complex c;
	c.real=c1.real+c2.real;
	c.imag=c1.imag+c2.imag;
	return c;
}

//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.
Complex operator-(Complex &c1, Complex &c2)
{
	Complex c;
	c.real=c1.real-c2.real;
	c.imag=c1.imag-c2.imag;
	return c;
}

//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
Complex operator*(Complex &c1, Complex &c2)
{
	Complex c;
	c.real=c1.real*c2.real-c1.imag*c2.imag;
	c.imag=c1.imag*c2.real+c1.real*c2.imag;
	return c;
}

//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i 
Complex operator/(Complex &c1, Complex &c2)
{
	Complex c;
	c.real=(c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
	c.imag=(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
	return c;
}

void Complex::display()
{
	cout<<"("<<real<<","<<imag<<"i)"<<endl;
}

int main()
{
	Complex c1(3,4),c2(5,-10),c3;
	cout<<"c1=";
	c1.display();
	cout<<"c2=";
	c2.display();
	c3=c1+c2;
	cout<<"c1+c2=";
	c3.display();
	c3=c1-c2;
	cout<<"c1-c2=";
	c3.display();
	c3=c1*c2;
	cout<<"c1*c2=";
	c3.display();
	c3=c1/c2;
	cout<<"c1/c2=";
	c3.display();
	system("pause");
	return 0;
}
【进一步扩展】事实上,运算符重载的函数还可以定义成一般函数,只不过这种做法并不好。下面给出使用一般函数完成运算符重载的程序。其中,加了序号的3处注释值得关注。

#include <iostream>
using namespace std;
class Complex
{
public:
	Complex(){real=0;imag=0;}
	Complex(double r,double i){real=r;imag=i;}
	double getReal() const {return real;}  //(1)定义公用的数据接口,可以为const成员函数
	double getImag() const {return imag;}
	void setReal(double r){real=r;}        //(1)定义公用的数据接口
	void setImag(double i){imag=i;}


	void display();
private:
	double real;
	double imag;
};

//复数相加:(a+bi)+(c+di)=(a+c)+(b+d)i. 
Complex operator+(const Complex &c1, const Complex &c2) //(3)将参数处理为const更符合需求
{
	Complex c;
	c.setReal(c1.getReal()+c2.getReal());   //(2)调用公用数据接口读取和修改私有数据成员
	c.setImag(c1.getImag()+c2.getImag());
	return c;
}

//复数相减:(a+bi)-(c+di)=(a-c)+(b-d)i.
Complex operator-(const Complex &c1, const Complex &c2)
{
	Complex c;
	c.setReal(c1.getReal()-c2.getReal());
	c.setImag(c1.getImag()-c2.getImag());
	return c;
}

//复数相乘:(a+bi)(c+di)=(ac-bd)+(bc+ad)i.
Complex operator*(const Complex &c1, const Complex &c2)
{
	Complex c;
	c.setReal(c1.getReal()*c2.getReal()-c1.getImag()*c2.getImag());
	c.setImag(c1.getImag()*c2.getReal()+c1.getReal()*c2.getImag());
	return c;
}

//复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i 
Complex operator/(const Complex &c1, const Complex &c2)
{
	Complex c;
	double d= (c2.getReal()*c2.getReal()+c2.getImag()*c2.getImag());
	c.setReal((c1.getReal()*c2.getReal()+c1.getImag()*c2.getImag())/d);
	c.setImag((c1.getImag()*c2.getReal()-c1.getReal()*c2.getImag())/d);
	return c;
}

void Complex::display()
{
	cout<<"("<<real<<","<<imag<<"i)"<<endl;
}

int main()
{
	Complex c1(3,4),c2(5,-10),c3;
	cout<<"c1=";
	c1.display();
	cout<<"c2=";
	c2.display();
	c3=c1+c2;
	cout<<"c1+c2=";
	c3.display();
	c3=c1-c2;
	cout<<"c1-c2=";
	c3.display();
	c3=c1*c2;
	cout<<"c1*c2=";
	c3.display();
	c3=c1/c2;
	cout<<"c1/c2=";
	c3.display();
	system("pause");
	return 0;
}


目录
相关文章
|
存储 缓存 数据可视化
基于Vue.js+Node问卷调查系统的设计与实现(二)
基于Vue.js+Node问卷调查系统的设计与实现
1042 1
基于Vue.js+Node问卷调查系统的设计与实现(二)
|
机器学习/深度学习 自然语言处理 并行计算
社区供稿 | Para-Former:DUAT理论指导下的CV神经网络并行化,提速多层模型推理
神经网络正越来越多地朝着使用大数据训练大型模型的方向发展,这种解决方案在许多任务中展现出了卓越的性能。然而,这种方法也引入了一个迫切需要解决的问题:当前的深度学习模型基于串行计算,这意味着随着网络层数的增加,训练和推理时间也会随之增长。
294 28
|
8月前
|
监控 安全 Java
现代 Java 技术开发宠物管理系统实操案例解析
本文通过一个宠物管理系统项目,深入讲解Java中的封装、继承和多态特性。系统基于Java 8+开发,结合Stream API与Lambda表达式,展示现代Java技术的实际应用。封装部分使用Record类简化数据模型,继承设计通过抽象类与接口实现代码复用,多态则通过统一接口处理不同宠物行为。案例涵盖模板方法模式、策略模式等设计思想,并提供最佳实践建议,解决常见问题如继承滥用和类型转换异常。资源地址:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
303 0
|
敏捷开发 运维 Devops
如何构建高效的价值交付系统?详解项目管理中的核心要素
3分钟了解价值交付系统的组成和使用方法。
430 0
如何构建高效的价值交付系统?详解项目管理中的核心要素
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【6月更文挑战第30天】Spring Cloud是Java微服务治理明星框架,整合Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(断路器)、Zuul(API网关)和Config Server(配置中心),提供完整服务治理解决方案。通过Eureka实现服务注册与发现,Ribbon进行负载均衡,Hystrix确保服务容错,Config Server集中管理配置,Zuul则作为API入口统一处理请求。理解和使用Spring Cloud是现代Java开发者的关键技能。
374 2
|
人工智能 物联网 编译器
《近阈值计算:硬件加速芯片的低功耗密码》
近阈值计算(NTC)技术通过将晶体管工作电压降至接近阈值电压,有效降低功耗并提升芯片性能,成为硬件加速芯片领域的研究热点。NTC优化了电路设计、器件选型和系统级协同设计,采用流水线技术和冗余设计提高稳定性和可靠性。尽管面临性能、稳定性和设计复杂性的挑战,NTC为低功耗高性能芯片提供了新方向,推动人工智能、物联网等领域的发展。
453 15
|
弹性计算 网络协议 数据库
在阿里云国际站上解析域名到服务器详细教程
在阿里云国际站上解析域名到服务器详细教程
|
传感器 人工智能 算法
AI技术在智慧城市建设中的应用与前景
传统的城市规划和管理面临诸多挑战,如交通拥堵、资源浪费、环境污染等。随着人工智能技术的发展,其在智慧城市建设中的应用成为解决这些问题的关键。本文将探讨AI技术在智慧城市建设中的应用现状与前景,从智能交通管理、智能能源利用、智慧环境监测等方面进行分析,展望AI技术为智慧城市带来的巨大潜力与发展方向。
618 27
|
存储 人工智能 自然语言处理
DeepSparse: 通过剪枝和稀疏预训练,在不损失精度的情况下减少70%的模型大小,提升三倍速度
该论文提出了一种新方法,用于创建高稀疏性大型语言模型,通过稀疏预训练和高效部署,在保持高准确度的同时显著提升处理速度。方法包括结合SparseGPT剪枝和稀疏预训练,实现70%稀疏度下准确率完全恢复,尤其适合复杂任务。实验显示,使用Cerebras CS-3 AI加速器和Neural Magic的DeepSparse、nm-vllm引擎,训练和推理速度有显著提升。此外,量化稀疏模型在CPU上速度提升可达8.6倍。这种方法优于传统剪枝,为构建更快、更小的语言模型提供了新途径,并通过开源代码和模型促进了研究复现和扩展。
527 3
|
前端开发
掌握React中的useCallback:优化性能的秘诀
掌握React中的useCallback:优化性能的秘诀