conclusion1:
流插入運算子需要被過載成全域性函式。
一:流運算子的過載:
cout<<10<
cout是在iosream中定義的乙個ostream物件
iostream中對「<<」進行了過載。 cout<<10; 即 cout.operator<<(10);
ostream & ostream::operator<<(int n)
也就是說,cin和cout是定義在std namespace中的物件,通過cout<<10,其實就是呼叫的cout物件的成員函式,即out.operator<<(10);
因為cout是乙個物件,所以其實在這裡還是會新增乙個this指標。
二:流插入運算子為什麼要被過載為全域性函式
假設有complex物件c, 如果要用cout< 但是
1)不能在ostream類中對"<<"過載,因為ostream類已經被封裝好了。
2)不能在complex類中對"<<"過載,否則*this物件會混淆。(主要是出於使用的習慣,下面介紹)
class complex
};ostream &operator<<(ostream &os, complex &x)
《運算子的過載,需要在類外進行定義,此時在其他的原始檔使用cout《來輸出complex物件的話,需要在宣告該過載運算子。
extern ostream &operator<<(ostream &os, complex &x);
這樣是很不方便的,不滿足c++的封裝特性。
三:流運算子如何使用起來更方便?
使用友元函式,將流運算子過載為友元函式,這樣在其他的原始檔中使用的話,就只需要include標頭檔案。
class complex
friend ostream &operator<<(ostream &os, complex &x)
};使用友元函式還有乙個好處,可以訪問私有或者protected成員變數。
四:流運算子在類中過載
上面提到流運算子定義為全域性函式,是為了符合使用的習慣。
如果我們把流運算子在類中進行過載:
class complex
ostream &operator<<(ostream &os)
};那麼在使用的時候,
complex cobj1(2,4);
cobj1<
部分參考:
流運算子的過載
1.cout 是在iostream 中定義的,是ostream的物件 ostream ostream operator int n ostream ostream operator const char s 2.類似j a中重寫string方法一樣,c 中一般過載 運算子,一般為過載為全域性函式 b...
過載流插入運算子《和流提取運算子》
includeclass complex complex double r,double i complex operator complex c2 friend ostream operator ostream output,complex c private double real double...
過載流插入運算子和流提取運算子
有兩個矩陣a和b,均為2行3列。求兩個矩陣之和。過載運算子 使之能用與矩陣相加,如c a b。過載流插入運算子 和流提取運算子 使之能用與該矩陣的輸入和輸出,如cin a,cout 我是剛學習c de菜鳥 源 如下 include using namespace std class matrix m...