1、運算子過載是為了對使用者自定義資料型別的資料的操作與內定義的資料型別的資料的操作形式一致。不能過載的5個運算子:*成員指標訪問運算子;::域運算子;sizeof長度運算子;?:條件運算子;.成員訪問符。
運算過載的三種方式:普通函式,友元函式,類成員函式。
當過載為成員函式時,雙目運算子僅有乙個引數。對單目運算子,過載為成員函式時,不能再顯式說明引數。過載為成員函式時,總時隱含了乙個引數,該引數是this指標。this指標是指向呼叫該成員函式物件的指標。
運算子過載函式還可以為友元函式。當過載友元函式時,將沒有隱含的引數this指標。這樣,對雙目運算子,友元函式有2個引數,對單目運算子,友元函式有乙個引數。但是,有些執行符不能過載為友元函式,它們是:=,(),和->。
原因:有人說是因為
c++規定賦值運算子「=」只能過載為類的非靜態成員函式,而不可以過載為類的友元函式。
不能過載為類的靜態成員應該比較容易理解,因為靜態成員函式是屬於整個類的,不是屬於某個物件的,它只能去操作類靜態資料成員。而賦值運算子「=」是基於物件操作的。
當把賦值運算子過載為類的友員函式,在程式中執行類物件的賦值語句時,程式就會出現兩種矛盾的選擇。
(1)因為它認為類中並沒有過載賦值運算子的成員函式,所以它根據c++的規則,會去呼叫相應的建構函式。
(2)但是在全域性裡,我們已經過載了引數型別為此類型別的賦值運算子函式,而這賦值語句剛好和這函式匹配上了,根據c++的規則,也會去呼叫這函式。
程式是不允許有矛盾不確定選擇的,所以當賦值運算子過載為類的友元函式時,編譯器就會提示錯誤。
2、流運算子為什麼不能過載為成員函式,只能用友元函式過載,cout//用過載運算子表示,只能通過友員來實現,如果要用成員函式,則會有cout.operator<<(const f& f),所以這是不可能的.因此只能用友員來實現,operator<<(cout,f) 而cout是ostream型的,因此有以下標準格式.注意不能加const,因為cout是要改變的,會改變裡的緩衝成員.
friend ostream& operator<<( ostream& cout, constf&) //輸出運算子的標準過載格式.
friend istream& operator>>(istream& is, f& f) //輸入運算子過載標準格式
#include
using namespace std;
class f
friend ostream& operator<<(ostream& os, const f& f)
friend ostream& operator<<(ostream& os,const a& a)
operator int()
operator bool()
operator char()
}; intmain()
關於運算子過載的總結
在講運算子過載之前,先補充一下友元的知識 類可以允許其他類或者函式訪問它的非公有成員,方法是令其他類或者函式成為他的友元 friend 如果類想把乙個函式作為他的友元,只需要增加一條以friend關鍵字開始的函式宣告語句即可 友元宣告只能出現在類定義的內部,但是在類內出現的具體位置不限,不是類的成員...
關於運算子過載
之前看 effective c 的時候,對這一部分印象比較深刻,雖然讀的時候有寫筆記,但是現在還是寫下來我對這一部分理解。詳細的內容可以看條款19 分清成員函式,非成員函式和友元。條款19的結論如下 只有在下列情況下,讓函式f成為類c的非成員函式。其餘情況,f都宣告為c的成員函式。1 operato...
關於運算子過載
所謂運算子過載其實就是對於運算子針對不同操作物件而實現不同功能,其實質就是函式過載 函式過載前面有一篇介紹 實現過程就是先把運算表示式轉化為對運算子函式的呼叫,把運算物件轉化為運算函式的實參,然後根據實參的型別確定需要呼叫的函式。另外,c 標準規定了一些不能過載的操作符,分別是 1.類屬關係運算子 ...