操作符重載與臨時對象

    在C++中,操作符重載的意思就是把已經定義的、有一定功能的操作符進行重新定義,來完成更爲細緻具體的運算等功能。C++中有許多內置的數據類型,如char,int,float等,每一種類型都有許多運算符,如加、減、乘、除等。當用戶定義了類的對象時,對象之間是不能直接使用這些運算符進行操作的,比如複數的加法。沒有重載+運算符,編譯器是不知道將複數的實部和實部相加,虛部和虛部相加的。這就是操作符重載出現的目的。

    操作符重載有三種形式,一種是重載爲類的成員函數(this),一種是重載爲類的非成員函數(無this),另一種是重載爲類的友元函數。

    操作符重載爲類的成員函數的一般語法形式爲:

函數類型 operator 運算符 (形參表)
{
  函數體;
}

    操作符重載爲類的友元函數的一般語法形式爲:

friend 函數類型 operator 運算符 (形參表)
{
  函數體;
}

    當操作符重載爲類的成員函數時,操作符重載的參數會比作爲友元或者獨立於類的操作符函數少一個參數,因爲操作符重載類成員函數會把調用該函數的對象作爲函數的第一個參數,也就是隱含的this指針指向調用該函數的第一個對象,所以會少一個參數。我們來看這樣一個例子:


    當調用類中定義的操作符重載函數時最左邊的對象是調用操作符重載函數時的對象。比如在類complex中重定義的+=操作符complex::operator += (const complex& r) { }(只有一個參數,this是隱藏參數),有類complex的對象c2和c1則調用操作符重載函數的方法有c2 += c1和c2.operator += c1,前一條語句會自動轉換爲後面這條語句,且c2 += c1的表達式中最左邊的對象c2是調用操作符重載函數的對象,而右邊的c1將被作爲參數傳送。

    另外我們注意到,在上面的例子中函數的返回值類型爲引用,傳遞者無需知道接收者是以reference形式接收的。

    當函數重載爲非成員函數時,我們來看下面的例子:


        我們注意到函數體中返回的complex( )是個臨時對象(temp object),這些函數絕不可return by reference,因爲它們返回的必定是個local object。=(賦值運算符)、()(函數調用運算符)、[ ](下標運算符)、->(通過指針訪問類成員的運算符)這四種運算符只能通過成員函數重載,剩餘的運算符可以通過成員或者非成員函數重載。

    重載的限制:

    (1)並不是所有的運算符都能被重載。除了.,.*,::,?:,sizeof,typeid這幾個運算符不能被重載,其他運算符都能被重載;

    (2)重載不能改變該運算符用於內置類型時的含義,程序猿不能改變+運算符用於兩個int型時的含義;

    (3)運算符函數的參數至少有一個必須是類的對象或者類的對象的引用,這種規定可以防止程序猿運用運算符改變內置類型的函數;

    (4)重載不能改變運算符的優先級;

    (5)重載不能改變運算符的結合律;

    (6)重載不能改變運算符操作數的個數,比如+需要兩個操作數,則重載的+也必須要有兩個操作數。

發佈了36 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章