c++對運算子過載定義了如下幾條規則。
1) c++不允許使用者自己定義新的運算子,只能對已有的c++運算子進行過載。 例如,有人覺得basic中用「**「作為冪運算子很方便,也想在c++中將」**「定義為冪運算子,用」3**5「表示3
5,這樣是不行的。
2) 過載不能改變運算子運算物件(即搡作數)的個數。如關係運算子「>」和「 <」 等是雙目運算子,過載後仍為雙目運算子,需要兩個引數。運算子「 +」,「-」,「*」,「&」等既可以作為單目運算子,也可以作為雙目運算子,可以分別將它們過載為單目運算子或雙目運算子。
3) 過載不能改變運算子的優先級別。例如「*」和「/」優先於「 +」和「-」,不論怎樣進行過載,各運算子之間的優先級別不會改變。有時在程式中希望改變某運算子的優先順序,也只能使用加圓括號的辦法強制改變過載運算子的運算順序。
4) 過載不能改變運算子的結含性。如賦值運算子是右結合性(自右至左),過載後仍為右結合性。
5) 過載運算子的函式不能有預設的引數,否則就改變了運算子引數的個數,與前面第(2)點矛盾。
6) 過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有乙個是類物件(或類物件的引用)。也就是說,引數不能全部是c++的標準型別,以防止使用者修改用於標準型別資料的運算子的性質,如下面這樣是不對的:
int operator + (int a,int b)
原來運算子+的作用是對兩個數相加,現在企圖通過過載使它的作用改為兩個數相減。 如果允許這樣過載的話,如果有表示式4+3,它的結果是7呢還是1?顯然,這是絕對禁止的。
如果有兩個引數,這兩個引數可以都是類物件,也可以乙個是類物件,乙個是c ++標準型別的資料,如
complex operator + (int a,complex&c)
它的作用是使乙個整數和乙個複數相加。
7) 用於類物件的運算子一般必須過載,但有兩個例外,運算子「=」和「&」不必過載。
①賦值運算子( = )可以用於每乙個類物件,可以利用它在同類物件之間相互賦值。 我們知道,可以用賦值運算子對類的物件賦值,這是因為系統已為每乙個新宣告的類過載了乙個賦值運算子,它的作用是逐個複製類的資料成員。使用者可以認為它是系統提供的預設的物件賦值運算子,可以直接用於物件間的賦值,不必自己進行過載。但是有時系統提供的預設的物件賦值運算子不能滿足程式的要求,例如,資料成員中包含指向動態分配記憶體的指標成員時,在複製此成員時就可能出現危險。在這種情況下, 就需要自己過載賦值運算子。
②位址運算子&也不必過載,它能返回類物件在記憶體中的起始位址。
8) 從理論上說,可以將乙個運算子過載為執行任意的操作,如可以將加法運算子過載為輸出物件中的資訊,將「>」運算子過載為「小於」運算。但這樣違背了運算子過載的初衷,非但沒有提髙可讀性,反而使人莫名其妙,無法理解程式。應當使過載運算子的功能類似於該運算子作用於標準型別資料時所實現的功能(如用「+」實現加法,用「>」實現「大於」的關係運算)。
9) 運算子過載函式可以是類的成員函式,也可以是類的友元函式,還可以是既非類的成員函式也不是友元函敝的普通函式。
以上這些規則是很容易理解的,不必死記。把它們集中在一起介紹,只是為了使讀者有乙個整體的概念,也便於查閱。
C 運算子過載規則
運算子過載是通過函式過載實現的,下面我們來介紹一下運算子過載需要遵循的規則。1 並不是所有的運算子都可以過載。能夠過載的運算子包括 newnew delete delete 上述運算子中,是下標運算子,是函式呼叫運算子。自增自減運算子的前置和後置形式都可以過載。長度運算子sizeof 條件運算子 成...
C 運算子過載規則
運算子過載時要遵循以下規則 1 除了類屬關係運算子 成員指標運算子 作用域運算子 sizeof運算子和三目運算子 以外,c 中的所有運算子都可以過載。2 過載運算子限制在c 語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。3 運算子過載實質上是函式過載,因此編譯程式對運算子過載的...
過載運算子的規則
不太熟悉的一些c 的運算子 位運算子 按位異或 按位取反 條件運算子 求位元組數運算子 sizeof 過載運算子的規則 不允許創造新的運算子,只能對已有的 運算子進行過載 不能過載的運算子只有 個 sizeof 和 typeid 物件型別操作符 以及不能對它們進行過載的原因如下 在具體講解各個運算子...