【问题标题】:Making a member function a friend使成员函数成为朋友
【发布时间】:2011-05-20 18:48:50
【问题描述】:

当你让一个类的成员函数成为它自己的朋友时会发生什么!?

下面的代码编译并运行。如果没有朋友声明,就会生成“操作员的参数太多”(这是正确的)。我意识到这样做没有任何意义,但谁能告诉我这里发生了什么?朋友会以某种方式强制编译器省略默认的这个参数吗?

class Test
{
public:
  friend bool operator<(Test& lhs, Test& rhs)
  {
     return true;
  }
};

int main( int c, char** argv)
{
  Test test1;
  Test test2;

  return test1 < test2;
}

【问题讨论】:

  • 回答您的问题:Friends 不能成为 C++03 中交友类的成员,但在 C++0x 中是允许的。
  • 我很好奇,既然成员函数已经拥有完全访问权限,那么允许成员函数成为它自己的朋友有什么意义?
  • 查看 open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#77 或历史(尽管这种特殊情况并不重要,因为嵌套类可以完全访问 c++0x 和大多数 c++03 编译器中的嵌套类) )。

标签: c++ operator-overloading friend


【解决方案1】:

当你让一个类的成员函数成为它自己的朋友时会发生什么!?

这没有任何意义。一个类的成员函数怎么可能是同一个类的朋友

您已将operator &lt; 重载为友元函数(而不是成员函数)。在类中提供友元函数的定义(主体)是合法的。但是在其定义中使用this 是非法的

friend bool operator<(Test& lhs, Test& rhs)
{
     *this ; //error
     return true;
}

【讨论】:

    【解决方案2】:

    不同之处在于,即使整个定义出现在类中,朋友也不是成员;相反,该函数被放置在周围的命名空间中。所以,没有this 指针。虽然成员 operator&lt; 隐式操作 this 和显式右侧参数,但 friend 需要作为函数参数显式提供左侧和右侧参数 - 因此需要额外参数。您的friend 版本相当于将函数放在类之后,除了它可以访问privateprotected 成员和基并且隐式为inline(尽管这并不意味着编译器必须内联它 - 这只是一个提示,但对于单一定义规则很重要,因为您的 friend 函数可以包含在许多翻译单元中,并且链接没有问题)。

    【讨论】: