当一个朋友函数肯定比一个成员函数好的时候,任何人能给我一个条件吗?或者仅仅是一些原因,为什么我们可能使用朋友函数而不是成员函数。非常感谢。
发布于 2013-05-26 03:55:26
流操作。
友元函数非常适合操作符重载。
对于像插入器<<
或提取器>>
这样的运算符,流对象出现在左侧,因此它不能是成员。但是,可以说,这样的函数应该很少成为朋友,因为它应该构建在公共检查或初始化接口上。
二进制运算。
二元运算符,特别是可交换运算符提供了一种更有趣的情况。如果作为成员函数实现,则使用LHS根据成员查找分派重载。友元函数将使用参数相关的查找,LHS和RHS被同等对待。
如果允许转换,这一点很重要。如果我有一个从char const *
C样式字符串隐式转换的string
类,那么不会为表达式"x" + str
找到string string::operator+(string)
,但是friend string operator+(string, string)
会。顺便说一句,std::string
符合这个示例,这就是它使用非成员运算符的原因。
比你的类跨越更多的接口。
另一种情况是,当你想要某个不能成为成员的东西时,因为它是在你不能控制的类或非类类型上定义的。也许当它应用于“随机的东西”时,它只是一个无操作,但仍然是有意义的。例如,我定义了这样一个函数flush
,它发出输入结束的信号并通过解析器传播。它的含义在很多我没有实现的东西上都定义得很好。
发布于 2013-05-26 03:55:37
一种情况(可能是典型情况)是,当您试图重载<<
操作符以打印类的成员时。因为第一个参数必须是ostream
的对象,所以不能将其作为member function
重载。您必须使用friend
函数。
根据斯科特·迈尔斯的Effective C++ Item23:
与成员函数相比,
更喜欢非成员、非友元函数。这样做可以提高封装、打包灵活性和功能可扩展性。
发布于 2013-05-26 05:48:31
当重载使用来自同一类的参数的运算符时,则使用成员函数。此外,为了定义类的行为,您可以使用成员函数。友元函数用于重载使用不同类的参数的运算符,
例如,流运算符,在本例中为cout << 2
,cout是ostream类的对象,2是int类的成员。
在这种情况下,您将使用友元函数,它们是非成员函数,允许您在使用运算符时也使用其他类的对象。流插入运算符和流提取运算符是示例。
https://stackoverflow.com/questions/16756034
复制相似问题