这里我不太了解这个概念或者我是对的....所以我们在这里拿这个“朋友”类的例子:
class MyClass{
friend class AnotherClass;
private:
int secret;
}
class AnotherClass{
public:
void getSecret(MyClass mc){
return mc.secret;
}
}
所以是的......在上面的代码中,如果你这样做,它实际上会起作用......但总的来说,为什么你不能一直使用getter和setter而不是朋友类?因“乏味”而导致朋友类使用的原因是什么?
答案 0 :(得分:7)
friend
适用于您不希望向所有人公开getter / setter / internals,而只是针对单个类。所以它是封装工具。
例如,如果您在getSecret
中提供了公开MyClass
,则每个人都可以访问该私有变量,即使他们不应该知道它。这破坏了封装。 friend
可以解决此问题,因此只有那些需要了解secret
的类才能访问它。
正如@nicomp所说,“这就像给你的实体朋友一把钥匙送给你的房子,但你不知道他们会用它做什么”。因此,friend
类可以无限制地访问其所有类的所有内部。这很不幸,但这里的关键(没有双关语)是为了让课程尽可能小,这样就不会成为一个问题,这也是根据单一责任原则。
答案 1 :(得分:2)
公共 getter 或 setter 允许任何人访问。它们有一些用途,特别是在更改某些属性时维护类不变量,但看起来像以下代码的getter / setter对并不比公共成员变量更好:
class A {
public:
int getX() const { return x; };
void setX(int x_) { x = x_; };
private:
int x;
};
getX()
和setX()
函数除了提供对x
的访问权限外什么都不做。每个人都可以使用它们,所以任何人都可以改变x
的值。那么,没有必要把它变成私有的。
如果只有某些类或函数需要能够更改x
,那么您可以将它们变成类A
的朋友。这限制了对这些朋友的访问权限,而不是将其提供给每个人。
因此,friend
是一种封装工具,允许封装比我自己的类更广泛" (私人会员)或"只是我的课程和课程来源于它" (受保护的成员)。一个朋友不需要在同一个类层次结构中(它根本不需要是一个类;函数可以是朋友),但它仍允许您限制只访问那些实际需要它的东西。
请注意,与getter和setter一样,应谨慎使用。封装是一件好事,在可能的情况下,你班级的私人成员应该保持私密性。 friend
是一个允许您有选择地授予访问权限的工具,但是您应该始终仔细考虑是否需要授予该访问权限,或者需要它的函数/类是否会更好地作为您的类的成员,代替。
答案 2 :(得分:0)
考虑我最近遇到的以下用例:我将一些代码中的一些代码重构为另一个类。这个新类必须访问原始类的成员,但我不想通过公共getter提供这个,以避免其他客户搞乱这些。在这种情况下,我真的很欢迎C ++ - 友好机制。
然而,这些用例很少(希望,否则你的SW架构可能有问题)我会尽量避免它,因为它是最紧密的耦合形式
答案 3 :(得分:0)
朋友类/方法可以非常成功地用于测试类功能中的中间状态。
这些对于某些类型的复制构造函数也很有用,其中要复制的类不是目标类的直接祖先。