概念
在c++語言中,可以用關鍵字operator加上運算子來表示函式,叫做運算子過載。例如兩個複數相加函式:
complex add(const complex &a, const complex &b);
可以用運算子過載來表示:
complex operator +(const complex &a, const complex &b);
運算子與普通函式在呼叫時的不同之處是:對於普通函式,引數出現在圓括號內;而對於運算子,引數出現在其左、右側。例如
complex a, b, c;
…c = add(a, b); // 用普通函式
c = a + b; // 用運算子 +
如果運算子被過載為全域性函式,那麼只有乙個引數的運算子叫做一元運算子,有兩個引數的運算子叫做二元運算子。
如果運算子被過載為類的成員函式,那麼一元運算子沒有引數,二元運算子只有乙個右側引數,因為物件自己成了左側引數。
從語法上講,運算子既可以定義為全域性函式,也可以定義為成員函式。文獻[murray , p44-p47]對此問題作了較多的闡述,並總結了表8-4-1的規則。
運算子規則
所有的一元運算子
建議過載為成員函式
= () ->
只能過載為成員函式
+= -= /= *= &= |= ~= %= >>= <<=
建議過載為成員函式
所有其它運算子
建議過載為全域性函式
表8-4-1 運算子的過載規則
由於c++語言支援函式過載,才能將運算子當成函式來用,c語言就不行。我們要以平常心來對待運算子過載:
(1)不要過分擔心自己不會用,它的本質仍然是程式設計師們熟悉的函式。
(2)不要過分熱心地使用,如果它不能使**變得更加易讀易寫,那就別用,否則會自找麻煩。
不能被過載的運算子
在c++運算子集合中,有一些運算子是不允許被過載的。這種限制是出於安全方面的考慮,可防止錯誤和混亂。
(1)不能改變c++內部資料型別(如int,float等)的運算子。
(2)不能過載『.』,因為『.』在類中對任何成員都有意義,已經成為標準用法。
(3)不能過載目前c++運算子集合中沒有的符號,如#,@,$等。原因有兩點,一是難以理解,二是難以確定優先順序。
(4)對已經存在的運算子進行過載時,不能改變優先順序規則,否則將引起混亂。
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...