我们在学校有一个任务是实现一个重载所有算术运算符的 Matrix 类。我所做的是(例如)将 += 定义为成员函数,然后将 + 定义为使用 += 函数的非成员函数(都在同一个文件中,但 + 在类之外)。学校工作人员做了类似的事情,只是他们将“+”声明为友元函数(并且还使用了 += 的实现)。
由于这两种实现都可以完美运行,我试图了解朋友函数给我的非成员函数没有什么?我什么时候应该更喜欢彼此?
谢谢!尤塔姆
我们在学校有一个任务是实现一个重载所有算术运算符的 Matrix 类。我所做的是(例如)将 += 定义为成员函数,然后将 + 定义为使用 += 函数的非成员函数(都在同一个文件中,但 + 在类之外)。学校工作人员做了类似的事情,只是他们将“+”声明为友元函数(并且还使用了 += 的实现)。
由于这两种实现都可以完美运行,我试图了解朋友函数给我的非成员函数没有什么?我什么时候应该更喜欢彼此?
谢谢!尤塔姆
如果函数可以根据类的公共接口(例如operator+
member operator+=
.
不知何故,有时人们倾向于假设当作为自由函数实现时,它们需要自动声明为友元。例如,您可能听说operator<<
不能将其实现为成员函数(因为左侧操作数是 ostream),因此它需要是免费的友元函数。实际上,如果它需要访问私有/受保护的成员和成员函数,它只需要成为朋友。
(我怀疑这可能是因为重载的运算符,由于它们特殊的调用语法,感觉不像是正常的函数,并且似乎与其操作数有某种神奇的联系,需要在类定义中表达。)
朋友版本可以访问您班级的成员。普通的非成员不会。这可能很有用。
通过阅读 Friend Function 的定义,您将得到问题的答案。
友元函数用于面向对象的编程中,以允许从外部访问类中的私有或受保护数据。通常,不是类成员的函数无法访问此类信息;外部类也不能。有时,这种访问对程序员来说是有利的。在这些情况下,可以使用friend关键字将函数或外部类声明为类的朋友。然后,函数或外部类将有权访问类内的所有信息——公共的、私有的或受保护的。