流運算子的過載

2021-10-01 09:51:33 字數 1181 閱讀 4294

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...