假設它們沒有被實現爲friend
函數。流插入/提取運算符重載函數的原型屬於哪裏?
class Foo
{
// in here?
ostream& operator<<(ostream&, const Foo &);
};
或
class Foo
{
};
// out here?
ostream& operator<<(ostream&, const Foo &);
爲什麼呢?
假設它們沒有被實現爲friend
函數。流插入/提取運算符重載函數的原型屬於哪裏?
class Foo
{
// in here?
ostream& operator<<(ostream&, const Foo &);
};
或
class Foo
{
};
// out here?
ostream& operator<<(ostream&, const Foo &);
爲什麼呢?
從大師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 &)
{
}
這樣你就不能直接訪問類的私有部分,你需要提供一些成員函數來返回您班級的內部進行打印。
這取決於你的應用程序,第二種方式通常是這樣做的方式。
將它們聲明爲非會員朋友函數或Foo的周圍名稱步伐。你的第一個例子是缺少關鍵因素:朋友。
原因是C++尋找函數(以及也是運算符)調用:參數相關查找的方式。
第一個不會編譯,所以第二個默認是贏的。 – 2013-04-28 01:34:17
爲什麼不第一個編譯? – JamesGold 2013-04-28 01:37:17
當聲明爲成員函數時,所有二元運算符重載必須只有一個參數(隱式'this'參數用作左手參數)。 – 2013-04-28 01:39:59