【发布时间】:2014-08-27 23:00:47
【问题描述】:
有很多关于 C++ 朋友关键字的帖子。我看到了有朋友班的好处。关于friend关键字是否破坏了封装,提出并回答了许多问题,但所有这些响应似乎都是针对将friend用于类。
但是友元函数呢?我这辈子都不明白你为什么要这个。一旦您拥有任何朋友功能,您是否不允许任何曾经出现的类访问您的所有私有数据/功能?
class Foo
{
private:
int neverSetToZero;
public:
Foo() { neverSetToZero = 1; }
friend void Whateveryoudowiththisdonttouchneversettozero(Foo * t);
};
void Whateveryoudowiththisdonttouchneversettozero(Foo * t)
{
(*t).neverSetToZero=0;
}
int main()
{
Foo t;
Whateveryoudowiththisdonttouchneversettozero(&t);
return 0;
}
【问题讨论】:
-
问题是什么?如果您的特定代码破坏了封装,或者友元函数有一般用途?
-
由于友元必须在类定义中声明,它们不会像成员函数那样破坏封装。它们只是类接口的一部分,允许比成员函数更灵活的调用模式。
-
你在问什么?在您的示例中,恶魔函数与将
this移至参数的公共方法基本相同。 “C 风格”。 -
因为我从来没有和别人一起写过代码,也许我的概念理解是错误的......但我理解它的方式是我需要担心其他人滥用我的课程......这就是拥有私有数据和功能背后的真正意义。这是错的吗?如果我是正确的,那么拥有一个朋友功能似乎会以不受控制的方式允许这样做。
-
@MikeSeymour 我在哪里必须声明可以使用该功能的朋友是谁?通过声明一个朋友函数,似乎允许任何人来定义该函数......