運算子過載專題

2021-06-26 14:58:25 字數 1928 閱讀 6007

1.不能過載的運算子

類屬關係運算子「.」

成員指標運算子「*」

作用域分辨符「::」

sizeof運算子

三目運算子「?:」

2.基本規則

1.一元操作符可以是不帶引數的成員函式或帶乙個引數的非成員函式。

2.二元操作符可以是帶乙個引數的成員函式或帶兩個引數的非成員函式。

3.operator=、operator、operator()、operator->只能定義為成員函式。

4.成員函式過載operator++和operator--時帶乙個int引數表示字尾(即字尾是二元操作符)

不帶引數表示字首(即字首是一元操作符)

(1)運算子過載為成員函式

(a)對於二元運算子op,如果要過載op為某類的成員函式,使之能夠實現表示式 k op t,其中k為a類的物件,則應當把op過載為a類的成員函式,該函式只有乙個形參,形參的型別是t所屬的型別。經過這樣過載之後,表示式 k op t 就相當於函式呼叫k.operator op( t )

(b)對於前置一元運算子u(如負號「-」「--」「++」),若要過載u為類的成員函式,用來實現表示式u oprd,其中oprd為a類的物件,則u應當過載為a類的成員函式,且該函式不帶形參。經過過載之後,表示式u oprd 就相當於函式呼叫oprd.operator u()。

(b)後置運算子「++」和「--」,若要將它們過載為類的成員函式,用來實現表示式oprd++或oprd--,其中oprd為a類的物件,那麼就應當過載這2個運算子為a類的成員函式,這時函式要帶有乙個整型(int)形參(相當於是二元操作符,只是一元的形式)。過載之後,表示式 oprd ++ 和 oprd -- 就分別相當於函式呼叫oprd.operator ++(0) 和 oprd.operator --(0)。

(2)運算子過載為全域性(友元)函式

(a)對於二元運算子op,如果它的乙個運算元為類a的物件,就可以將op過載為a類的友元函式,該函式有兩個形參,其中乙個形參的型別是a類。經過這樣的過載之後,表示式k op t就相當於函式呼叫operator op( k, t )

(b)對於前置一元運算子u(如負號「-」「++」「--」),若要實現表示式 u oprd 其中oprd為a類的物件,則u可以過載為a類的友元函式,函式有乙個形參,為a類的物件oprd。經過過載之後,表示式u oprd 就相當於函式呼叫operator u( oprd )

(c)對於後置運算子「++」和「--」,如果要實現表示式 oprd ++ 或 oprd --, 其中oprd為a類的物件,那麼運算子就可以過載為a類的友元函式,這時函式的形參有兩個,乙個是a類的物件oprd,另乙個是整型(int)形參。第二個引數是用於與前置運算子函式相區別的。過載之後,表示式oprd ++ 和 oprd -- 就分別相當於函式呼叫operator ++ (oprd, 0)

和operator -- (oprd, 0)。

一般說來,單目運算子最好被過載為成員;對雙目運算子最好被過載為友元函式,雙目運算子過載為友元函式比重載為成員函式更方便,但是,有的雙目運算子還是過載為成員函式為好,例如,賦值運算子。

Swift 運算子過載專題

import foundation struct vector3 var va vector3 x 1,y 2,z 3 var vb vector3 x 4,y 5,z 6 func left vector3,right vector3 vector3 va vb func left vector3...

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...