第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

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

eclipse如何运行springboot项目

《eclipse如何运行springboot项目》:本文主要介绍eclipse如何运行springboot项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目js录当在eclipse启动spring boot项目时出现问题解决办法1.通过cmd命令行2.在ecl

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

Maven项目打包时添加本地Jar包的操作步骤

《Maven项目打包时添加本地Jar包的操作步骤》在Maven项目开发中,我们经常会遇到需要引入本地Jar包的场景,比如使用未发布到中央仓库的第三方库或者处理版本冲突的依赖项,本文将详细介绍如何通过M... 目录一、适用场景说明​二、核心操作命令​1. 命令格式解析​2. 实战案例演示​三、项目配置步骤​1

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1