当你把一个班级的成员函数作为自己的朋友时会发生什么??
下面的代码编译并运行。如果没有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;
}
答案 0 :(得分:9)
不同之处在于,即使整个定义出现在课堂内,朋友也不是会员;相反,该函数放在周围的命名空间中。所以,没有this
指针。当成员operator<
隐式地在this
和明确的右侧参数上运行时,friend
需要将左侧和右侧参数明确地作为函数参数提供 - 因此额外参数。您的friend
版本等同于在课程之后放置该函数,但它可以访问private
和protected
成员和基数,并且隐式inline
(尽管如此)这意味着编译器必须内联它 - 它只是一个提示,但对于一个定义规则来说很重要,因为你的friend
函数可以包含在许多翻译单元中并且链接没有问题。)
答案 1 :(得分:1)
当你把一个班级的成员函数作为自己的朋友时会发生什么??
这没有任何意义。一个类的成员函数如何成为同一个类的朋友?
您已将operator <
重载为朋友功能(而不是成员功能)。在类中提供友元函数的定义(正文)是合法的。但是,在其定义中使用this
是非法的
friend bool operator<(Test& lhs, Test& rhs)
{
*this ; //error
return true;
}