第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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

Springboot项目登录校验功能实现

《Springboot项目登录校验功能实现》本文介绍了Web登录校验的重要性,对比了Cookie、Session和JWT三种会话技术,分析其优缺点,并讲解了过滤器与拦截器的统一拦截方案,推荐使用JWT... 目录引言一、登录校验的基本概念二、HTTP协议的无状态性三、会话跟android踪技术1. Cook

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav