C++ 重载(一)

今天来看下一C++里面的重载,包括函数重载和运算符重载。其中,对函数重载之前文章里有写过,就是根据函数参数的个数、类型、顺序不同来进行重载。说白了重载就是同名不同参,main函数在调用的时候根据传递的参数不同,来选择不同的函数,来实现不同的功能,举个例子:

函数重载:

#include<iostream>

using namespace std;

int add(int a, int b) {
	cout << "调用整数加法:" << endl;
	return a + b;
}

double add(double a, double b) {
	cout << "调用浮点数加法:" << endl;
	return a + b;
}

int main() {
	cout << add(1, 2) << endl;
	cout << add(1.0, 2.0) << endl;

	return 0;
}

 虽然函数名称都是add,但是传递实参时却是不一样的,所以调用的函数也不一样。之前文章也有对构造函数的重载,这里就不再写了,我觉得函数重载还是挺简单的。

运算符重载:运算符重载就有点难度了,今天看完了对+、-、*、++、--运算的重载,先来总结一下:

对+、-、*双目运算符的重载,我们直接看C++ Primer Plus这本书里面的计算时间的例子:

问题描述:今天早上小明刷抖音花费了2小时30分钟,下午小明骑单车游玩花费了3小时40分钟,那么他做这两件事情一共花费 了多久呢? 要求用面向对象的方法来解决(题目我稍微改了一下,就是那么个意思哈)

如果不用面向对象的方法,直接自己定义个函数,或者函数都不用定义,直接键盘输入,然后按照每60分钟是一小时的格式进行转换就可以了,那么用面向对象的思路怎么做呢? 其实也很简单,面相对象就是创建类,分成上午和下午花费时间,所以创建一个Time时间类,把上午和下午看成两个对象就完事了(书里是这样思考的),那我们先看下Time.h头文件里的成员数据和成员函数声明:

#pragma once
class Time {
private:
	int hours;
	int minutes;
public:
	Time();//构造函数,用来初始化对象
	Time(int h, int m);//对构造函数进行重载;

	Time Sum(const Time &t);//这个函数就是实现时间相加的
	void Show() const;
};

再来看一下,实现这个头文件接口的源文件:

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

using namespace std;

//这个文件实现头文件里的接口

Time::Time() {//构造函数初始化私有成员变量
	hours = minutes = 0;
}

Time::Time(int h, int m) {//实现重载的构造函数
	hours = h;
	minutes = m;
}


Time Time::Sum(const Time& t) {//两个时间相加,通过对象1.Sum(对象2)来调用,返回一个对象
	Time s;//临时对象
	s.minutes = t.minutes + this->minutes;
	s.hours = t.hours + s.minutes / 60 + this->hours;
	s.minutes %= 60;
	return s;
}

void Time::Show() const {
	cout << "hours=" << hours << ",minutes=" << minutes << endl;
}

最后,创建一个test.cpp文件,在main函数里进行测试一下:

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

using namespace std;

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

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

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

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

看上面的输出结果,实现了两个时间相加。这里面就是用面向对象的思路,主要是Sum这个成员函数,通过对象1.Sum(对象2)的方式来实现两个对象相加,然后返回一个对象,主要这里难理解一点,不过也还好,多思考一下也不难了。

接下来,将‘+’重载,上面Sum函数的实现真麻烦,能不能直接 对象1+对象2 这样多简单,我们通过增加一个重载成员函数类实现,将Sum 函数改为:

头文件修改:重载运算符格式operatorop(), operator + 重载运算符 + () 

Time operator+(const Time& t) const;

 源文件实现:

Time Time::operator+(const Time& t) const {
	Time s;//临时对象
	s.minutes = t.minutes + this->minutes;
	s.hours = t.hours + s.minutes / 60 + this->hours;
	s.minutes %= 60;
	return s;
}

源文件时间相加的逻辑实现还是一样的。

重新测试,直接让两个对象相加:

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

using namespace std;

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

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

	t4 = t3 +t2;
	//重载之后直接让两个对象相加

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

输出还是一样的,这样就不用通过对象1.的形式调用了,这样就完成了对‘+’运算符的重载,我感觉还是很好理解的,先写到这,电脑没电了,后面我继续写对-、*、++、 --,还有对左移运算<<的重载。 

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值