1、运算符重载
“运算符重载”常用于解决结构体或自定义数据类型的加法、减法等特殊含义的运算。
运算符重载的一般格式为:
类型名 operator 运算符 (const 类型名 变量)const{ … }
例如:
worktime operator +(const worktime x)const{ … }
2、例题:作业统计
【问题描述】 为了了解学生的课后作业负担情况,需要统计学生连续若干天完成作业所需的总时间。现在,输入某位学生 n 天完成作业的时间,格式为时、分、秒,最后输出这位学生 n 天完成作业的总时间(秒)。
【输入格式】 第 1 行一个正整数 n,表示有 n 天; 第 2~ 第 n+1 行,每行 3 个整数,分别代表时、分、秒。
【输出格式】 一行信息,表示这个学生完成作业的总时间,具体格式见输出样例。
【输入样例】 3 1 20 30 1 20 45 1 19 30
【输出样例】 4hour 0minute 45second
程序:
#include<bits/stdc++.h> // 引入所有标准库头文件,方便处理各种输入输出、数据结构等
using namespace std; // 使用标准命名空间,避免每次使用标准库的功能时都加上 "std::"
struct worktime { // 声明一个结构体类型 worktime,用于记录时间
int hr, minut, sec; // hr、minut、sec 分别表示小时、分钟和秒数
// 重载 + 运算符,使得两个 worktime 对象可以使用 + 运算符进行相加
worktime operator +(const worktime x) const {
worktime tmp; // 创建一个新的 worktime 对象 tmp 用于保存相加结果
// 计算秒数:两个秒数相加后,对60取余得到秒数(如果秒数达到60,就转换为分钟)
tmp.sec = (sec + x.sec) % 60;
// 计算分钟数:将分钟数和秒数进位的部分加起来,并对60取余
tmp.minut = (minut + x.minut + (sec + x.sec) / 60) % 60;
// 计算小时数:将小时数、分钟数进位的部分相加
tmp.hr = hr + x.hr + (minut + x.minut + (sec + x.sec) / 60) / 60;
// 返回计算得到的结果
return tmp;
}
};
int main() { // 主函数,程序从这里开始执行
worktime stu, sum; // 声明两个 worktime 类型的变量,stu 用来保存每个学生的时间,sum 用来保存所有学生时间的总和
int n; // 声明一个整数 n,用于存储学生人数
cin >> n; // 输入学生人数 n
sum.hr = sum.minut = sum.sec = 0; // 初始化 sum 变量,将其时间置为 0(0小时、0分钟、0秒)
for(int i = 1; i <= n; i++) { // 遍历每个学生的时间
cin >> stu.hr >> stu.minut >> stu.sec; // 输入当前学生的小时、分钟和秒数
sum = sum + stu; // 将当前学生的时间 stu 加到总和 sum 中,利用重载的 + 运算符进行加法操作
}
// 输出结果,格式化输出总时间:小时、分钟和秒
cout << sum.hr << " hour " << sum.minut << " minute " << sum.sec << " second ";
return 0; // 程序正常结束
}
程序分析:
worktime
结构体:
- 定义了一个结构体
worktime
,它用于存储时间(小时、分钟、秒)。operator +
:重载了加法运算符,使得worktime
对象能够直接相加。这使得你可以直接使用sum = sum + stu;
来计算总时间。重载的加法运算符会处理秒、分钟和小时的进位问题。主函数:
- 输入学生人数
n
。- 初始化一个
sum
结构体为0
(0小时、0分钟、0秒)。- 循环读取每个学生的时间(小时、分钟、秒),并通过重载的
+
运算符将它们累加到sum
中。- 最后输出累加后的总时间,格式为
小时
、分钟
和秒
。具体的加法逻辑:
- 通过重载的
+
运算符,对sec
、minut
和hr
进行加法运算。- 每当秒数
sec
的和超过 60 时,它会向分钟minut
进位,类似的,分钟数也可能进位到小时数。- 最终得到的
sum
包含了所有学生时间的总和,输出时按小时、分钟、秒的格式打印。假设输入如下:
3 1 20 30 2 40 50 3 15 40那么
sum
将为:
- 秒数:30 + 50 + 40 = 120,超过 60,所以分钟进位。
- 分钟数:20 + 40 + 15 + (120 / 60) = 75,超过 60,所以小时进位。
- 小时数:1 + 2 + 3 + (75 / 60) = 6。
最终输出将是:
6 hour 15 minute 0 second这样,通过重载
+
运算符,程序能够很方便地处理时间加法,并正确地处理进位问题。