C 自己實現cout

2021-10-08 20:50:07 字數 2325 閱讀 7706

接觸這麼久c++了,我想嘗試寫乙個自己的cout了。在實現之前,先扯扯幾個概念:

不就是輸出語句嘛?!這個答案太淺顯。正確答案:cout是類ostream的乙個物件,而這個物件有乙個成員過載運算子函式:operator <<。順便一說,類ostream又屬於iostream庫中,iostream是標準的c++標頭檔案。既然如此,那麼這個標頭檔案裡應該是這樣寫的:

//iostream

class

ostream

ostream operator

<<

(double n)..

.}ostream cout;

這個ostream::operator <<有多個過載版本,所以形參什麼型別都有,包括int,double,char等等。當我們寫cout
ostream &

operator

<<

(int n)

我們經常在程式開頭寫using namespace std;,但有沒有想過是幹什麼用的?

顧名思義,namespace的意思是命名空間,它是用來組織和重用**的。那這個到底有什麼用呢?

好,我們在腦中想這麼一種情況:你寫了乙個庫檔案,裡面有個名字叫fun的函式,很不幸你另外乙個人寫的庫檔案也有個名字叫fun的函式,這樣就衝突了。

//你的庫檔案裡:

void

fun();

//別人的庫檔案裡:

void

fun();

//有人想用fun()

fun();

//究竟該用哪個?衝突了!

這時,我們就想了乙個辦法,把你寫的fun函式放到乙個你命名的空間裡,把另外乙個人寫的fun函式放到另乙個命名空間裡。只要有人說要用你的空間,那麼他用的fun函式肯定是你寫的fun函式,不會是另外乙個人的。如果那個人說要用另乙個人的空間,那麼他用的fun函式肯定是另乙個人寫的fun函式,不會是你的。

//你的庫檔案裡:

namespace you

//別人的庫檔案裡:

namespace other

//當有人用你的函式時:

you::

fun();

//當有人用另外乙個人的函式時:

other::

fun();

//如果有人說要用你的空間,像這樣:

using

namespace you;

fun();

//這個其實是you::fun();,不會是other::fun();

扯了這麼多,其實這裡面表達的意思是:為了解決名字衝突問題,引入了名字空間這個概念,通過使用namespace ***;你所使用的庫函式或變數就是在該名字空間中定義的,這樣一來就不會引起不必要的衝突了。

那我們為什麼要寫using namespace std;?早期的c將標準庫功能定義在全域性空間裡,宣告在帶.h字尾的標頭檔案裡。c++標準為了和c區別開,也為了正確使用命名空間,規定標頭檔案不使用字尾.h。因此,當使用時,相當於在c中呼叫庫函式,使用的是全域性命名空間,這也是早期的c++實現;當使用的時候,該標頭檔案沒有定義全域性命名空間,必須使用namespace std;這樣才能正確使用cout。

假如不寫using namespace std;,那就要寫成std::cout<<了。每一句都這麼寫很煩,於是乾脆在程式開頭直接來一句using namespace std;

好了,其實這個iostream庫大概是這麼寫的:

//iostream

namespace std

ostream operator

<<

(double n)..

.}}std::ostream cout;

以上兩個已經講得很清楚了,下面上實現cout的**:

#include

namespace mystd

const myostream&

operator

<<

(const

char

*s)const};

}void

print()

intmain()

本**已經通過編譯,並且能正確輸出。對於c++的這些特性,當我們學得深入了以後,就很有必要弄懂了。

C 中cout精度控制

設定scientific標誌導致浮點數字值以科學記數法顯示 似乎是以十六進製制表示 當設定fixed時,浮點值以通常 記數法顯示。預設時,當設定fixed時,顯示六位十進位制位。當這些標誌都沒有設定時,編譯程 序選擇一種適當的方式。setprecsion n 是格式控制符。由於cout自身的問題,所...

C 輸出流cout方法

輸出指定字數的字串。basic ostream write const char type s,streamsize n 1 write遇到空字元時不會停止 2 即使超出邊界,write仍繼續列印 3 可用於資料資料 需將數值資料強制轉換為char 計數制函式 十進位制 十六進製制 八進位制 調整字...

C 輸出流cout方法

輸出指定字數的字串。basic ostream write const char type s,streamsize n 1 write遇到空字元時不會停止 2 即使超出邊界,write仍繼續列印 3 可用於資料資料 需將數值資料強制轉換為char 計數制函式 十進位制 十六進製制 八進位制 調整字...