1

我们在学校有一个任务是实现一个重载所有算术运算符的 Matrix 类。我所做的是(例如)将 += 定义为成员函数,然后将 + 定义为使用 += 函数的非成员函数(都在同一个文件中,但 + 在类之外)。学校工作人员做了类似的事情,只是他们将“+”声明为友元函数(并且还使用了 += 的实现)。

由于这两种实现都可以完美运行,我试图了解朋友函数给我的非成员函数没有什么?我什么时候应该更喜欢彼此?

谢谢!尤塔姆

4

3 回答 3

4

如果函数可以根据类的公共接口(例如operator+member operator+=.

不知何故,有时人们倾向于假设当作为自由函数实现时,它们需要自动声明为友元。例如,您可能听说operator<<不能将其实现为成员函数(因为左侧操作数是 ostream),因此它需要是免费的元函数。实际上,如果它需要访问私有/受保护的成员和成员函数,它只需要成为朋友。

(我怀疑这可能是因为重载的运算符,由于它们特殊的调用语法,感觉不像是正常的函数,并且似乎与其操作数有某种神奇的联系,需要在类定义中表达。)

于 2011-09-22T12:51:52.267 回答
1

朋友版本可以访问您班级的成员。普通的非成员不会。这可能很有用。

于 2011-09-22T12:27:09.000 回答
1

通过阅读 Friend Function 的定义,您将得到问题的答案。

友元函数用于面向对象的编程中,以允许从外部访问类中的私有或受保护数据。通常,不是类成员的函数无法访问此类信息;外部类也不能。有时,这种访问对程序员来说是有利的。在这些情况下,可以使用friend关键字将函数或外部类声明为类的朋友。然后,函数或外部类将有权访问类内的所有信息——公共的、私有的或受保护的。

于 2011-09-22T12:30:17.773 回答