我們在最初學習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函數。