C 過載運算子的規則詳解

2021-08-04 06:49:42 字數 1638 閱讀 8429

(1)c++不允許使用者自己定義新的運算子,只能對已有的c++運算子進行過載。

例如,有人覺得basic中用「* *」作為冪運算子很方便,也想在c++中將「* *」定義為冪運算子,用「3* *5」表示35,這是不行的。

(2)c++允許過載的運算子

c++中絕大部分運算子都是可以被過載的。

不能過載的運算子只有5個:

.             (成員訪問運算子)

.*            (成員指標訪問運算子)

::             (域運算子)

sizeof    (長度運算子)

?:            (條件運算子)

前兩個運算子不能過載是為了保證訪問成員的功能不能被改變,域運算符合sizeof運算子的運算物件是型別而不是變數或一般表示式,不具備過載的特徵。

(3)過載不能改變運算子運算物件(即運算元)的個數。

如,關係運算子「>」和「<」等是雙目運算子,過載後仍為雙目運算子,需要兩個引數。運算子」+「,」-「,」*「,」&「等既可以作為單目運算子,也可以作為雙目運算子,可以分別將它們過載為單目運算子或雙目運算子。

(4)過載不能改變運算子的優先級別。

例如」*「和」/「優先順序高於」+「和」-「,不論怎樣進行過載,各運算子之間的優先順序不會改變。有時在程式中希望改變某運算子的優先順序,也只能使用加括號的方法強制改變過載運算子的運算順序。

(5)過載不能改變運算子的結合性。

如,複製運算子」=「是右結合性(自右至左),過載後仍為右結合性。

(6)過載運算子的函式不能有預設的引數

否則就改變了運算子引數的個數,與前面第(3)點矛盾。

(7)過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有乙個是類物件(或類物件的引用)。

也就是說,引數不能全部是c++的標準型別,以防止使用者修改用於標準型別資料成員的運算子的性質,如下面這樣是不對的:

複製**

**如下:

int operator + (int a,int b)

原來運算子+的作用是對兩個數相加,現在企圖通過過載使它的作用改為兩個數相減。

如果允許這樣過載的話,如果有表示式4+3,它的結果是7還是1呢?顯然,這是絕對要禁止的。

(8)用於類物件的運算子一般必須過載,但有兩個例外,運算子」=「和運算子」&「不必使用者過載。

複製運算子」=「可以用於每乙個類物件,可以用它在同類物件之間相互賦值。因為系統已為每乙個新宣告的類過載了乙個賦值運算子,它的作用是逐個複製類中的資料成員

位址運算子&也不必過載,它能返回類物件在記憶體中的起始位址。

(9)應當使過載運算子的功能類似於該運算子作用於標準型別資料時候時所實現的功能。

例如,我們會去過載」+「以實現物件的相加,而不會去過載」+「以實現物件相減的功能,因為這樣不符合我們對」+「原來的認知。

(10)運算子過載函式可以是類的成員函式,也可以是類的友元函式,還可以是既非類的成員函式也不是友元函式的普通函式。

源自:

過載運算子的規則

不太熟悉的一些c 的運算子 位運算子 按位異或 按位取反 條件運算子 求位元組數運算子 sizeof 過載運算子的規則 不允許創造新的運算子,只能對已有的 運算子進行過載 不能過載的運算子只有 個 sizeof 和 typeid 物件型別操作符 以及不能對它們進行過載的原因如下 在具體講解各個運算子...

C 過載運算子詳解

結構體,是一種可以自己編寫資料型別 如int,double等 的一種資料集合,宣告關鍵字struct,框架 宣告於main之外 struct 名稱 分號一定不要忘了例如 struct student 這樣你就成功定義了乙個 student 型別的資料集合,這意味著你可以這樣用 student bob...

C 過載運算子詳解

c 允許我們為我們的類重定義或過載大部分c 內建的運算子。這樣我們的類就可以通過這些運算子進行一些操作。比如加減乘除,賦值比較等。過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。比如我們要給...