2013-04-28 31 views
0

假設它們沒有被實現爲friend函數。流插入/提取運算符重載函數的原型屬於哪裏?

class Foo 
{ 
// in here? 
ostream& operator<<(ostream&, const Foo &); 
}; 

class Foo 
{ 
}; 
// out here? 
ostream& operator<<(ostream&, const Foo &); 

爲什麼呢?

+0

第一個不會編譯,所以第二個默認是贏的。 – 2013-04-28 01:34:17

+0

爲什麼不第一個編譯? – JamesGold 2013-04-28 01:37:17

+0

當聲明爲成員函數時,所有二元運算符重載必須只有一個參數(隱式'this'參數用作左手參數)。 – 2013-04-28 01:39:59

回答

0

從大師Stanley Lippman的底漆++書引用:

當我們定義了符合iostream庫的慣例輸入或輸出操作,就必須把它作爲一個非成員函數。

一種選擇是聲明過載<<>>作爲類的friend功能。 聲明它爲friend函數的好處是它可以訪問你的類的私有部分。

class Foo 
{ 
    // in here? 
    friend ostream& operator<<(ostream&, const Foo &); 
    //^^should not miss this 
}; 

另一種選擇是重載爲free功能,實現operator<<Foo類的正規途徑是這樣的:

std::ostream& operator<<(std::ostream& os, const Foo &) 
{ 
} 

這樣你就不能直接訪問類的私有部分,你需要提供一些成員函數來返回您班級的內部進行打印。

這取決於你的應用程序,第二種方式通常是這樣做的方式。

1

將它們聲明爲非會員朋友函數或Foo的周圍名稱步伐。你的第一個例子是缺少關鍵因素:朋友。

原因是C++尋找函數(以及也是運算符)調用:參數相關查找的方式。