c++的一大特性就是過載(overload),通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔、高效。在c++中不止函式可以過載,運算子也可以過載。由於一般資料型別間的運算子沒有過載的必要,所以運算子過載主要是物件導向之間的。
1.一般運算子過載
在進行物件之間的運算時,程式會呼叫與運算子相對應的函式進行處理,所以運算子過載有兩種方式:成員函式和友元函式。成員函式的形式比較簡單,就是在類裡面定義了乙個與操作符相關的函式。友元函式因為沒有this指標,所以形參會多乙個。
class
a a operator+(a&);//成員函式
a operator-(a&);
a operator*(a&);
a operator/(a&);
a operator%(a&);
friend a operator+(a&,a&);//友元函式
friend a operator-(a&,a&);
friend a operator*(a&,a&);
friend a operator/(a&,a&);
friend a operator%(a&,a&);
private:
int data;
};//成員函式的形式
aa::operator+(a &a)
aa::operator-(a &a)
aa::operator*(a &a)
aa::operator/(a &a)
aa::operator%(a &a)
//友元函式的形式
a operator+(a &a1,a &a2)
a operator-(a &a1,a &a2)
a operator*(a &a1,a &a2)
a operator/(a &a1,a &a2)
a operator%(a &a1,a &a2)
//然後我們就可以對類的物件進行+、-、*、/了。
void main(void)
注意:在進行a2+a3的時候會出錯,因為我們在上面對+定義了兩種方法,去掉一種即可。
2.關係運算子過載
因為函式體比較簡單,後面我就只給出成員函式形式的函式宣告了,關係運算子有==,!=,<,>,<=,>=。
bool
operator == (const a& );
bool
operator != (const a& );
bool
operator
< (const a& );
bool
operator
<= (const a& );
bool
operator > (const a& );
bool
operator >= (const a& );
3.邏輯運算子過載
bool
operator || (const a& );
bool
operator && (const a& );
bool
operator ! ();
4.單目運算子過載
這裡的+、-是正負的意思,放在物件前面。
a& operator + ();
a& operator - ();
a* operator & ();
a& operator * ();
5.自增減運算子過載
++和–根據位置的不同有四種情況,都可以過載。
a& operator ++ ();//前置++
a operator ++ (int);//後置++
a& operator --();//前置--
a operator -- (int);//後置--
6.位運算子過載
按位操作。
a operator | (const a& );
a operator & (const a& );
a operator ^ (const a& );
a operator
<< (int i);
a operator >> (int i);
a operator ~ ();
7.賦值運算子過載
a& operator += (const a& );
a& operator -= (const a& );
a& operator *= (const a& );
a& operator /= (const a& );
a& operator %= (const a& );
a& operator &= (const a& );
a& operator |= (const a& );
a& operator ^= (const a& );
a& operator
<<= (int i);
a& operator >>= (int i);
8.記憶體運算子過載
void *operator
new(size_t size);
void *operator
new(size_t size, int i);
void *operator
new(size_t size);
void
operator
delete(void*p);
void
operator
delete(void*p, int i, int j);
void
operator
delete (void* p);
9.特殊運算子過載
上面的運算子過載都有兩種方式,而下面的運算子只能用一種,特殊吧。 這些運算子的過載只能是成員函式。
a& operator = (const a& );
char
operator (int i);//返回值不能作為左值
const
char* operator () ();
t operator -> ();
//型別轉換符
operator
char* () const;
operator
int ();
operator
const
char () const;
operator
short
int () const;
operator
long
long () const;
//還有很多就不寫了
而這些只能以友元函式的形式過載
friend
inline ostream &operator
<< (ostream&, a&);//輸出流
friend
inline istream &operator >> (istream&, a&);//輸入流
10.總結
兩種過載方式的比較:
一般情況下,單目運算子最好過載為類的成員函式;雙目運算子則最好過載為類的友元函式。
以下一些雙目運算子不能過載為類的友元函式:=、()、、->。 型別轉換函式只能定義為乙個類的成員函式而不能定義為類的友元函式。
c++提供4個型別轉換函式:reinterpret_cast(在編譯期間實現轉換)、const_cast(在編譯期間實現轉換)、stactic_cast(在編譯期間實現轉換)、dynamic_cast(在執行期間實現轉換,並可以返回轉換成功與否的標誌)。
若乙個運算子的操作需要修改物件的狀態,選擇過載為成員函式較好。
若運算子所需的運算元(尤其是第乙個運算元)希望有隱式型別轉換,則只能選用友元函式。
當運算子函式是乙個成員函式時,最左邊的運算元(或者只有最左邊的運算元)必須是運算子類的乙個類物件(或者是對該類物件的引用)。如果左邊的運算元必須是乙個不同類的物件,或者是乙個內部型別的物件,該運算子函式必須作為乙個友元函式來實現。
當需要過載運算子具有可交換性時,選擇過載為友元函式。
注意事項:
除了類屬關係運算子」.「、成員指標運算子」.*「、作用域運算子」::「、sizeof運算子和三目運算子」?:「以外,c++中的所有運算子都可以過載。
過載運算子限制在c++語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。
運算子過載實質上是函式過載,因此編譯程式對運算子過載的選擇,遵循函式過載的選擇原則。
過載之後的運算子不能改變運算子的優先順序和結合性,也不能改變運算子運算元的個數及語法結構。
運算子過載不能改變該運算子用於內部型別物件的含義。它只能和使用者自定義型別的物件一起使用,或者用於使用者自定義型別的物件和內部型別的物件混合使用時。
運算子過載是針對新型別資料的實際需要對原有運算子進行的適當的改造,過載的功能應當與原有功能相類似,避免沒有目的地使用過載運算子。
c 運算子過載總結
目錄 1.一般運算子過載 2.關係運算子過載 3.邏輯運算子過載 4.單目運算子過載 5.自增減運算子過載 6.位運算子過載 7.賦值運算子過載 8.記憶體運算子過載 9.特殊運算子過載 10.總結c 的一大特性就是過載 overload 通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔 ...
C 運算子過載總結
c 的一大特性就是過載 overload 通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔 高效。在c 中不止函式可以過載,運算子也可以過載。由於一般資料型別間的運算子沒有過載的必要,所以運算子過載主要是物件導向之間的。1.一般運算子過載 在進行物件之間的運算時,程式會呼叫與運算子相對應的...
C 運算子過載總結
c 的一大特性就是過載 overload 通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔 高效。在c 中不止函式可以過載,運算子也可以過載。由於一般資料型別間的運算子沒有過載的必要,所以運算子過載主要是物件導向之間的。在進行物件之間的運算時,程式會呼叫與運算子相對應的函式進行處理,所以運...