①运算符重载
1.介绍
第八章介绍了函数的重载,是为了让人们通过使用同名的函数完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载则是将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。C++根据操作数的数目和类型决定采用哪种操作。
C++允许将运算符重载扩展到用户定义的类型,重载运算符可以使得代码看起来更自然。要使用重载运算符,需使用运算符函数的形式:
operatorop(参数); op必须是有效的C++运算符,不能虚构一个新的符号。例如,假设有一个Salesperson类,并为它定义了一个operator+()成员函数,以重载+运算符,如果district2,sid和sara都是Salesperson类对象,便可以编写这样的等式:
district2=sara+sid;
在编译器眼里,上述语句将被转换为对象函数的调用:
district2=sara.operator+(sid);
最重要的是,我们可以使用简便的+运算符表示法,而不必使用笨拙的函数表示法。
2.示例
假设我们要将两个时间加起来。
1.通过类成员函数来处理:
//move.h文件
#ifndef MOVE_H
#define MOVE_H
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m);
void ShowTime() const;
void AddMin(int min);
void AddHour(int h);
Time Sum(const Time &t) const; //函数成员
};
#endif
//move.cpp 函数定义文件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "Move.h"
Time::Time()
{
hours = minutes = 0;
}
Time::Time(int h, int m)
{
hours = h;
minutes = m;
}
void Time::ShowTime() const
{
std::cout << "Hours = " << hours << ",mintues = " << minutes << std::endl;
}
void Time::AddMin(int min)
{
minutes += min;
hours += minutes / 60;
minutes = minutes % 60;
}
void Time::AddHour(int h)
{
hours += h;
}
Time Time::Sum(const Time& t) const
{
Time temp;
temp.minutes = minutes + t.minutes;
temp.hours = hours + t.hours + temp.minutes / 60;
temp.minutes = temp.minutes % 60;
return temp;
}
//usemove.cpp
#include<iostream>
#include"Move.h"
int main()
{
using namespace std;
Time Planning;
Time coding(2,40);
Time fixing = Time(5, 55);
Planning.ShowTime();
coding.ShowTime();
fixing.ShowTime();
Planning = coding.Sum(fixing);
Planning.ShowTime();
}
注意:代码参数是引用,但返回类型不是引用。将参数声明为引用时为了提高效率,然而返回值不是引用这是因为我们创建了对象的副本,使得调用函数可以调用它,如果返回也是引用的话,由于temp是局部变量,在函数结束时会被自动清除,因此引用将指向一个不存在的对象,错误!
2.添加加法运算符:
只需要将Sum()名称改为operator+()即可。
//move.h文件
#ifndef MOVE_H
#define MOVE_H
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m);
void ShowTime() const;
void AddMin(int min);
void AddHour(int h);
Time operator+(const Time &t) const; //变化在这里
};
#endif
//move.cpp 函数定义文件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "Move.h"
Time::Time()
{
hours = minutes = 0;
}
Time::Time(int h, int m)
{
hours = h;
minutes = m;
}
void Time::ShowTime() const
{
std::cout << "Hours = " << hours << ",mintues = " << minutes << std::endl;
}
void Time::AddMin(int min)
{
minutes += min;
hours += minutes / 60;
minutes = minutes % 60;
}
void Time::AddHour(int h)
{
hours += h;
}
Time Time::operator+(const Time& t) const
{
Time temp;
temp.minutes = minutes + t.minutes;
temp.hours = hours + t.hours + temp.minutes / 60;
temp.minutes = temp.minutes % 60;
return temp;
}
//usemove.cpp
#include<iostream>
#include"Move.h"
int main()
{
using namespace std;
Time Planning;
Time coding(2,40);
Time fixing = Time(5, 55);
Planning.ShowTime();
coding.ShowTime();
fixing.ShowTime();
Planning = coding + fixing; //变化在这里
Planning.ShowTime();
}
问:可以将两个以上的对象相加吗?
我们要看语句如何被转为函数调用,发现是可以多个变量相加。
3.其他重载运算符:
定义了减法 和一个整数相乘:
//move.h文件
#ifndef MOVE_H
#define MOVE_H
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m);
void ShowTime() const;
void AddMin(int min);
void AddHour(int h);
Time operator+(const Time &t) const; //变化在这里
Time operator-(const Time& t) const;
Time operator*(int n) ;
};
#endif
//move.cpp 函数定义文件
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "Move.h"
Time::Time()
{
hours = minutes = 0;
}
Time::Time(int h, int m)
{
hours = h;
minutes = m;
}
void Time::ShowTime() const
{
std::cout << "Hours = " << hours << ",mintues = " << minutes << std::endl;
}
void Time::AddMin(int min)
{
minutes += min;
hours += minutes / 60;
minutes = minutes % 60;
}
void Time::Add