C++ 好友类定义

C++ 好友类定义,c++,methods,static,friend,C++,Methods,Static,Friend,今天我查看了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 !(a

今天我查看了
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);
  }
};
类地址
{
//我删除了一些不相关的行。。。
公众:
///比较订购地址。
友元布尔运算符>=(常量地址和a1、常量地址和a2)
{
返回!(a1
现在我知道了friend的作用,但我从来没有见过它后面有一个定义,在类定义中

所以我的问题是,这个
friend
声明做什么?在我看来,
操作符>=
在这里不是一个方法,但是这里也没有
静态
关键字


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

是和否。它不替换
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);
}
类地址
{
//我删除了一些不相关的行。。。
公众:
///比较订购地址。
友元布尔运算符>=(常量地址和a1、常量地址和a2);
};
内联布尔运算符>=(常量地址和a1、常量地址和a2)
{
返回!(a1
您可以从类访问私有和受保护的方法


考虑在类中重载stream操作符,同样的技术也可以应用。

谢谢您的回答。但是函数的
名称空间如何呢?它是否具有与其声明到的包含类相同的
命名空间
?@ereOn从未想到过这一点。因为您需要一个类来使用运算符,所以它会自动转到所需的命名空间,但我无法判断运算符本身是否在命名空间中。出于所有实际目的,它的行为就像是在类周围的命名空间中声明的一样。(让我们忘记角落案例,比如从未使用过的模板朋友…。@ereOn@Bo说过的话,除了ADL之外,操作员是不可见的。所以您需要一些与“地址”相关联的东西来调用它。例如,
int main(){string x;x>=10;}
将不会调用
操作符>=
,即使您的
地址
类可以从
int
字符串
转换。原因是
string
10
都没有
address
作为它们的关联类。但是如果你做了
地址x;x>=10
之所以有效,是因为
address
参数使
运算符>=
可见(->ADL),然后两个参数都被传递/转换为
地址常量&
.hm。。那么类方法
bool操作符>=(const address&)
呢?是否有必要使用
friend操作符>=(const address&one,const address&two)
代替
bool操作符>=(const address&one)