首先說句,為什麼要使用操作符過載呢?
其實我們使用別人編寫好的類時往往不用考慮,你不用檢視cout << a; 中《是如何過載的,就可以自如地在螢幕上輸出或在檔案中寫入字元,字串,數字,乃至指標位址,可當我們自己設計類給自己或其他程式設計師使用時就不得不考慮了。
現在假設我設計乙個時間類,初始宣告**如下
class time
;
這裡就只有兩個成員變數和乙個建構函式,實際過載時會有以下幾種情況:
這時我們有兩種選擇,第一種就是常見的成員函式實現:
time time::operator +(const time &t) const
第二種就是使用友元函式來實現:time operator+(const time &t1, const time &t2)
當然,我們要在類宣告中新增對應的函式宣告,修改類宣告**:
class time
;
這裡需要注意的就是這兩種不能同時定義,否則編譯時會有二義性錯誤,因為當你在其它檔案中使用加法時:
time coding(2,40);
time fixing(5,55);
time total;
total = coding + fixing;
編譯器將不知道要匹配哪種方法。那麼就有人問了,為啥還要有友元函式這種方法呢?是閒著沒事做嗎?當然不是,我們來看第二種情況。
現在呢,其他人給我提供的時間物件是乙個double型的變數,單位呢是小時,我需要整合運算,理論上來說只需要過載操作符過載函式即可,也就是加入宣告**:
time operator+ (double n)const;
以及對應的實現:
time time::operator+(double n) const
到這裡,假設有個time類的例項a,計算a+1.5是沒問題的,可計算1.5+a是不行的,因為左邊的運算元不是呼叫物件,這裡就需要非成員函式,而且還要能訪問類的私有成員,於是友元函式就產生了,它在類中宣告,但不是成員函式,但又能訪問私有成員。所以還需要在類中宣告:
friend time operator+ (double n, const time & t);
實現檔案中定義:
time operator+ (double n, const time & t)
當然有更簡單的方法:
time operator+ (double n, const time & t)
這裡友元函式和成員函式都需要定義,因為引數順序不同。
成員函式對應a+1.5,友元函式對應1.5+a。
綜上,要實現time類兩兩相加或加上乙個double型別,要2個成員函式和1個友元函式,那有沒有簡單點的實現呢?
有的,那就是利用類的隱式轉換。首先看:
int a = 3.33;
這是可行的,c++將double型的自動轉換為int型,假如兩種型別互相相容的話,c++都會自動轉換。
那麼,當我們在類宣告中加入接受乙個引數的建構函式時,這個建構函式可以作為轉換函式來轉換型別。加入宣告:
time (double dhrs);
實現**:
time::time(double dhrs)
那麼下面的**是合法的:
time planning;
planning = 1.5;
程式將使用建構函式time( double ) 來建立乙個臨時time物件,引數即為1.5。隨後,採用逐成員賦值的方法將該臨時物件的內容複製到planning中。
notes:
當然,這種特性是可以關閉的,當你要防止意外的自動轉換時,可以用關鍵字explicit來關閉該特性,也就是,宣告為:
explicit time (double dhrs);
顯式轉換則不受影響。使用轉換函式還可以將time物件隱式轉換為double型,關於轉換函式更詳細地可以再單獨了解學習。
現在再回過頭來看加法的實現,首先將之前的3個函式去掉,在類中宣告如下的友元函式:
friend time operator+ (const time & t1, const time & t2);
在實現檔案中新增實現**:
time operator+ (const time & t1, const time & t2)
這時候就可以實現:
time a, b;
a + b;
a + 1.5;
1.5 + a;
因為他們被解釋為operator+(a, b); operator+(a, 1.5); operator+(1.5, a);
在這些函式中引數的double型別被自動隱式轉換為time類,然後運算。
好了,關於操作符過載就說到這裡了,完成,如有錯誤,還望不吝賜教。
c 中 操作符過載
操作符過載 1.有先後順序,如 t3 t1 t2 則t1 t2等價於t1.operate t2 2.對 操作符進行過載時,如aa是有本質區別的。操作符過載就是用函式的方法對乙個操作符進行重新定義,在該函式中定義了操作符所要完成的功能。其中cout是輸出流ostream中的物件 元素 3.a cout...
C 中 操作符過載
在實際程式中遇到一操作符問題,記錄下來方便以後查詢。在寫hashtable資料結構中,遇到操作符過載問題,具體需求如下 1.a x b 如果a x 為空,則新增記錄 2.b a x 如果a x 為空,則提示出錯 對操作符過載之後發現根本不能解決問題,查詢一些資料後發現該問題為過載後的讀寫問題,乙個過...
c 中過載《操作符
在類定義中,有時候我們需要直接利用cout來列印出類中的資料,此刻就需要過載 操作符來實現 假定定義了乙個類time 然後宣告了乙個類 time a cout 這樣的語法肯定是會報錯的,此刻就需要過載operator 要怎麼做呢?首先,在過載函式中,要訪問到類time中的私有成員的資料,所以我們需要...