操作符函式及過載(2)

2021-08-04 22:49:35 字數 1976 閱讀 8514

一.運算元與表示式

•左右運算元均可為左值或右值

–complex lv (1, 2);

complex const rv (3, 4);

lv + rv;

rv + lv;

•表示式的值必須是右值

–complex a (1, 2), b (3, 4), c (5, 6);

(a + b) = c; // 錯誤
二.成員函式

•常函式以支援右值型左運算元,常引數以支援右值型右運算元,常返回值以支援右值型表示式的值

–class complex 

};

三.全域性函式

•常第一引數以支援右值型左運算元,常第二引數以支援右值型右運算元,常返回值以支援右值型表示式的值

–complex const

operator+ (complex const& lhs, complex const& rhs)

•為了在乙個全域性操作符函式中直接訪問其運算元型別的私有及保護成員,同時又不破壞其運算元型別的封裝性,可以將該操作符函式宣告為其運算元型別的友元

–friend complex const operator+ (complex const&, complex const&);

一.friend

•可以通過friend關鍵字,把乙個全域性函式、另乙個類的成員函式或者另乙個類整體,宣告為某個類的友元

–class a 

;–void foo (a& a)

void bar (a const* a)

void hum (void)

四.友元非成員

•友元不是成員,即便將其定義在授權類的內部,其作用域也不屬於授權類,當然也不擁有授權類的this指標

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

–class integer

// 成員

friend void set (integer& i, int n) // 友元

int get (void) const // 成員

friend int get (integer const& i) // 友元

private:

int m_n;

}; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

•因為不隸屬於同乙個作用域,友元和成員也不可能構成過載

五.友元操作符

•雙目操作符函式常被宣告為其左運算元的成員,同時也是其右運算元的友元,這樣它就可以毫無障礙地訪問左右兩個運算元的非公有成員,而不對封裝構成太大影響

–class mail 

;–class mbox

};–mbox mbox ("[email protected]");

mail mail ("通知", "今天18:00召開教學例會");

mbox << mail;

一.運算元與表示式

•運算元為左值或右值

–complex lv (1, 2);

complex const rv (3, 4);

-lv;

~rv;

•表示式的值必須是右值

–complex a (1, 2), b (3, 4);

-a = b; // 錯誤

二.成員函式

•常函式以支援右值型運算元,常返回值以支援右值型表示式的值

–class complex 

};

三.全域性函式

•常引數以支援右值型運算元,常返回值以支援右值型表示式的值

–complex const

operator- (complex const& opd)

操作符函式及過載(1)

在特定條件下,編譯器有能力把乙個由運算元和操作符共同組成的表示式,解釋為對乙個全域性或成員函式的呼叫,該全域性或成員函式被稱為操作符函式 通過定義操作符函式,可以實現針對自定義型別的運算法則,並使之與內建型別一樣參與各種表示式 一.成員函式 形如l r的雙目操作符表示式,將被編譯器解釋為 l.ope...

操作符函式及過載(3)

一.運算元與表示式 運算元為左值 complex lv 1,2 complex const rv 3,4 lv rv 錯誤 表示式的值為左值,且為運算元本身 而非副本 complex a 1,2 b 3,4 a a a b b a 二.成員函式 非常函式以支援左值型運算元,非常返回值以支援左值型表示...

操作符函式及過載(4)

常用於在容器型別中以下標方式獲取資料元素 非常容器的元素為左值,常容器的元素為右值 一.函式操作符 如果乙個類過載了函式操作符,那麼該類的物件就可以被當做函式來呼叫,其引數和返回值就是函式操作符函式的引數和返回值 引數的個數 型別以及返回值的型別,沒有限制 唯一可以帶有預設引數的操作符函式 一.解引...