2010-12-06 86 views
7

当您将班级的成员功能变成朋友时,会发生什么?!将会员功能设为朋友

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

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; 
} 
+1

要回答你的问题:朋友不能成为C++ 03中的友谊类的成员,但这是允许在C++ 0x。 – 2010-12-06 05:07:44

回答

9

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

1

当你犯了一个类的成员函数本身的一个朋友发生了什么!

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

您已经将operator <作为好友函数(而不是成员函数)重载。在课堂内提供朋友功能的定义(正文)是合法的。然而,它是非法使用this其定义中

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