运算符中的朋友 == 或 << 我应该什么时候使用它?

新手上路,请多包涵

我觉得我对 friend 关键字的理解有点坑。

我有一堂课, presentation 。我在我的代码中将它用于两个变量, present1present2 ,我将其与 == 进行比较:

 if(present1==present2)

以下是我如何定义运算符 == (在 class presentation 中):

 bool operator==(const presentation& p) const;

但是,有人告诉我使用 friend 并在课堂之外定义它会更好:

 friend bool operator==(presentation&, presentation&);

为什么?两者有什么区别?

原文由 Nadav 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 647
2 个回答

在第一种情况下,您的函数 operator== 是非静态类成员。因此,它可以访问私有和受保护的成员变量。

在第二种情况下,操作符是外部声明的,因此它应该被定义为类的友元来访问那些成员变量。

原文由 Benoit 发布,翻译遵循 CC BY-SA 2.5 许可协议

您的解决方案有效,但不如 friend 方法强大。

当一个类将一个函数或另一个类声明为 friend 这意味着友元函数或类可以访问声明类的私有和受保护成员。就好像声明的实体是声明类的成员。

如果您将 operator==() 定义为成员函数,那么就像 friend 情况一样,成员函数可以完全访问类的成员。但是因为它是一个成员函数,所以它指定了一个参数,因为第一个参数暗示为 this :类型为 presentation 的对象(或其后代)。但是,如果您将函数定义为非成员,那么您可以指定两个参数,这将使您可以灵活地比较任何两种可以转换为 presentation 的类型使用相同的函数。

例如:

 class presentation {
    friend bool operator==(const presentation&, const presentation&);
    // ...
};

class Foo : public presentation { /* ... */ };
class Bar : public presentation { /* ... */ };

bool operator==(const presentation& p1, const presentation& p2)
{
    // ...
}

bool func(const Foo& f, const Bar& b, const presentation& p)
{
    return f == b || f == p );
}

最后,这提出了一个问题“为什么要声明 friend ?”。如果 operator==() 函数不需要访问 presentation 的私有成员,那么确实最好的解决方案是使其成为非成员、非好友函数。换句话说,不要给不需要的函数访问权限。

原文由 wilhelmtell 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题