operator是c++中的關鍵字,它和運算子一起使用,表示乙個運算子函式,理解時應將operator=整體上視為乙個函式名.
這是c++擴充套件運算子功能的方法,雖然樣子古怪,但也可以理解:一方面要是運算子的使用方法與原來的一致,另一方面擴充套件功能只能通過函式的方式(c++中,"功能都是由函式是實現的").
一、為什麼使用操作符過載?
比如判斷兩個人是否一樣大,我們預設用年齡,所以在設計person的這個class的時候,我們要考慮操作符==,而且比較的應該是age.那麼為什麼叫做過載呢?這是因為,在編譯器實現的時候,已經為我們提供了這個操作符的基本資料型別實現版本,但是現在他的運算元變成了使用者定義的資料型別class,所以需要我們來提供該函式的實現.
二.如何實現乙個過載的操作符呢?
a:操作符過載實現為類成員函式
過載的操作符在類體重被宣告,宣告方式如同普通成員函式一樣,只不過他的名字包含關鍵字operator,以及緊跟其後的乙個c++預定義的操作符.
如下方式宣告乙個預定義的==操作符:
class person
inline bool operator == (const person &ps) const;};
實現方式如下:
inline bool person::operator==(const person &ps)const
if(this->age==ps.age)
return true;
return false;
呼叫方式如下:
#include
using namespace std;
int main()
這裡,因為operator ==是class person的乙個成員函式,所以物件p1,p2都可以呼叫該函式,上面的if語句中,相當於p1呼叫函式==,把p2作為該函式的乙個引數傳遞給該函式,從而實現了兩個物件的比較。
b:操作符過載實現為非類成員函式(全域性函式)
對於全域性過載操作符,代表左運算元的引數必須被顯式指定。例如:
#include using namespace std;
class person;
bool operator==(person const &p1,person const &p2)
int main()
{person rose;
person jack;
rose.age=18;
jack.age=23;
if(jack==rose)
cout<<"ok"
c:如何據頂把乙個操作符過載為類成員函式還是全域性名字呢?
1.如果乙個過載操作符是類成員,那麼只有當與他一起使用的左運算元是該類的物件時,該操作符才會被呼叫,如果該操作符的左運算元必須是其他型別,則操作符必須被過載成全域性名字空間的成員.
2.c++要求賦值=,下標,呼叫(),和成員指向->操作符必須被定義為類成員操作符.任何把這些操作符定義為名字空間成員的定義都會被標記為編譯時刻錯誤.
3.如果有乙個運算元是類型別如string類的情形那麼對於對稱操作符比如等於操作符,最好定義為全域性名字空間成員.
C 關鍵字operator用法
1 operator 用於型別轉換函式 型別轉換函式的特徵 1 型轉換函式定義在源類中 2 須由 operator 修飾,函式名稱是目標型別名或目標類名 3 函式沒有引數,沒有返回值,但是有return 語句,在return語句中返回目標型別資料或呼叫目標類的建構函式。型別轉換函式主要有兩類 1 物...
C 學習筆記 operator關鍵字
使用operator關鍵字來過載內建運算子,或提供類或結構宣告中的使用者定義轉換。下面是分數的乙個極其簡化的類。該類過載了 和 運算子,以執行分數加法和乘法 同時提供了將 fraction 型別轉換為 double 型別的轉換運算子。cs keyword operator.cs using syst...
運算子過載關鍵字operator
operator關鍵字用來過載內建運算子,使用方法如下 public class operatorcontroller controller overload operator public static operatorcontroller operator operatorcontroller ...