运算符重载(C++)

运算符重载:

运算符重载是一种形式的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++对用户定义的运算符重载的限制:

  1. 重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。因此,不能将减法运算符(-)重载为计算两个double值的和,而不是它们的差。
  2. 使用运算符时不能违反运算符原来的句法规则。例如,不能将求模运算符重载成使用一个操作数。同样,不能修改运算符的优先级。因此,如果将加号运算符重载成将两个类相加,则新的运算符与原来的加号具有相同的优先级。
  3. 不能创建新的运算符。
  4. 不能重载一些运算符:(sizeof运算符)、(.成员运算符)、(.*成员指针运算符)等。
  5. p387中的大多数运算符都可以通过成员或非成员函数进行重载。但下面的运算符只能通过成员函数进行重载:(=赋值运算符)、( ()函数调用运算符)、([]下标运算符)、(->通过指针访问类成员的运算符)。

声明:以上整理自个人理解和Stephen Prata 著的《C++ Primer Plus》

猜你喜欢

转载自blog.csdn.net/MoooLi/article/details/82762630
今日推荐