我们在学校有一个作业,实现了一个重载所有算术运算符的Matrix类。我所做的是(例如)将+=定义为成员函数,然后将+定义为使用+=函数的非成员函数(两者都在同一文件中,但+在类之外)。学校的工作人员做了类似的事情,只是他们声明了'+‘作为朋友函数(还使用了+=的实现)。
由于这两种实现都工作得很好,所以我想知道朋友函数能给我什么,而非成员函数不能?什么时候我应该选择两者而不是其他?
谢谢!Yotam
发布于 2011-09-22 20:51:52
最好不要声明函数friends,如果它们可以通过类的公共接口实现(比如成员operator+=中的operator+。
不知何故,对于运算符,有时人们倾向于认为,当作为自由函数实现时,它们需要自动声明为好友。例如,您可能听说operator<<不能作为成员函数实现(因为左操作数是ostream),因此它需要是一个自由友元函数。实际上,只有当它需要访问私有/受保护的成员和成员函数时,它才需要成为朋友。
(我怀疑这可能是因为重载运算符,由于其特殊的调用语法,感觉不像普通函数,似乎与它的操作数有某种神奇的联系,需要在类定义中表达)。
发布于 2011-09-22 20:27:09
好友版本可以访问您的类的成员。一个普通的非成员不需要。这可能会很有用。
发布于 2011-09-22 20:30:18
通过阅读朋友函数的定义,您将获得问题的答案。
友好函数在面向对象编程中使用,允许从外部访问类中的私有或受保护的数据。通常,不是类成员的函数不能访问此类信息;外部类也不能。有时,这样的访问对程序员是有利的。在这些情况下,可以使用friend关键字将函数或外部类声明为类的朋友。然后,函数或外部类将可以访问类中的所有信息-公共的、私有的或受保护的。
https://stackoverflow.com/questions/7514655
复制相似问题