接觸這麼久c++了,我想嘗試寫乙個自己的cout了。在實現之前,先扯扯幾個概念:
不就是輸出語句嘛?!這個答案太淺顯。正確答案:cout是類ostream的乙個物件,而這個物件有乙個成員過載運算子函式:operator <<
。順便一說,類ostream又屬於iostream庫中,iostream是標準的c++標頭檔案。既然如此,那麼這個標頭檔案裡應該是這樣寫的:
//iostream
class
ostream
ostream operator
<<
(double n)..
.}ostream cout;
這個ostream::operator <<
有多個過載版本,所以形參什麼型別都有,包括int,double,char等等。當我們寫coutostream &
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 計數制函式 十進位制 十六進製制 八進位制 調整字...