C++語言中預定義的運算符的操作對象只能是基本數據類型,但是,在實際應用中,對於很多用戶自定 義數據類型(如類)也需要類似的功能,這就需要對已有的運算符賦予多種含義,使同一個運算符具有作 用於不同類性的數據導致不同類型的行為,這就是運算符重載。因此,運算符重載的目的是設置C++語言 中的某一運算符,讓它們之間並不沖突,C++語言會根據運算符的位置辨別應使用哪一種功能進行運算。 可見,運算符重載的優點是允許改變使用於系統內部的運算符的操作方式,以適應用戶新定義類型的類似 運算。
運算符重載的實質是函數重載。事實上,C++語言中的每一個運算符對應著一個運算符函數,在實現過 程中,把指定的運算表達式中的運算符轉化為對運算符函數的調用,而表達式中的運算對象轉化為運算符 函數的實參,這個過程是在編譯階段完成的。例如:
int a=1,b=2;
a+b;
表達式“a+b”在編譯前,將被解釋為函數調用形式:operator+(a,b)。
其中,operator是一個關鍵字,它與後面的“+”共同組成了該運算符函數的函數名。
運算符重載是一種特殊的函數重載。在類中可以采用下述兩種方法對運算符函數進行重載。
1.重載為類的成員函數
將運算符函數重載為類的成員函數是指在類中定義一個同名的運算符函數,其語句格式為:
TYPE X::operator@(形參表)
{
//函數體
//重新定義運算符@在指定類X中的功能
}
其中,operator是關鍵字,@是需要被重載的運算符,X是需要重載該運算符的類名,TYPE是該運算符 函數的返回值類型。關鍵字operator與後面的運算符@共同組成了該運算符函數的函數名。
2.重載為類的友元函數
可以定義一個與某一運算符函數同名的全局函數,然後再將該全局函數聲明為類的友元函數,從而實 現運算符的重載。其語法格式為:
friend TYPE operator@(形參表);
下面介紹運算符重載的幾個問題:
l 以上兩種重載形式均可訪問類的私有成員;
l 幾乎所有的運算符都可以被重載,但下列運算符不允許重載:
“。”、“。*”、“::”、“?:”
l 運算符重載後,既不會改變原運算符的優先級和結合特性也不會改變使用運算符的語法和參數個數 ;
l “=”、“()”、“[]”和“->”等運算符不能 重載為友元函數;
l 當運算符重載為類的成員函數時,函數的參數個數比原來的運算對象少一個(右++和右 ——除外);當重載為類的友元函數時,參數個數與原運算符的運算個數相同;單目運算符最 好重載為類的成員函數,而雙目運算符則最好重載為類的友元函數。
相關文章
C++學習摘要之二:構造函數和析構函數
http://www.bianceng.cn/Programming/cplus/200911/12302.htm
C++學習摘要之一:類和對象
http://www.bianceng.cn/Programming/cplus/200911/12301.htm