【问题标题】:Friend class definition朋友类定义
【发布时间】:2012-05-15 05:14:33
【问题描述】:

今天查看boost::asio::ip::address的头部源码,发现有以下几行:

class address
{
  // I removed some irrelevant lines here...

  public:

  /// Compare addresses for ordering.
  friend bool operator>=(const address& a1, const address& a2)
  {
    return !(a1 < a2);
  }
};

现在我知道friend 的用途,但我从未见过它后面有一个定义,在类定义中

所以我的问题是,这个friend 声明有什么作用?在我看来operator&gt;= 不是这里的方法,但是也没有static 关键字。

在这种特殊情况下friend 是否替换 static

【问题讨论】:

    标签: c++ methods static friend


    【解决方案1】:

    是和不是。它不会取代static,因为您在呼叫接线员时不需要限定名称。它有点像你不需要类实例来调用它。

    就像在类外声明操作符:

    class address
    {
      // I removed some irrelevant lines here...
    
      public:
    
      /// Compare addresses for ordering.
      friend bool operator>=(const address& a1, const address& a2);
    };
    
    inline bool operator>=(const address& a1, const address& a2)
    {
       return !(a1 < a2);
    }
    

    您可以从类中访问私有和受保护的方法。

    考虑在类中重载流运算符,可以应用相同的技术。

    【讨论】:

    • 感谢您的回答。但是函数的namespace 呢?它是否具有相同的namespace 包含它被声明到的类?
    • @ereOn 从未想过这一点。由于你需要一个类来使用操作符,它会自动进入到需要的命名空间,但是我无法判断操作符本身是否在命名空间中。
    • 出于所有实际目的,它的行为就像它已在类周围的命名空间中声明一样。 (让我们忘记极端情况,比如从未使用过的模板朋友......)。
    • @ereOn @Bo 所说的,除了操作符不可见,除非通过 ADL。所以你需要一些与“地址”相关的东西来调用它。例如int main() { string x; x &gt;= 10; } 不会调用operator&gt;=,即使您的address 类可以从intstring 转换。原因是string10 都没有address 作为它们的关联类。但是如果你这样做 address x; x &gt;= 10; 它会起作用,因为 address 参数使 operator&gt;= 可见(-> ADL),然后两个参数都被传递/转换为 address const&amp;
    • hm.. 那么类方法bool operator&gt;=(const address&amp;) 呢?是否有必要使用friend operator&gt;= (const address&amp; one, const address&amp; two) 而不是bool operator&gt;=(const address&amp; one)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多