C++ endl 詳解


我們在最初學習C++語言時就接觸到"cout<<endl;"這樣的語句。我們都知道endl表示換行的意思。我一直習慣這樣使用,卻並不是清楚其內部實現是怎么樣的。今天看《C++ Standard Library, Sec. 13.6.1》,才真正弄明白。

 

首先,endl是一個操作符(Manipulators),但我們必須知道endl是一個什么類型的變量。endl是跟在”<<“運算符后面,故endl應該是一個參數。其實endl是一個函數名,它是一個"<<"運算符重載函數中的參數,參數類型為函數指針。下面我們看下內部函數實現。

 

1 ostream& ostream::operator << ( ostream& (*op) (ostream&))
2 {
3     // call the function passed as parameter with this stream   as the argument
4      return (*op) (*this);
5 }

 

1 std::ostream& std::endl (std::ostream& strm)
2 {
3     // write newline
4     strm.put('\n');
5     // flush the output buffer
6     strm.flush();
7     // return strm to allow chaining
8     return strm;
9 }

 


可以看出,運算符重載函數中的函數參數為一個函數指針,其指向一個輸入輸出均為ostream類引用的函數。而endl正是這樣一個函數。所以我們在運行"cout<<endl;"語句時,endl是一個函數參數,類型為函數指針。然后會執行”return (*endl) (*this);“語句,即執行endl函數。endl函數輸出一個換行符,並刷新輸出緩沖區。

 

這樣我們知道在標准庫中endl是作為一個函數實現的,顯然我們也可以直接調用這一函數。我們看下面的測試程序:

1 #include<iostream>
2 using namespace std;
3 
4 int main()
5 {
6     cout<<endl;
7     endl(cout);
8     return 0;
9 }

 


其輸出為兩個空行。”cout<<endl"中,endl是一個類型為函數指針的函數參數,通過運算符重載函數間接調用了endl函數。而“endl(cout)”中,endl是函數名,直接調用了endl函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM