西安石油大学C++上机实验 上机二:友元和运算符重载程序设计(2学时)

news2025/3/1 13:31:47

上机二:友元和运算符重载程序设计(2学时)

实验目的:

了解友元函数的概念。

掌握友元函数的定义和使用方法。

了解运算符重载的概念和使用方法。

掌握几种常用的运算符重载的方法。

实验内容

编写一个时间类,实现时间的加、减运算并输出。

上机内容

1.练习友元函数的定义和运算符重载的方法;

2.测试章节例题,设计运算符重载的复数类,实现常用复数运算操作,分别重载为类的成员函数和重载为类的友元函数,并编写一个测试程序进行测试。

(4)编辑头文件。在弹出的 Complex.h 头文件中添加 Complex 类的代码,
完成如下。

步骤 a:声明程序设计所需要包含的头文件:
#include <iostream.h>
步骤 b:根据题目要求:定义复数类:Complex 类:
class Complex
{
……
};
步骤 c:定义类中成员变量:
private:
double real; //实部
double image; //虚部
步骤 d:将加法运算符重载为类的友元函数:
friend Complex operator+(const Complex &x,const Complex &y); //类内函
数说明
23
inline Complex operator+(const Complex &x,const Complex &y); //类外函
数实现 
{
return Complex(x.real+y.real,x.image+y.image);
}
步骤 e:将减法运算符重载为类的友元函数:
friend Complex operator-(const Complex &x,const Complex &y); //类内函数
说明
inline Complex operator-(const Complex &x,const Complex &y) //类外函
数实现 
{
return Complex(x.real-y.real,x.image-y.image);
}
步骤 f:定义成员函数:
构造函数:
Complex(double x=0, double y=0):real(x),image(y){} 
析构函数:
~ Complex (){}
将乘法运算符重载为类的成员函数:
Complex operator*(const Complex &x) const; //类内函数声明
inline Complex Complex::operator*(const Complex &x) const //类外函数实{
return Complex(real*x.real-image*x.image,real*x.image+image*x.real);
}
将除法运算符重载为类的成员函数:
Complex operator/(const Complex &x) const; //类内函数声明
inline Complex Complex::operator/(const Complex &x) const //类外函数实现 
24
{
double m;
m=x.real*x.real+x.image*x.image;
 return Complex((real*x.real+image*x.image)/m,
(image*x.real-real*x.image)/m);
}
输出成员函数:
void Show(); //类内函数声明
void Complex::Show() //类外函数实现 
{
cout<<"("<<real<<","<<image<<"i)"<<endl;
}6)添加源文件代码。在 Complextest.cpp 文件中添加主程序代码,详细代
码如下:
#include "Complex.h" //包含 Complex.h 头文件
void main()
{
Complex a(1,2),b(2,3),c,d,e,f; 
c=a+b; 
cout<<"两个复数之和为:"<<endl;
c.Show(); 
d=a-b; 
cout<<"两个复数之差为:"<<endl;
d.Show(); 
 e=a*b; 
cout<<"两个复数的乘积为:"<<endl;
e.Show();
26
 f=a/b; 
cout<<"两个复数的除法运算结果为:"<<endl;
f.Show();
}

在这里插入图片描述
在这里插入图片描述

实验内容

编写一个时间类,实现时间的加、减运算并输出。

#include <iostream>
#include <iomanip>
using namespace std;

class Time {
	private://定义时间类中的私有对象hour minute second
		int hour;
		int minute;
		int second;

	public:
		Time(int h = 0, int m = 0, int s = 0) : hour(h), minute(m), second(s) {};
		Time(const Time &other) : hour(other.hour), minute(other.minute), second(other.second) {};
		friend istream &operator>>(istream &input, Time &other) {
			input >> other.hour >> other.minute >> other.second;
			return input;
		}
		friend ostream &operator<<(ostream &output, const Time &other) {
			output << setw(2) << setfill('0') << other.hour << ":" << setw(2) << setfill('0') << other.minute << ":" << setw(
			           2) << setfill('0') << other.second << endl;
			return output;
		}
		const Time operator++(int) {
			Time tmp(*this);
			int x = hour * 3600 + minute * 60 + second;
			x++;
			hour = x / 3600;
			x %= 3600;
			minute = x / 60;
			second = x % 60;
			return tmp;
		}
		const Time operator--(int) {
			Time tmp(*this);
			int x = hour * 3600 + minute * 60 + second;
			x--;
			hour = x / 3600;
			x %= 3600;
			minute = x / 60;
			second = x % 60;
			return tmp;
		}
		Time operator+=(const Time &other) {
			second += other.second;
			minute += other.minute;
			hour += other.hour;
			if (second >= 60) {
				minute += second / 60;
				second %= 60;
			}
			if (minute >= 60) {
				hour += minute / 60;
				minute %= 60;
			}
			if (hour >= 24) {
				hour %= 24;
			}
			return *this;
		}
		Time operator-=(const Time &other) {
			if (second < other.second) {
				second += 60;
				second -= other.second;
				minute--;
			} else {
				second -= other.second;
			}
			if (minute < other.minute) {
				minute += 60;
				minute -= other.minute;
				hour--;
			} else {
				minute -= other.minute;
			}
			if (hour < other.hour) {
				hour += 24;
				hour -= other.hour;
			} else {
				hour -= other.hour;
			}

			return *this;
		}
		Time &operator++() {
			int x = hour * 3600 + minute * 60 + second;
			x++;
			hour = x / 3600;
			x %= 3600;
			minute = x / 60;
			second = x % 60;
			return *this;
		}
		Time &operator--() {
			int x = hour * 3600 + minute * 60 + second;
			x--;
			hour = x / 3600;
			x %= 3600;
			minute = x / 60;
			second = x % 60;
			return *this;
		}
};

int main() {
	Time t1, t2;
	cin >> t1;
	cin >> t2;
	cout << (t1 += (t2++));
	cout << (t1 -= t2);
	cout << ++t2;
	cout << (t2 += (t1--));
	cout << --t1;
	cout << (t2 -= t1);
}

思考题

分析总结上述程序设计实现的不足之处,并思考复数类其他运算符(如+=,==等)重载如何实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试】记一次中小公司某一次面试题

文章目录1. MySQL中explain执行计划你比较关注哪些字段&#xff1f;2.char、varchar 和 text的区别&#xff1f;3. int(3)和int(11)查询的区别&#xff1f;4. 字段里NULL和空值的区别&#xff1f;5. spring中怎么解决循环依赖问题&#xff1f;5.1 重新设计5.2 使用注解 Lazy5.3…

ESP32设备驱动-HDC2080温湿度传感器驱动

HDC2080温湿度传感器驱动 文章目录 HDC2080温湿度传感器驱动2、硬件准备3、软件准备4、驱动实现HDC2080 器件是一款集成式湿度和温度传感器,可在小型 DFN 封装中以极低的功耗提供高精度测量。基于电容的传感器包括新的集成数字功能和用于消散冷凝和湿气的加热元件。 HDC2080 数…

虹科新闻 | 冲击记录仪ASPION G-Log 2荣获行业领袖奖-Best of Industry Award

虹科ASPION G-Log 2 荣获 行业领袖奖 “2022 Best of Industry Award” 创新的运输冲击数据记录仪虹科ASPION G-Log 2荣获2022年行业领袖奖。经过5个月的投票和近2万张选票&#xff0c;G-Log 2在传感器 由冲击或振动&#xff0c;甚至是温度或相对湿度等气候因素引起的运输损坏…

ERTEC200P-2 PROFINET设备完全开发手册(5-3)

5.3 标识和维护数据&#xff08;I&M&#xff09; 标识和维护数据是一类特殊的数据记录&#xff0c;其中 “I&M0”&#xff08;“16#AFF0”&#xff09;用于有关模块或设备的常规信息。包含的信息例如&#xff1a;订货号/Order-ID, 硬件软件版本/hard- and software v…

强化学习之蒙特卡罗(MC)、动态规划(DP)、时间差分(TD)

强化学习笔记1.马尔可夫决策过程(MDP)1.马尔可夫性质2.马尔可夫过程3.马尔可夫奖励过程(MRP)4.马尔可夫决策过程(MDP)2.蒙特卡罗&#xff08;MC&#xff09;、动态规划&#xff08;DP&#xff09;、时间差分&#xff08;TD&#xff09;1.蒙特卡罗(MC)2.动态规划(DP)3.时间差分(…

【C】Function

系列连载 【python / C / C】 参考 《C语言程序设计&#xff08;第四版&#xff09;谭浩强》【C语言】C语言视频教程《郝斌 C 语言自学教程》 文章目录为什么需要函数什么叫函数如何定义函数函数的分类注意的问题常用的系统函数为什么需要函数 避免重复性操作 有利于程序模…

23种设计模式之建造者模式(黑马程序员)

建造者模式一、概述二、结构三、实现四、总结五、模式扩展在最后一、概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造&#xff08;由Build来负责&#xff09;和装配&#xff08;Director负责&#xff09;。从而可以…

Spring 的创建和使用

目录 一. 创建 Spring项目 二. 存储 Bean 对象到Spring中 1. 添加Spring配置文件 2. 创建一个 Bean 对象 3. 将 Bean 存储到 Spring 容器中 三. 从 Spring 中获取并使用 Bean 对象 1. 创建 Spring 上下文 1.1 使用 ApplicationContext 作为Spring上下文 1.2 使用 Bea…

ONLYOFFICE 邀请您一起创建插件

文档编辑器中的插件具有高度的便捷性和实用性&#xff0c;这对工作效率的提高至关重要&#xff0c;ONLYOFFICE 功能的强大也离不开丰富的插件资源。 现在&#xff0c;您可以自己制作插件并上架到 ONLYOFFICE&#xff0c;一起帮助广大用户更高效地办公&#xff0c;并获得相应的…

KDMP真实案例之主机 I/O 请求没有正常结束导致系统重启

目录 查看kdump文件 导致系统崩溃的寄存器指向的内存地址 导致重启的汇编指令 导致重启的源码 block/blk-core.c文件简介 导致重启的blk_finish_request函数源码 函数源码解读 系统重启原因 处理意见 查看kdump文件 各字段意思说明 KERNEL&#xff1a;显示内核文件的路…

你真的会用iPad吗,如何使iPad秒变生产力工具?在iPad上用vscode写代码搞开发

目录 前言 视频教程 1. 本地环境配置 2. 内网穿透 2.1 安装cpolar内网穿透(支持一键自动安装脚本) 2.2 创建HTTP隧道 3. 测试远程访问 4. 配置固定二级子域名 4.1 保留二级子域名 4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问 6. iPad通过软件远程vscode…

通俗举例讲解动态链接】静态链接

参考动态链接 - 知乎 加上我自己的理解&#xff0c;比较好懂&#xff0c;但可能在细节方面有偏差,但总体是一致的 静态链接的背景 静态链接使得不同的程序开发者和部门能够相对独立的开发和测试自己的程序模块&#xff0c;从某种意义上来讲大大促进了程序开发的效率&#xf…

Mybatis【环境搭建】

目录 一、Maven 环境配置 1、配置 pom.xml 1.1、依赖的 jar包 1.2、防止资源导出失败 2、在resources下编写 Mybatis核心配置文件 二、搭建结构 1、编写mybatis工具类&#xff08;utils&#xff09; 2、编写实体类&#xff08;pojo&#xff09; 3、Mybatis 的实现&…

一篇搞定Lambda和Stream流

一、Lambda表达式 jdk8中的语法糖&#xff0c;优化某些匿名内部类的写法&#xff0c;函数式编程的重要体现&#xff0c;不再关注对象是什么&#xff0c;更关注数据进行了什么操作 1、练习 练习1 练习2 练习3 练习4 练习5 2、省略规则 参数类型可以省略方法体只有一句代码时…

【Leetcode】消失的数字 [C语言实现]

&#x1f47b;内容专栏&#xff1a;《Leetcode刷题专栏》 &#x1f428;本文概括&#xff1a; 面试17.04.消失的数字 &#x1f43c;本文作者&#xff1a;花 碟 &#x1f438;发布时间&#xff1a;2023.4.10 目录 思想1&#xff1a;先排序再查找 思想2&#xff1a;异或运算 代…

TensorFlow 图像深度学习实用指南:1~3 全

原文&#xff1a;Hands-On Deep Learning for Images with TensorFlow 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xf…

移动版OpenAI,手机的杀手还是救星?

AI登陆手机&#xff0c;难度因人而异。 原本小编还以为「2023年是属于元宇宙的一年」&#xff0c;实在没想到以ChatGPT为代表的AI技术能在这么短的时间内抢走元宇宙的风头&#xff0c;成为2023年的技术关键词。从OpenAI到搜索引擎、从绘图工具到游戏公司&#xff0c;几乎所有「…

跨境电商的行业现状与发展趋势分析

随着互联网的不断发展&#xff0c;跨境电商作为一种全新的商业模式已经逐渐崭露头角。跨境电商的出现&#xff0c;让越来越多的商家看到了扩大市场的机会&#xff0c;也为消费者提供了更加便利、更加优质的购物体验。本文将从跨境电商的定义、行业现状、发展趋势等方面进行探讨…

windows下的wsl2如何进行docker数据卷挂载

这是数据卷挂载命令 docker run -it -v /宿主机绝对路径目录: /容器内目录 镜像名 在Linux中我们可以直接使用该命令进行挂载&#xff0c;那在windows如何把我们c盘d盘下的目录挂载到容器呢&#xff0c;其实只要在路径前面加上/mnt就好了&#xff0c;下面来演示一下 首先拉取一…

About RadaeePDF Classic SDK for iOS Crack

About RadaeePDF Classic SDK for iOS Crack RadaeePDF iOS版经典SDK可帮助您构建更好的移动应用程序。使用功能强大的PDF阅读器引擎及其一系列专业功能现在是一个快速而简单的过程。适用于iOS的RadaeePDF Classic SDK在智能手机、平板电脑、笔记本电脑、敞篷车和台式机上提供了…