C++ 重载(二)

在上一篇文章中,我们定义了一个Time时间类,完成了对‘+’运算符的重载,后面可以通过 对象1+对象2 的形式来计算总共花费的时间。这样后面有多个Time类的时间对象直接通过‘+’就可以完成时间相加了,比如下面:

1.使用重载‘+’成员函数实现多个Time类对象相加

#include<iostream>
#include"Time.h"

using namespace std;

int main() {
	Time t1(3,20);
	Time t2(2, 40);
	Time t3(5, 55);
	Time t4;

	t1.Show();
	t2.Show();
	t3.Show();

	t4 = t1 + t2 + t3;
    //重载之后,实现多个对象相加,这样是不是很简洁、方便

	t4.Show();//三个时间相加完后的结果
	
	return 0;
}

2.对‘-’进行重载,实现两个对象时间相减

接下来实现‘-’号重载,在Time.h头文件增加对‘-’重载成员函数的声明:

Time operator-(const Time& t) const;

然后,在Time.cpp文件中实现该成员函数:

Time Time::operator-(const Time& t) const {
	Time diff;
	int tot1, tot2;
    //定义两个整数类型用来统计一个多少分钟
	tot1 = this->hours * 60 + this->minutes;
	tot2 = t.hours * 60 + t.minutes;
    //之后在进行时间格式转换
	diff.minutes = (tot1 - tot2) % 60;
	diff.hours = (tot1 - tot2) / 60;
    //最后返回结果对象
	return diff;
}

最后在test.cpp上加上

#include<iostream>
#include"Time.h"

using namespace std;

int main() {
	Time t1(3,20);
	Time t2(2, 40);
	Time t3(5, 55);
	Time t4;
	//调用了不同的构造函数进行了初始化,这就是重载的用处!
	//这就好比人,每个人都是一个对象,每个人都是独一无二的,扯多了哈哈

	t1.Show();
	t2.Show();
	t3.Show();

	t4 = t1 + t2 + t3;
	//t1是按引用传值,这样比按值传递速度快、节约内存;
	//注意这个返回值是一个对象,所以创建一个对象t3来接受

	t4.Show();//两个时间相加完后的结果
	
	Time t5;
	t5 = t3 - t2;
	t5.Show();

	return 0;
}

注意对象的顺序,t3在t2前面等价于t3.operator-(t2),所以调用函数时,this指针指向的t3哈,这里要注意一下! 不废话了,看结果:

3. 对‘*’进行重载,实现将hour mintues成员数据倍乘

先对Time.h头文件增加对‘*’重载成员函数的声明:

Time operator*(double e) const;

然后在Time.cpp文件中实现该成员函数:

Time Time::operator*(double e) const {
	Time mul;
	long tot;
	tot = this->minutes * e + this->hours * 60 * e;
	mul.minutes = tot % 60;
	mul.hours = tot / 60;
	return mul;
}

最后在测试文件中调用:

#include<iostream>
#include"Time.h"

using namespace std;

int main() {
	Time t1(3,20);
	Time t2(2, 40);
	Time t3(5, 55);
	Time t4;
	//调用了不同的构造函数进行了初始化,这就是重载的用处!
	//这就好比人,每个人都是一个对象,每个人都是独一无二的,扯多了哈哈

	t1.Show();
	t2.Show();
	t3.Show();

	t4 = t1 + t2 + t3;
	//t1是按引用传值,这样比按值传递速度快、节约内存;
	//注意这个返回值是一个对象,所以创建一个对象t3来接受

	t4.Show();//两个时间相加完后的结果
	
	Time t5;
	t5 = t3 - t2;
	t5.Show();

	Time t6;
	t6 = t1 * 2.0;
	t6.Show();

	return 0;
}

是不是比较简单,其实+、-、*、/、格式都是一样的,主要看你完成什么事情。

4.对自增运算符++、--进行重载

下面我对 单目运算符++、--进行重载,这个也挺好理解的:

我重新给个背景,比如说上班日结工资这件事:你每上一天班,给你一天的工资100,但是你如果旷工一天扣100,这样我们定义一个员工类,通过重载自增自减运算符来实现:

首先在头文件Employee.h中声明成员函数和成员数据:

#pragma once
#include<iostream>

class Employee {
public:
	Employee();//默认无参构造函数
	Employee(int a, int b);//构造函数重载
	Employee operator++();//前置自增
	Employee operator--();/前置自减
	Employee operator++(int);//后置自增
	Employee operator--(int);//后置自减
	void display();

private:
	int emp_number;//员工编号
	int wage;//员工日结工资
};

这里有一点,是前置和后置的区别,后置添加了一个int参数进行区别,我也不知道为什么这样做,但是在调用的时候编译器就自动识别了,目前还没理解(先打个问号???)

接下来看一下Employ.cpp文件中对头文件接口进行实现:

#include"Employee.h"

using namespace std;

Employee::Employee() {
	this->emp_number = 0;
	this->wage = 0;
}

Employee::Employee(int a, int b) {
	this->emp_number = a;
	this->wage = b;
}

Employee Employee::operator++(){
	Employee t;
	t.emp_number = this->emp_number;
	t.wage = ++this->wage;
	return t;
}

Employee Employee::operator--() {
	Employee s;
	s.emp_number = this->emp_number;
	s.wage = --this->wage;
	return s;
}

Employee Employee::operator++(int) {
	Employee t;
	t.emp_number = this->emp_number;
	t.wage = this->wage++;
	return t;
}

Employee Employee::operator--(int) {
	Employee s;
	s.emp_number = this->emp_number;
	s.wage = this->wage--;
	return s;
}
void Employee::display() {
	cout << "员工编号为:" << this->emp_number << "你的日结工资为:" << this->wage << endl;
}

测试一下:

#include"Employee.h"

int main() {
	Employee e1(1, 0);
	Employee e2(2, 1);
	Employee e3(3, 2);

	//e1上一天班,日结一天,工资加1,单位均是百元
	//e2 e3 两人旷工一天,工资减1
	Employee e4, e5, e6;

	e4 = ++e1;
	e4.display();

	e5 = --e2;
	e5.display();

	e6 = --e3;
	e6.display();


	return 0;
}

 这是对前置自增自减运算符重载测试,下面对后置自增自减进行测试:

#include"Employee.h"

int main() {
	Employee e1(1, 0);
	Employee e2(2, 1);
	Employee e3(3, 2);

	//e1上一天班,日结一天,工资加1,单位均是百元
	//e2 e3 两人旷工一天,工资减1
	Employee e4, e5, e6;

	e4 = e1++;
	e1.display();
	e4.display();

	e5 = e2--;
	e2.display();
	e5.display();

	e6 = e3--;
	e3.display();
	e6.display();


	return 0;
}

 发工资这个背景可能有点牵强,不过大概就是这么个意思,主要是学会对++、--运算符的重载就行了,哈哈。

关于对左移运算符<<的重载我下一篇文章再写,多看书和视频、多敲代码、多思考、多总结,有什么不对的地方欢迎大家批评指正,继续加油!!!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值