c++_运算符重载(时钟加减)

介绍

本文主要介绍 减号( - )、加号( + )、加等(+=)运算符重载并复现了时钟运行方式

源码

#include<iostream>

using namespace std;

class Time
{
public:
	//加号计算函数
	void t_add(int& temp, const int& Right, bool& b)
	{
		//判断时间是否大于 60
		if ((temp + Right) < 60)//当两数相加 小于60 则直接相加
		{
			temp += Right;
			b = 0;
		}
		else//当两数相加 大于60 则直接相加 后在减去60秒(分)
		{
			temp += Right - 60;
			b = 1;
		}
	}
	//减号计算函数
	void t_sub(int& Left, const int& Right, bool& b)
	{
		//判断左操作数是否大于右操作数
		if (Left > Right)
		{
			//当左操作数大于右操作数则 直接两数相减
			Left -= Right;
			b = 0;
		}
		else
		{
			//当左操作数小于右操作数则 直接两数相减 后加上 60 秒(分)
			Left = (Left - Right) + 60;
			b = 1;
		}
	}
	//打印结果
	void print()
	{
		cout << "时间为:" << m_Hour << ":" << m_minute << ":" << m_second << endl;
	}
public:
	//构造函数
	Time(int hour = 0, int minute = 0, int second = 0) :m_Hour(hour), m_minute(minute), m_second(second){}
	//加号重载
	Time operator+( const Time&Right)
	{
		Time temp = *this;//用临时变量来接收 左操作数
		bool b = 0;//用来接收是否超过时间进制

		//秒针时间判断
		temp.t_add(temp.m_second, Right.m_second, b);
		if (b == 1)//b == 1代表秒针超过 60 秒了,需要分针加 1 分钟
		{
			/**************************************************
			利用 三目运算符 判断分针加 1 分针后是否超过 60 分针
			1.如果没超过则 “当前时间中 分针”加 1 分针
			2.如果超过则 “当前时间中 时针”加 1 小时
			**************************************************/
			(temp.m_minute + 1) < 60 ? (temp.m_minute += 1) : (temp.m_Hour += 1);
		}
		//分针时间判断
		temp.t_add(temp.m_minute, Right.m_minute, b);
		if (b == 1)//b == 1代表分针超过 60 分针了,需要时针加 1 小时
		{
			/**************************************************
			利用 三目运算符 判断时针加 1 小时后是否超过 24 小时
			1.如果没超过则 “当前时间中 时针”加 1 小时
			2.如果超过则归 0 小时
			**************************************************/
			(temp.m_Hour + 1) < 24 ? (temp.m_Hour += 1) : (temp.m_Hour = 0);
		}
		//时针时间判断
		/**************************************************
		利用 三目运算符 判断两个数相加是否超过 24 小时
		1.如果没超过则 相加两数,
		2.如果超过则 先相加两数,然后减 24 小时
		**************************************************/
		(temp.m_Hour + Right.m_Hour) < 24 ? (temp.m_Hour = temp.m_Hour + Right.m_Hour) : (temp.m_Hour = (temp.m_Hour + Right.m_Hour) - 24);

		b = 0;//初始化 bool	
		return temp;//返回临时变量
	}
	//减号重载
	Time operator-(const Time&Right)
	{
		Time temp = *this;//用临时变量来接收 左操作数
		bool b = 0;//用来接收是否超过时间进制
		//秒针时间判断
		temp.t_sub(temp.m_second, Right.m_second, b);
		if (b == 1)//b == 1代表秒针超过 60 秒了,需要分针减 1 分钟
		{
			/*******************************************************
			判断减 1 分钟后是否小于等于 0
			1.如果小于等于0 则先减 1 分针 在加 60 分钟,然后减 1 小时
			2.如果大于0 则减 1 分针
			*******************************************************/
			if ((temp.m_minute - 1) <= 0)
			{
				temp.m_minute = (temp.m_minute - 1) + 60;
				temp.m_Hour -= 1;
			}
			else
			{
				temp.m_minute -= 1;
			}
		}
		//分针时间判断
		temp.t_sub(temp.m_minute, Right.m_minute, b);
		if (b == 1)//b == 1代表分针超过 60 分针了,需要时针减 1 小时
		{
			/*********************************************************
			利用 三目运算符 判断时针减 1 小时后小于等于 0
			1.如果没超过则 “当前时间中 时针”减 1 小时,然后加 24 小时
			2.如果大于0 则减 1 小时
			*********************************************************/
			(temp.m_Hour - 1) <= 0 ? temp.m_Hour = (temp.m_Hour - 1) + 24 : temp.m_Hour -= 1;
		}
		//时针时间判断
		/*********************************************************
		利用 三目运算符 判断 两数相减 是否小于等于 0
		1.如果没超过则 先相减两数,然后加 24 小时
		2.如果大于0 相减两数
		*********************************************************/
		(temp.m_Hour - Right.m_Hour) <= 0 ? temp.m_Hour = (temp.m_Hour - Right.m_Hour) + 24 : temp.m_Hour = temp.m_Hour - Right.m_Hour;
		b = 0;//初始化 bool	
		return temp;//返回临时变量
	}
	// += 重载(类内重载+=;效率高,因为类内直接返回操作数本身减少编译时间)
	Time& operator +=(Time&Right)
	{
		*this = *this + Right;
		return *this;
	}
private:
	int m_Hour;//时针
	int m_minute;//分针
	int m_second;//秒针
};

// += 重载(全局重载+=;效率低,需要重新构造一个左操作数会增加编译时间)
//Time& operator +=(Time&Left, const Time&Right)
//{
//	Left = Left + Right;
//	return Left;
//}
void main()
{
	// + 重载测试 结果 2:0:10
	Time t;
	Time t1(10, 20, 30);//设置初始时间10:20:30
	Time t2(15, 39, 40);//设置初始时间15:39:40
	t = t1 + t2;
	t.print();
	t1.print();
	t2.print();
	// - 重载测试 结果18:40:40
	cout << endl;
	Time t3(9, 20, 20);
	Time t4(14, 39, 40);
	t = t3 - t4;
	t.print();
	t3.print();
	t4.print();
	// += 重载测试
	cout << endl;
	t1 += t2;
	t1.print();
	system("pause");
}

运行结果

时间为:2:0:10

时间为:17:39:50

时间为:18:40:40
请按任意键继续. . .
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值