線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1162
推到 Plurk!
推到 Facebook!

有關於std::endl的疑問!

缺席
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-09-08 22:20:48 IP:114.33.xxx.xxx 訂閱
請問:
endl是函式為什麼這麼用"cout << endl;"也可以呢?
照常理應該要這麼用endl (cout);才對!

所以想請問這是為什麼能詳細解釋嗎?


[code cpp]
//ostream& endl ( ostream& os );
#include
using namespace std;

int main () {

int a=100;
double b=3.14;

cout << a;
cout << endl;
cout << b << endl << a*b;
endl (cout);

return 0;
}

[/code]

謝謝!!
------
-謝謝大大熱心的回覆!謝謝!
編輯記錄
l90425 重新編輯於 2010-09-08 22:21:46, 註解 無‧
l90425 重新編輯於 2010-09-08 22:22:06, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-09-08 22:44:56 IP:220.135.xxx.xxx 訂閱
請找一本c++的書再仔細的讀一次。

它是關於 operator 的複載(overload) 。 c 中許多的符號也算是函式,包含常見的 號 - 號 << 等符號。因為它也是一種函式,所以就可以被複載。

一時半刻無法說清,只能請你去查網路或是把書再看仔細一點。這裡只能提供你線索!

good luck


===================引 用 l90425 文 章===================
請問:
endl是函式為什麼這麼用"cout << endl;"也可以呢?
照常理應該要這麼用endl (cout);才對!

所以想請問這是為什麼能詳細解釋嗎?


[code cpp]
//ostream& endl ( ostream& os );
#include
using namespace std;

int main () {

int a=100;
double b=3.14;

cout << a;
cout << endl;
cout << b << endl << a*b;
endl (cout);

return 0;
}

[/code]

謝謝!!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-09-08 23:01:53 IP:114.33.xxx.xxx 訂閱
>>它是關於 operator 的複載(overload)  。 c++ 中許多的符號也算是函式,包含常見的 + 號 - 號 << 等符號。因為它也是一種函式,所以就可以被複載。
我的疑問是endl正常應該要給引數才對像endl (cout),
但是
cout << endl的endl卻沒有給引數!,應該要cout << endl(cout)才對為什麼可以寫成cout << endl呢?

謝謝!!

------
-謝謝大大熱心的回覆!謝謝!
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-09-11 11:37:13 IP:114.33.xxx.xxx 訂閱
它能夠這麼做是因為 C 語言所提供的超載功能 (overloading). 特別是在 std::ostream class 裡的 operator<< 超載, 其中一個是:

ostream& ostream::operator<<(ostream& (*fp)(ostream&))
{
return (*fp)(*this);
}

它的參數是函式指標.


endl 是個函式沒錯, 它的 signature 正好符合上面超載的函式指標參數:

std::ostream& std::endl(std::ostream& os)
{
...
}

當你在式子裡用函式名字的時候, 所得到的正好是個函式指標. 上面的 operator<<() 超載把函式指標變成函式呼叫.


引用於:http://www.programmer-club.com.tw/pc2020v5/forum/ShowSameTitleN.asp?board_pc2020=c&id=41214&type_pc2020=sametitleLevel-2
謝謝!!
------
-謝謝大大熱心的回覆!謝謝!
系統時間:2024-05-02 5:51:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!