C 中的運算子過載

2021-07-04 05:38:48 字數 1581 閱讀 1463

運算子過載

過載的運算子必須接受至少乙個自定義型別。接受的引數都為內建型別的運算子無法被過載。

運算子作為類的成員函式被過載時,類的物件就作為第乙個引數。注意此時函式的返回方式。

過載++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 只是一種 語法上的方便 也就是它只是另一種函式呼叫的方式,只是為了方便我們使用,運算子只能運算內建的資料型別,對於自定義的資料型別不能運算,所以我們可以過載...