回覆列表
  • 1 # 農村大土妞

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

  • 中秋節和大豐收的關聯?
  • 二胡G調必須是52弦嗎?