4

今日、ヘッダーのソース コードを調べた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>=ここではメソッドではないように思えますが、staticキーワードもありません。

この特定のケースではfriend置き換えますか?static

4

1 に答える 1

2

はいといいえ。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);
}

クラスからプライベート メソッドと保護されたメソッドにアクセスできます。

クラス内でストリーム演算子をオーバーロードすることを考えてみてください。同じ手法を適用できます。

于 2012-05-06T09:35:10.703 に答える