運算子過載
過載的運算子必須接受至少乙個自定義型別。接受的引數都為內建型別的運算子無法被過載。
運算子作為類的成員函式被過載時,類的物件就作為第乙個引數。注意此時函式的返回方式。
過載++a會呼叫operator++(a),過載a++會呼叫operator++(a, int),其中第二個int引數是不會被用到的,只是用來區分字首和字尾呼叫。--的過載也是一樣。
=和只能作為成員函式被過載。()只能作為成員函式被過載,可以帶任意多個引數。(若可以不作為成員函式被過載,則對於內建型別的運算就可以被過載,這是沒有意義的)
->和->*也只能作為成員函式被過載,但對返回值有一定的限制。
.和.*不能被過載
返回值優化:
integer tmp(left.i + right.i);
return tmp;
這樣編譯器需要三步才能完成(構造,拷貝,析構),而return integer(left.i + right.i);則只需要一步
過載時作為成員或非成員函式的選擇:
所有的一元運算子 推薦作為成員
= () -> ->* 必須作為成員
+= -= /= *= ^=
&= |= %= >>= <<= 推薦作為成員
所有其他的二元運算子 推薦作為非成員
當物件還沒有被建立時,=呼叫的是建構函式或拷貝建構函式,為的是初始化物件;當物件已被建立時,=呼叫的才是operator=。因此
fee fee(1);
fee fum(fi);
這樣的寫法要比
fee fee = 1;
fee fum = fi;
這樣的寫法清晰。
在過載賦值運算子時,首先檢查是否是對自身賦值是個好習慣。
當物件中有指標時,拷貝建構函式通常需要連同複製出指標所指向的內容。而當此內容很大時,通常採用引用計數的方法,只在需要修改資料且引用數大於1時才複製內容。這種技術被稱為copy-on-write。
當建構函式接受乙個其他型別的物件作為引數時,編譯器可以用它來進行自動型別轉換。如果不需要這樣的自動轉換,在建構函式前加上explicit。
也可以過載operator 型別名來定義自動型別轉換。由於這種型別轉換是由源物件完成的(不像建構函式的型別轉換是由目標物件完成的),因此可以完成自定義物件到內建型別的轉換。
運算子過載為非成員函式時,運算子兩邊都可以進行自動型別轉換。
提供自動型別轉換時注意兩種型別之間只需提供一條轉換路徑,否則會出現二義性錯誤。
#include using namespace std;
templateclass array
// 提供乙個常版本的運算子
t const& operator (size_t num) const
int length(void) const
// 由於左運算元是標準提供的類,最好用友元的方式實現《過載
friend ostream& operator << (ostream& os, array const& arr)
private:
t m_arr[s];
};
C 中運算子過載
運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。比如int x,y 可以為y x y 而 my c1,c2 如果想使得兩個自定義的物件相加,以前只能調 用函式計算它們的和。而現在只要定義了運算子過載就能實現c1 c1 c2.所謂過載,就是重新賦予新的含義。函式過載就是對乙個已有的函式賦予新的...
C 中運算子過載
運算子過載可以寫在類的內部,也可以寫成全域性函式形式,其中運算子 在過載時必須宣告為類的成員函式 而運算子 sizeof 不能被過載 演算法運算子的過載不會改變運算子原有的優先順序。例子 include include include using namespace std class comple...
C 中的運算子過載(一) 運算子過載的概念
概述 運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別。運算子過載 operator overloading 只是一種 語法上的方便 也就是它只是另一種函式呼叫的方式,只是為了方便我們使用,運算子只能運算內建的資料型別,對於自定義的資料型別不能運算,所以我們可以過載...