运算符重载:
运算符重载是一种形式的C++多态(C++如何使用户能够定义多个名称相同但特征不同的函数的方法被称为函数多态,也称为函数重载)。
C++允许将运算符重载扩展到用户定义的类型,例如,允许使用+将两个对象相加。
例如,一个人早上花费了2小时35分钟,下午花费了2小时40分钟,求花费的总时间。
mytime0.h
#pragma once
#ifndef MYTIME0_H_
#define MYTIME0_H_
class Time {
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m = 0);
void AddMin(int m);
void AddHr(int h);
void Reset(int h = 0, int m = 0);
Time Sum(const Time &t) const;
void Show() const;
};
#endif // !MYTIME0_H_
Time类提供了用于调整和重新设置时间、显示时间、将两个时间相加的方法。其中,Sum函数表示的就是将两个时间相加的函数。
将Time类转换转化为重载的加法运算符很容易,只要将Sum()的名称改为operater +()即可。即:
mytime1.h
#pragma once
#ifndef MYTIME0_H_
#define MYTIME0_H_
class Time {
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m = 0);
void AddMin(int m);
void AddHr(int h);
void Reset(int h = 0, int m = 0);
Time operater +(const Time &t) const;
void Show() const;
};
#endif // !MYTIME1_H_
其中,重载运算符加号的函数方法如下:
Time Time::operator + (const Time &t) const {
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum;
}
和Sum一样,operator +()也是由Time对象调用,它将第二个Time对象作为参数,并返回一个Time对象。因此,可以像调用Sum()那样来调用operator +()方法:
total = coding.operator + (fixing);
但将该方法命令为operator +()后,也可以使用运算符表示法:
total = coding + fixing;
这两种表示法都将调用operator +()方法。在运算符表示法中,运算符左侧的对象是调用对象,运算符右边的对象是作为参数被传递的对象。
可以将两个以上的对象相加吗?例如,如果t1、t2、t3和t4都是Time对象,t4 = t1 + t2 + t3是否成立。
答案是成立的,上述例子可以转化为t4 = t1.operator+(t2.operator+(t3));
重载:
多数C++运算符都可以用这样的方式重载。重载的运算符(有些例外情况)不必是成员函数,但必须至少由一个操作数是用户定义的类型。
C++对用户定义的运算符重载的:
声明:以上整理自个人理解和Stephen Prata 著的《C++ Primer Plus》