C 運算子過載規則

2021-10-03 21:50:00 字數 1725 閱讀 5304

運算子過載是通過函式過載實現的,下面我們來介紹一下運算子過載需要遵循的規則。

1 並不是所有的運算子都可以過載。能夠過載的運算子包括:

+-*

/%^&

|~!=

<

>+=

-=*=

/=%=

^=&=

|=<<

>>

<<=

>>=

==!=

<=

>=

&&||

++--,-

>*-

>()

newnew

delete

delete

上述運算子中,是下標運算子,()是函式呼叫運算子。自增自減運算子的前置和後置形式都可以過載。長度運算子sizeof、條件運算子: ?、成員選擇符.和域解析運算子::不能被過載。

c4 = c1 + c2 * c3;
等價於:

c4 = c1 +

( c2 * c3 )

;

乘法的優先順序仍然高於加法,並且它們仍然是二元運算子。

3 過載不會改變運算子的用法,原有幾個運算元、運算元在左邊還是在右邊,這些都不會改變。例如~號右邊只有乙個運算元,+號總是出現在兩個運算元之間,過載後也必須如此。

4 運算子過載函式不能有預設的引數,否則就改變了運算子運算元的個數,這顯然是錯誤的。

5 運算子過載函式既可以作為類的成員函式,也可以作為全域性函式。

將運算子過載函式作為類的成員函式時,二元運算子的引數只有乙個,一元運算子不需要引數。之所以少乙個引數,是因為這個引數是隱含的

complex 類中過載了加法運算子:

complex operator+(

const complex & a)

const

;

當執行:

c3 = c1 + c2;
會被轉換為:

c3 = c1.

operator

+(c2)

;

通過 this 指標隱式的訪問 c1 的成員變數。

將運算子過載函式作為全域性函式時,二元操作符就需要兩個引數,一元操作符需要乙個引數,而且其中必須有乙個引數是物件,好讓編譯器區分這是程式設計師自定義的運算子,防止程式設計師修改用於內建型別的運算子的性質。

如果有兩個引數,這兩個引數可以都是物件,也可以乙個是物件,乙個是c ++內建型別的資料,例如:

complex operator+(

int a, complex &c)

它的作用是使乙個整數和乙個複數相加。

另外,將運算子過載函式作為全域性函式時,一般都需要在類中將該函式宣告為友元函式。原因很簡單,該函式大部分情況下都需要使用類的 private 成員。

上節的最後乙個例子中,我們在全域性範圍內過載了+號,並在 complex 類中將運算子過載函式宣告為友元函式,因為該函式使用到了 complex 類的 m_real 和 m_imag 兩個成員變數,它們都是 private 屬性的,預設不能在類的外部訪問。

6 箭頭運算子->、下標運算子[ ]、函式呼叫運算子( )、賦值運算子=只能以成員函式的形式過載。

C 運算子過載規則

運算子過載時要遵循以下規則 1 除了類屬關係運算子 成員指標運算子 作用域運算子 sizeof運算子和三目運算子 以外,c 中的所有運算子都可以過載。2 過載運算子限制在c 語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。3 運算子過載實質上是函式過載,因此編譯程式對運算子過載的...

C 運算子過載的規則

c 對運算子過載定義了如下幾條規則。1 c 不允許使用者自己定義新的運算子,只能對已有的c 運算子進行過載。例如,有人覺得basic中用 作為冪運算子很方便,也想在c 中將 定義為冪運算子,用 3 5 表示3 5,這樣是不行的。2 過載不能改變運算子運算物件 即搡作數 的個數。如關係運算子 和 等是...

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...