operator重載運算符

 

1.重載運算符的函數通常格式以下ios

函數類型    operator  運算符名稱    (形參表列)函數

{對運算符的重載處理}spa

例如,想將「+」用於Complex(複數)的加法運算,函數的原型能夠是這樣的:
code


Complex operator + (Complex & c1,Complex &c2);


operator+函數表示對運算符+重載。
其中,operator是關鍵字,專門用於定義重載運算符的函數的,運算符名稱就是C++提供給用戶的預約運算符。
對象

注意:函數名是由operator和運算符組成。原型

 

 

2.兩個形參是Complex類對象的引用,要求實參爲Complex類對象。string

  • 在執行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;
}
操做符重載實現爲非類成員函數(全局函數)

 對於全局重載操做符,表明左操做數的參數必須被顯式指定。it

****
io

運算符重載函數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類的情形那麼對於對稱操做符好比等於操做符最好定義爲全局名字空間成員。
相關文章
相關標籤/搜索