4

这里我不太了解这个概念,或者我是对的......所以让我们在这里举这个“朋友”类的例子:

class MyClass{
friend class AnotherClass;
private:
       int secret;
}

class AnotherClass{
public:
      void getSecret(MyClass mc){
          return mc.secret;
      }
}

所以是的......在上面的代码中,如果你这样做,它实际上会起作用......但总的来说,为什么你不能一直使用getter和setter而不是朋友类?使用朋友班的原因是因为“乏味”吗?

4

4 回答 4

12

friend适用于当您不想将 getter/setter/internals 暴露给所有人,而只是暴露给单个类时。所以它是一个封装的工具。

例如,如果您提供了一个 public getSecretin MyClass,每个人都可以访问该私有变量,即使他们不应该知道它。这打破了封装。friend是否可以解决此问题,以便只有那些需要了解的类才能secret访问它。

正如@nicomp 所说,“这就像给你的亲朋好友一把你家的钥匙,但你不知道他们会用它做什么”。所以一个friend类可以无限制地访问它的朋友类的所有内部。这很不幸,但这里的关键(不是双关语)是让类尽可能小,这样就不会成为问题,这也是根据单一职责原则。

于 2016-04-22T10:29:11.070 回答
3

公共gettersetter允许任何人访问。它们有一些用途,特别是在某些属性发生更改时维护类不变量,但是看起来像以下代码的 getter / setter 对在限制访问方面并不比公共成员变量更好:

class A {
 public:
  int getX() const { return x; };
  void setX(int x_) { x = x_; };
 private:
  int x;
};

getX()andsetX()函数除了提供对x. 每个人都可以使用它们,因此任何人都可以更改x. 那么,将其设为私有是没有意义的。

相反,如果只需要更改某些x类或函数,则可以使它们成为 class 的朋友A。这限制了只有那些朋友的访问权限,而不是给所有人。

因此,friend它是一种封装工具,允许封装比“仅我自己的类”(私有成员)或“仅我的类和派生自它的类”(受保护的成员)更广泛。朋友不必在同一个类层次结构中(它根本不需要是一个类;函数可以是朋友),但它仍然允许您将访问权限限制为仅对实际需要它的那些事物的访问。

请注意,与 getter 和 setter 一样,它应该谨慎使用。封装是一件好事,在可能的情况下,你的类的私有成员应该保持不变——私有。friend是一个允许您有选择地授予访问权限的工具,但您应该始终仔细考虑是否需要授予该访问权限,或者需要它的函数/类作为您的类的成员是否会更好。

于 2016-04-22T10:33:00.103 回答
0

不要忘记测试...

朋友类/方法可以非常成功地用于测试类功能中的中间状态。

这些对于某些类型的复制构造函数也很有用,其中要复制的类不是目标类的直接祖先。

于 2020-03-10T20:28:22.553 回答
0

考虑一下我最近遇到的以下用例:我将一些代码从一个类重构到另一个类。这个新类必须访问原始类的成员,但我不想通过公共 getter 提供它,以避免其他客户弄乱这些。在这种情况下,我真的很欢迎 C++ 友谊机制。

但是,这些用例很少(希望如此,否则您的 SW 架构中可能有问题),我尽量避免它,因为它是最紧密的耦合形式

于 2016-04-22T10:32:18.057 回答