【问题标题】:C++ Friend Functions Improve Encapsulation?C++ 友元函数改进封装?
【发布时间】: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 我在哪里必须声明可以使用该功能的朋友是谁?通过声明一个朋友函数,似乎允许任何人来定义该函数......

标签: c++ friend


【解决方案1】:

我会说友元函数只是类的公共接口的扩展,它使用稍微不同的语法并允许对其所有参数进行隐式转换(而成员函数在第一次不这样做/隐含参数)。

换句话说,授予友谊的类的作者应该是控制朋友功能的人。如果您只是在您的类中声明一个友元函数并允许客户定义该函数,那么肯定会崩溃(并且程序会崩溃)。但这不是友元函数的用途。

【讨论】:

    【解决方案2】:

    但是友元函数呢?我这辈子都不明白你为什么要这个。

    添加friend 函数的常见用例是将实现逻辑放入不能是成员函数但必须是独立函数的函数中。

    例如,非成员二元运算符和<< 运算符的重载通常是相应类的朋友。

    在我所见过的friend 函数的所有情况下,将函数“加为好友”的代码也提供了相同函数的实现。没有在您的类中留下未实现的朋友功能的用例。从本质上讲,该功能可让您利用班级的知识构建独立的逻辑。

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 2019-02-13
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      相关资源
      最近更新 更多