1.重載運算符的函數一般格式如下
函數類型 operator 運算符名稱 (形參表列)
{對運算符的重載處理}
例如,想將“+”用於Complex(復數)的加法運算,函數的原型可以是這樣的:
Complex operator + (Complex & c1,Complex &c2);
operator+函數表示對運算符+重載。
其中,operator是關鍵字,專門用於定義重載運算符的函數的,運算符名稱就是C++提供給用戶的預定運算符。
注意:函數名是由operator和運算符組成。
2.兩個形參是Complex類對象的引用,要求實參為Complex類對象。
- 在執行Point類型相加的表達式a+b時,系統就會自動調用operator+函數,把a+b作為實參,與形參進行虛實結合。
- 下面的a+b語句中,相當於a調用函數+,把b作為該函數的一個參數傳遞給該函數,從而實現了兩個Point類型的相加。
- 為了說明把運算符重載后,執行表達式就是調用函數的過程,可以把兩個整數相加也想象稱為調用下面的函數:
實參和形參匹配才可以調用函數。
#include <iostream> using namespace std; struct Point { int x, y; Point(int x = 0, int y=0):x(x),y(y){} }; Point operator + (const Point& A, const Point& B) { return Point(A.x+B.x, A.y+B.y); } ostream& operator << (ostream &out, const Point&p) { out << "(" << p.x << "," << p.y << ")"; return out; } int main() { Point a, b(1, 2); a.x = 3; cout << a + b <<"\n"; system("pause"); return 0; }
操作符重載實現為非類成員函數(全局函數)
對於全局重載操作符,代表左操作數的參數必須被顯式指定。
****
運算符重載函數operator +還可以改寫的更簡練一些:
Complex Complex::operator+(Complex &c2)
{
return Complex(c2.real+real,c2.imag+imag);
}
return語句中的Complex(c2.real+real,c2.imag+imag)是建立一個臨時對象,它沒有對象名,是一個無名對象。
在建立臨時對象過程中,調用構造函數。return語句將此臨時對象作為函數返回值。
那么,我們將+運算符進行了重載以后,可否將一個常量和一個復數相加呢?比如:
c3=3+c2; //錯誤,與形參類型不匹配
實參和形參匹配才可以調用函數。
應寫成對象形式,如:
c3=Complex(3,0)+c2; //正確,類型均為對象
還需要說明的是:運算符被重載后,其原有的功能仍然保留,沒有喪失或改變。
例如,運算符+被重載以后,仍然可以用於int,float,double,char類型數據的運算,同時又增加了用於定義時數據類型的相加的功能。
編譯系統根據表達式的上下文,即根據運算符兩側(如果是單目運算符則為一側)的數據類型決定的。
如,對於3+5,則執行整數加法;對於3.4+5.45,則執行雙精度數加法;對於兩個復數類相加,則執行復數加法。
3.如何決定把一個操作符重載為類成員函數還是全局名字空間的成員呢?
①如果一個重載操作符是類成員,那么只有當與他一起使用的左操作數是該類的對象時,該操作符才會被調用。如果該操作符的左操作數必須是其他的類型,則操作符必須被重載為全局名字空間的成員。
②C++要求賦值=,下標[],調用(), 和成員指向->操作符必須被定義為類成員操作符。任何把這些操作符定義為名字空間成員的定義都會被標記為編譯時刻錯誤。
③如果有一個操作數是類類型如string類的情形那么對於對稱操作符比如等於操作符最好定義為全局名字空間成員。