朋友函数在结构中有什么用?

时间:2019-01-15 11:04:16

标签: c++ c++11 struct friend

我正在使用以下语法在结构内重载插入运算符(<<):

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;
    }
};

我看到只有将函数声明为struct'Address'的朋友,我的代码才会编译。根据我的理解,当需要访问类的私有成员时,朋友功能非常有用。但是,由于在结构中所有成员都是公开的,因此不必将'<<'运算符声明为朋友。

任何人都可以澄清是否需要在这里将“ <<”运算符声明为结构“地址”的朋友吗?

1 个答案:

答案 0 :(得分:7)

实际上,可以在没有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找到),尽管我想不出什么。