让会员成为朋友

时间:2010-12-06 04:49:58

标签: 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;
}

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:1)

  

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

这没有任何意义。一个类的成员函数如何成为同一个类的朋友

您已将operator <重载为朋友功能(而不是成员功能)。在类中提供友元函数的定义(正文)是合法的。但是,在其定义中使用this是非法的

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