之前看《effective c++》的時候,對這一部分印象比較深刻,雖然讀的時候有寫筆記,但是現在還是寫下來我對這一部分理解。詳細的內容可以看條款19:分清成員函式,非成員函式和友元。
條款19的結論如下:
只有在下列情況下,讓函式f成為類c的非成員函式。其餘情況,f都宣告為c的成員函式。
(1)operator>>和operator《決不能是成員函式,如果f是operator>>或operator<<,讓f成為非成員函式。如果f還要訪問c的非公有成員,讓f成為c的友元函式。
(2)如果f需要對最左邊的引數進行型別轉換,讓f成為非成員函式。如果f還要訪問c的非公有成員,讓f成為c的友元函式。
照著書上的內容寫了兩個很簡單的例子:
(1)關於operator>>和operator<<
假如operator>>和operator《是類的成員函式,以string類為例,在類中會有這樣的定義
class string
private:
char* m_pdata;
public:
istream& operator>>(istream& input);
ostream& operator<<(ostream& output);
則在呼叫的時候,會出現這樣的形式
string str;
str>>cin; 等同於str.operator>>(cin);
str《雖然這樣是合法的,編譯器並不會報錯,但是看起來並不是很合理。因此需要將operator>>和operator《宣告為非成員函式。
string.h
string.cpp
main.cpp
(2)需要對最左邊的引數進行型別轉換
有乙個有理數的類,假設opertor*是成員函式
class rational
private:
int numerator;
int denominator;
public:
rational operator*(const rational& r);
則rational result = r * 2;,等同於 r.operator*(2),編譯器對2進行了強制型別轉換,可以進行運算
而rational result = 2 * r,等同於2.operator*(r),對2來說,沒有operator*這個成員函式。就不可以進行運算了,「編譯器會去搜尋operator * (2, r)這樣的非成員函式」(書上),但是搜尋失敗
rational.h
rational.cpp
main.cpp
關於運算子過載
所謂運算子過載其實就是對於運算子針對不同操作物件而實現不同功能,其實質就是函式過載 函式過載前面有一篇介紹 實現過程就是先把運算表示式轉化為對運算子函式的呼叫,把運算物件轉化為運算函式的實參,然後根據實參的型別確定需要呼叫的函式。另外,c 標準規定了一些不能過載的操作符,分別是 1.類屬關係運算子 ...
關於運算子過載 總結
1 運算子過載是為了對使用者自定義資料型別的資料的操作與內定義的資料型別的資料的操作形式一致。不能過載的5個運算子 成員指標訪問運算子 域運算子 sizeof長度運算子 條件運算子 成員訪問符。運算過載的三種方式 普通函式,友元函式,類成員函式。當過載為成員函式時,雙目運算子僅有乙個引數。對單目運算...
關於過載運算子
關於c 中的過載運算子 學習部落格1 學習部落格2 記得好久之前學 dijkstra 的堆優化的時候 gxb 神仙給我講過,當時就是不明白感覺 gxb 都要崩潰了的亞子,好歹算是知道了,但是隨著時間的流逝,他竟然趁我不注意從我腦子裡跑了!gxb 正拿著刀在趕來的路上 我們可以重定義或過載 c 內的大...