首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >什么时候我必须使用朋友函数而不是成员函数?

什么时候我必须使用朋友函数而不是成员函数?
EN

Stack Overflow用户
提问于 2013-05-26 11:42:07
回答 4查看 1.9K关注 0票数 2

当一个朋友函数肯定比一个成员函数好的时候,任何人能给我一个条件吗?或者仅仅是一些原因,为什么我们可能使用朋友函数而不是成员函数。非常感谢。

EN

回答 4

Stack Overflow用户

发布于 2013-05-26 11:55:26

流操作。

友元函数非常适合操作符重载。

对于像插入器<<或提取器>>这样的运算符,流对象出现在左侧,因此它不能是成员。但是,可以说,这样的函数应该很少成为朋友,因为它应该构建在公共检查或初始化接口上。

二进制运算。

二元运算符,特别是可交换运算符提供了一种更有趣的情况。如果作为成员函数实现,则使用LHS根据成员查找分派重载。友元函数将使用参数相关的查找,LHS和RHS被同等对待。

如果允许转换,这一点很重要。如果我有一个从char const * C样式字符串隐式转换的string类,那么不会为表达式"x" + str找到string string::operator+(string),但是friend string operator+(string, string)会。顺便说一句,std::string符合这个示例,这就是它使用非成员运算符的原因。

比你的类跨越更多的接口。

另一种情况是,当你想要某个不能成为成员的东西时,因为它是在你不能控制的类或非类类型上定义的。也许当它应用于“随机的东西”时,它只是一个无操作,但仍然是有意义的。例如,我定义了这样一个函数flush,它发出输入结束的信号并通过解析器传播。它的含义在很多我没有实现的东西上都定义得很好。

票数 2
EN

Stack Overflow用户

发布于 2013-05-26 11:55:37

一种情况(可能是典型情况)是,当您试图重载<<操作符以打印类的成员时。因为第一个参数必须是ostream的对象,所以不能将其作为member function重载。您必须使用friend函数。

根据斯科特·迈尔斯的Effective C++ Item23:

与成员函数相比,

更喜欢非成员、非友元函数。这样做可以提高封装、打包灵活性和功能可扩展性。

票数 2
EN

Stack Overflow用户

发布于 2013-05-26 13:48:31

当重载使用来自同一类的参数的运算符时,则使用成员函数。此外,为了定义类的行为,您可以使用成员函数。友元函数用于重载使用不同类的参数的运算符,

例如,流运算符,在本例中为cout << 2,cout是ostream类的对象,2是int类的成员。

在这种情况下,您将使用友元函数,它们是非成员函数,允许您在使用运算符时也使用其他类的对象。流插入运算符和流提取运算符是示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16756034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档