【问题标题】:What's the use of a friend function in a struct?结构中的友元函数有什么用?
【发布时间】:2019-06-09 09:23:24
【问题描述】:

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

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) "但是,因为在一个结构中所有成员都是公共的" 可以在struct 中拥有private 成员。 2) 是的,在 this 的情况下,不需要将函数作为friend
  • @AlgirdasPreidžius 请在答案部分回答,不要在这里
  • CppCon 2018:Dan Saks “结交新朋友”youtube.com/watch?v=POa_V15je8Y
  • @LightnessRacesinOrbit 我的评论,按原样,不是一个体面的答案。体面的答案需要更好的格式,而不是那么简短。目前,我只是懒惰,以这些方式改进它。
  • @AlgirdasPreidžius 您不必发布答案,因此如果您认为自己不能写完整的答案,您可以不发布任何内容!但是把它放在这里并不是解决这个问题的方法。谢谢

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


【解决方案1】:

确实,该运算符可以在没有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&lt;&lt; 的定义在您阅读时看起来就像是“在”类中。或者,可能有一些神秘的查找约束使这很方便(因为以这种方式定义的 friend 函数只能由 ADL 找到),尽管我想不出任何办法。

【讨论】:

  • 这是否意味着 c++ 中结构和类之间的唯一区别是,默认情况下,类中的所有成员都是私有的,而在结构中它们是公共的?
  • @ShubhamUrkade 是的
  • @ShubhamUrkade 实际上,C++ 中不存在“结构”之类的东西。关键字struct 给你一个类。但足够接近。
  • 内联好友函数只能通过 Koenig 查找找到。一个可能有实际的理由这样做。防止在其他地方发生名称冲突,也许?我真的想不出一个例子。关键是,我不确定说这总是与风格有关。
  • @ShubhamUrkade 非内联函数(使用的)必须在一个翻译单元中定义(根据一个定义规则)。头文件通常包含在多个翻译单元中,因此通常不能在头文件中定义非内联函数。当函数在类定义中定义时(如您所做的那样),它是隐式内联的。当在命名空间范围内定义函数时(如在此答案中),该函数是隐式非内联的。因此这里需要显式的内联声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多