天天看點

從零開始的C++(操作符函數重載)

一、操作符函數重載

什麼是操作符函數:在C++中針對類類型的對象的運算符,由于它們肯定不支援真正的運算操作,是以編譯器會将它們翻譯成函數,這種就叫作操作符函數(運算符函數)。

編譯器把運算翻譯成運算符函數,可以針對自定義的類類型設計它獨有的運算功能。

其實各種運算已經具備一些功能,再次實作它的就是叫作運算符重載。

  • 雙目運算符:

    a+b

    成員函數

    a.operator+(b);

    全局函數

    operator+(a,b);

  • 單目運算符:

    !a

    成員函數

    a.operator!(void);

    全局函數

    operator!(a);

二、雙目操作符函數重載

成員函數:

const 類 operator#(const 類& that) const

{

return 類(參數#參數);

}

注意:雙目錄運算符的運算結果是個右值,傳回值應該加 const,然後為了const對象能夠調用參數應寫 const,函數也應該具備 const 屬性。

全局函數:

const 類 operator#(const 類& a,const 類& b)

{

}

注意:全局函數不是函數,可能會通路類的私有成員,解決這種問題可以把函數聲明為類的友元函數(友元不是成員)。

友元:在類的外部某個函數中想通路類的私有成員(public/protected/private)時,需要所在的函數聲明為友元,但友元隻是朋友,是以它隻有通路權,沒有實際的擁有權(其根本原因是它沒 this 指針)。

友元聲明:把函數的聲明寫一份到類中,然後在聲明前加上 friend 關鍵字,使用友元既可把操作符函數定義為全局的,也可以確定類的封裝性。。

注意:友元函數與成員函數不會構成重載關系,因為它們不在同一個作用域内。

三、指派類型的雙目操作符

1、擷取單參構造成指派運算的調用方式。

String str = “sunll”; // 會調用單參構造,而不調用指派運算符

str = “hehe”;

2、左操作資料不能具有 const 屬性

1、成員函數不能是常函數

2、全局函數第一個參數不能有 const 屬性

3、傳回值應該都(成員/全局)具備 const 屬性。

四、單目操作符函數重載

成員

const 類 operator#(void)

{

}
           

全局

const 類 operator#(const 類& that)

{

}
           

繼續閱讀