[英]What's the difference between “friend struct A;” and “friend A;” syntax?
[英]What's the use of a friend function in a struct?
我正在使用以下語法在結構內重載插入運算符(<<):
struct Address{
string street;
string cross;
int suite;
friend ostream &operator <<(ostream &oss, const Address &other){
oss<<"street: "<<other.street<<"cross: "<<other.cross<<"suite: "<<other.suite;
return oss;
}
};
我看到只有將函數聲明為“地址”結構的朋友,我的代碼才會編譯。 根據我的理解,當需要訪問類的私有成員時,朋友功能非常有用。 但是,由於在結構中所有成員都是公開的,因此無需將'<<'運算符聲明為朋友。
有人可以說明是否需要在這里將“ <<”運算符聲明為結構“地址”的朋友嗎?
實際上,可以在沒有friend
情況下在命名空間范圍內定義該運算符。
在這種情況下,由於給出的確切原因,您不需要“使其成為friend
”,因此不清楚您在哪里聽說過!
struct Address
{
string street;
string cross;
int suite;
};
inline ostream& operator<<(ostream& oss, const Address& other)
{
oss << "street: " << other.street << "cross: " << other.cross << "suite: " << other.suite;
return oss;
}
(我假設您將整個定義保留在標頭中進行了inline
,盡管實際上我可能會在標頭中聲明它,然后在其他地方定義它。)
但是,用struct
定義的類仍然只是一個類,並且仍然可以包含private
成員。 如果您有這樣做的話,您將再次需要一個friend
。
某些人可能會選擇始終使之成為friend
函數以保持一致性,因此,當您閱讀operator<<
它的定義看起來像是在類中。 另外,可能有些奧秘的查找約束使此操作變得很方便(因為以這種方式定義的friend
功能只能由ADL找到),盡管我想不起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.