我们在学校有一项任务,实现了一个重载所有算术运算符的Matrix类。我所做的是(例如)将+ =定义为成员函数,然后将+定义为使用+ = function的非成员函数(两者都在同一个文件中,但在类外部+)。 学校的工作人员做了类似的事情,只是他们宣称'+'是朋友的功能(并且还使用了+ =的实现)。
由于两个实现都完美地工作,我试图理解朋友函数给了我一个非成员函数不是什么? 我什么时候应该优先于另一个呢?
谢谢! Yotam
答案 0 :(得分:4)
如果可以根据班级的公共界面(例如operator+
成员operator+=
实施),最好不要声明函数friends。
对于运营商而言,有时人们倾向于认为当实现为免费功能时,他们需要自动声明为朋友。例如,您可能听说operator<<
无法作为成员函数实现(因为左侧操作数是一个ostream),因此它需要是一个免费的朋友函数。实际上,如果需要访问私人/受保护的成员和成员函数,它只需要成为朋友。
(我怀疑这可能是因为重载的运算符,由于它们的特殊调用语法,不像普通函数那样,并且似乎与它的操作数有某种神奇的联系,需要在类定义中表达。)
答案 1 :(得分:1)
朋友版可以访问您班级的成员。一个普通的非会员不会。这可能很有用。
答案 2 :(得分:1)
通过阅读朋友功能的定义,您将得到问题的答案。
友好函数用于面向对象的编程,允许从外部访问类中的私有或受保护数据。通常,不是类成员的函数不能访问这些信息;外部阶级也不能。有时,这种访问对程序员来说是有利的。在这些情况下,可以使用friend关键字将函数或外部类声明为类的朋友。然后,函数或外部类可以访问类中的所有信息 - 公共,私有或受保护。