c++中的運算子
1。大多數系統預定義運算子都能過載
. :: ?: # *
?:不值得過載
#不能被過載
2過載不能改變優先順序
不能改變結合性
不能改變運算子所需運算元的個數
過載後,可按這些運算子的表達方式使用
運算子過載的語法
一、通過運算子過載函式進行過載
1。運算子過載函式是成員函式
語法形式:
type x::operator@(參數列)
void x::operator +(參數列)
2.運算子過載函式是友元函式
語法形式:
type operator@(參數列)
注意:過載中注意的問題
1、運算子過載函式是友元函式、成員函式的區別;
2、運算子被過載時,只是相對一特定類被過載,在特定的環境下作出特定的解釋。當離開這個特定環境後,具有原來的意義(系統定義);
3、當過載運算子解釋失敗時,用該運算子的預定義版本(系統)進行解釋;
4、用此方法過載時,只能對乙個系統已有運算子進行特定環境下的新的解釋,而不能創造新的運算子。當運算子不夠用時,用函式呼叫來實現;
5、除「=」以外,過載的運算子可以被任何派生類所繼承,「=」需要每個類明確定義自己的解釋;
6、 過載可能讓程式的可讀性下降,在使用時應模仿運算子的習慣用法 。
一元和二元運算子
一、運算子過載函式定義的兩種方式
1、成員函式和友元函式
2、差別的關鍵原因:this指標
二、一元運算子
1、不論字首還是字尾,需要乙個運算元
2、對於任意一元運算子α:
(1)成員函式過載運算子
定義 type x::operator α( )
顯式呼叫 objx.operator α( )
隱式呼叫 αobjx 或:ojbxα
(2)友元函式過載運算子
定義 type operator α(xobj)
顯式呼叫 operatorα(obj x)
隱式呼叫 αojbx 或:objx α
一元操作符
成員函式 運算元通過this指標隱含傳遞,因此參數列為空。
友元函式 所需要的乙個運算元在參數列中,由物件顯式地提供
二元操作符
成員函式 第乙個運算元通過this指標隱含傳遞,第二個運算元通過引數提供,只有乙個引數。
友元函式 所需要的兩個運算元在參數列中,由物件顯式地提供。
(1)成員函式過載運算子
定義 type x::operator β(x obj)
顯式呼叫 objx1.operator β(objx2)
隱式呼叫 objx1 β(objx2)
(2)友元函式過載運算子
定義 type operator β( x ojb)
顯式呼叫 operator β(objx1, objx2)
隱式呼叫 objx1 β(objx2)
成員函式過載運算子,啟用運算子的物件都是由this指標隱含傳遞的。
二、例項
class x
x operator ++(int x)
用友元函式過載運算子
class x
friend operator ++(y &a, int i)
1、成員函式過載可能造成的麻煩:成員函式過載的運算子不具有交換性。
原因:成員函式僅能被乙個「實際物件」所呼叫,如果引起成員函式呼叫的是乙個值(非乙個物件),成員函式將不能正確工作。
2、可用友元函式解決這一問題:
友元函式過載運算子時,需要明確給出引數,不會出錯。
3、不能用友元函式過載的運算子:
= 、 ( )、[]、- >
4、注意:
(1)對this所指向的資料的任何改變都會影響到啟用運算數函式的物件。
(2)可使用引用引數(指標)來解決過載時的二義性。
過載++和--
一、關於++和- -
1、c中的++和- -的兩種形式:
字首:++i; 字尾:i--;
2、在c++中的約定 (顯式地區分字首和字尾)
(1)對於字首方式++i:
成員函式:xx::operator ++ ();
友元函式:x operator ++ (x&);
(2)對於字尾方式i++:
成員函式:xx::operator ++ (int);
友元函式:x operator ++(x&, int);
第二個引數int一般設定為0,如:
i++ 等價於:i++(0) 或:i++=0
過載賦值運算子
一、概述
1、「=」賦值運算子可以被過載;
2、過載後不能被繼承;
3、必須過載為成員函式。
二、格式:
x x :: operator=(const x from)
三、一般來說當預設的類賦值函式不能正確工作時,考慮「=」的過載。
過載運算子()和[]
一、過載函式呼叫運算子()
1、函式為:operator();
2、格式:
x x;
x(arg1, arg2) 可被解釋為:x. operator ()(arg1,arg2);
二、過載下標運算子[]
1、函式為:operator[];
2、格式:
x x;
x(y) 可被解釋為:x. operator [ ](y);
三、兩都者只能採用成員函式過載,不能使用友元函式。
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
運算子過載
eric gunnerson microsoft corporation 2001年6月21日 作為有關 c 語言規範漫談的繼續,本月我們將討論運算子過載的問題。運算子過載 除非特別指明,否則本專欄的其餘部分一律將其簡稱為 過載 是指允許使用者使用使用者定義的型別編寫表示式的能力。它允許使用者定義的...