簡體   English   中英

朋友函數在結構中有什么用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM