今天来看下一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.的形式调用了,这样就完成了对‘+’运算符的重载,我感觉还是很好理解的,先写到这,电脑没电了,后面我继续写对-、*、++、 --,还有对左移运算<<的重载。