第6周项目6--复数模板类-友元

2024-04-10 13:58
文章标签 模板 项目 友元 复数

本文主要是介绍第6周项目6--复数模板类-友元,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*
* Copyright (c) 2015, 烟台大学计算机学院
* All rights reserved.
* 文件名称:test.cpp
* 作    者:姜甜甜
* 完成日期:2015年 4 月 14日
* 版 本 号:v1.0
*
* 可以通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时指定的实际类型。
(1)要求类成员函数在类外定义。
(2)在此基础上,再实现减法、乘法和除法
*/
#include <iostream>
using namespace std;
template<class T> //数据类型
class Complex
{
public:
Complex(T x,T y):a(x),b(y) {}
Complex()
{
a=0;
b=0;
}
void display();
Complex<T>complex_add(Complex <T> &t);
Complex<T>complex_minus(Complex <T> &t);
Complex<T>complex_multiply(Complex <T> &t);
Complex<T>complex_divide(Complex <T> &t);
private:
T a;
T b;
};
template <class T>
void Complex<T>::display()
{
cout<<a;
if(b>=0)
cout<<"+";
cout<<b<<"i"<<endl;
}
template <class T>
Complex<T> Complex<T>::complex_add(Complex <T> &t)
{
Complex <T>f;
f.a=a+t.a;
f.b=b+t.b;
return f;
}
template <class T>
Complex<T> Complex<T>::complex_minus(Complex <T> &t)
{
Complex <T>f;
f.a=a-t.a;
f.b=b-t.b;
return f;
}
template <class T>
Complex<T> Complex<T>::complex_multiply(Complex <T> &t)
{
Complex <T>f;
f.a=a*t.a-b*t.b;
f.b=a*t.b+b*t.a;
return f;
}
template <class T>  //复数相除:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +(bc-ad)/(c^2+d^2)i
Complex<T> Complex<T>::complex_divide(Complex <T> &t)
{
Complex <T>f;
f.a=(a*t.a+b*t.b)/((t.a*t.a)+(t.b*t.b));
f.b=(b*t.a-a*t.b)/((t.a*t.a)+(t.b*t.b));
return f;
}
int main( )
{
Complex<int> c1(3,4),c2(5,-10),c3;   //实部和虚部是int型
c3=c1.complex_add(c2);
cout<<"c1+c2=";
c3.display( );
Complex<double> c4(3.1,4.4),c5(5.34,-10.21),c6; //实部和虚部是double型
c6=c4.complex_add(c5);
cout<<"c4+c5=";
c6.display( );
c3=c1.complex_minus(c2);
cout<<"c1-c2=";
c3.display();
c3=c1.complex_multiply(c2);
cout<<"c1*c2=";
c3.display();
c3=c1.complex_divide(c2);
cout<<"c1/c2=";
c3.display();
return 0;
}


增加友元函数的使用

#include <iostream>
using namespace std;
template<class T> //<span style="color:#ff0000;">类声明前加模板的声明  </span> 
class Complex
{
public:
Complex(T x,T y):a(x),b(y) {}  <span style="color:#ff0000;">//类声明中的每一个T,将被对象定义时提供的实际类型代替 </span>  
Complex()
{
a=0;
b=0;
}
void display();
Complex complex_add(Complex &t);
template<class T1>  <span style="color:#990000;"> //要重新定义
</span>    friend Complex <T1>add_complex(Complex <T1> &,Complex <T1> &);
private:
T a;
T b;
};
template <class T>  <span style="color:#cc0000;">//每一个成员函数的定义前,必须要声明类模板 
</span>void Complex<T>::display()   <span style="color:#cc0000;">//使用了模板的类,将不再独立使用,其类名的完整表示为“类模板名<虚拟类型参数>”   
</span>{
cout<<a;
if(b>=0)
cout<<"+";
cout<<b<<"i"<<endl;
}
template <class T>
Complex<T> Complex<T>::complex_add(Complex <T> &t)
{
Complex <T>f;
f.a=a+t.a;
f.b=b+t.b;
return f;
}
template <class T1>
Complex<T1> add_complex(Complex<T1> &t1,Complex<T1> &t2)
{
Complex<T1> f;
f.a=t1.a+t2.a;
f.b=t1.b+t2.b;
return f;
}
int main( )
{
Complex<int> c1(3,4),c2(5,-10),c3;
c3=c1.complex_add(c2);  //调用成员函数支持加法运算,有一个形参
cout<<"c1+c2=";
c3.display( );
Complex<double> c4(3.1,4.4),c5(5.34,-10.21),c6;
c6=c4.complex_add(c5);  //调用成员函数支持加法运算,有一个形参
cout<<"c4+c5=";
c6.display( );
Complex<int> c7;
c7=add_complex(c1,c2);  //调用友员函数支持加法运算,有两个形参
cout<<"c1+c2=";
c7.display( );
Complex<double> c8;
c8=add_complex(c4,c5);  //调用友员函数支持加法运算,有两个形参
cout<<"c4+c5=";
c8.display( );
return 0;
}



 

这篇关于第6周项目6--复数模板类-友元的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891258

相关文章

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx