很高興,學習《c/c++》系列又出二了。這篇文章將要講一講"cin>>","cout<<"究竟做了什麼事。
什麼叫"c++有魔力的操作符"我還不太了解,因為確實不能理解操作符在類庫裡面是怎樣定義的,或著在類庫裡面定不定義。但文章中說cin、cout這些識別符號不是建立在c++有魔力的操作符是可以理解的。
首先,cin、cout、cerr、clog都是類的例項。c++中定義了i/o流類。i/o流類中的基類ios派生出子類istream和ostream。 cin是istream類的物件,而cout、cerr、clog是ostream類的物件。我們知道,在c語言中,stdout預設對應標準輸出裝置,stdin預設對應標準輸入裝置,他們都被賦值為檔案控制代碼。這是很容易理解的。因為我們學過,在unix系統中,"一切皆檔案",因此stdout和stdin都是指向裝置檔案控制代碼。cin,cout這些也是一樣。cin預設對應鍵盤,cout預設對應螢幕,cerr對應螢幕,clog對應印表機。但是,cin和cout是可以重定向的,cerr和clog是不能夠重定向的。下面的程式很好的解釋了cout對應檔案控制代碼和可以重定向的概念(其中ofstream是ostream的子類)。
顯然,重定向做了這樣一件事,即給cout重新賦值。在dos下使用重定向操作符可以完成此項功能。那麼cout和cin可以重定向,cerr和clog卻不能重定向又該如何理解呢?私以為,這是通過在類庫中將cout和cin定義成變數,將cerr和clog定義成常量來實現的。網上另有一種解釋,是說cout寫到緩衝區,而cerr直接寫到裝置,因為cout有寫入緩衝區的的過程,因此流可以被其他裝置或檔案擷取。但我們知道clog也是不能夠重定向的,它卻恰恰是寫入緩衝區的,因此,這種解釋似乎不太合理。
再來說說">>","<<"輸入輸出操作符。">>"的作用是指定資料從哪個流輸入,"<<"的作用是指定資料輸出到哪個流。既然它們是操作符,那麼就和+、—、*、/這些操作符差不多。這就很容易解釋為什麼輸入輸出操作符不能被過載為成員函式了。我們可以簡單的認為"<<"是乙個雙目操作符,這個雙目操作符的第乙個運算元是流物件cout,而不是使用者定義的類物件。只有當第乙個運算元是類物件時,才能過載為該類的成員函式。
國外程式設計師整理的機器學習資源大全
awesome machine learning 翻譯 toolate 本文彙編了一些機器學習領域的框架 庫以及軟體 按程式語言排序 計算機視覺 通用機器學習通用機器學習自然語言處理 通用機器學習 資料分析 資料視覺化自然語言處理 通用機器學習 資料分析 資料視覺化自然語言處理 資料分析 資料視覺化...
國外程式設計師整理的機器學習資源大全
awesome machine learning 翻譯 toolate 本文彙編了一些機器學習領域的框架 庫以及軟體 按程式語言排序 計算機視覺 通用機器學習通用機器學習 自然語言處理 通用機器學習 資料分析 資料視覺化 自然語言處理 通用機器學習 資料分析 資料視覺化 自然語言處理 資料分析 資料...
學習心得 當程式設計師思路被打斷
周思博 joel spolsky 曾在他的一篇部落格中說過 有時我什麼事都幹不了。當然,我走進辦公室,到處閒逛,十秒鐘就檢查一次電郵,看網頁,甚至幹些不用腦子的事,比如支付美國運通的賬單。但就是不會回到寫 的流程上來。這樣的低效症一發作一般都要持續一兩天。但在我的職業生涯裡,作為程式設計師,曾經好幾...