1. 程式人生 > >運算子過載(C++)

運算子過載(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》