让会员成为朋友

rad*_*man 7 c++ operator-overloading friend

当你把一个班级的成员函数变成自己的朋友时会发生什么?

下面的代码编译并运行.如果没有friend声明,就会生成"运算符的参数太多"(这是正确的).我意识到这样做没有任何意义,但任何人都可以告诉我这里发生了什么?朋友是否强制编译器以某种方式省略默认的this参数?

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;
}
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 9

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