C ++ Friend函数改进封装?

时间:2014-07-07 12:48:07

标签: c++ friend

有很多关于C ++好友关键字的帖子。我看到有朋友课的好处。关于封面是否被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;
}

2 个答案:

答案 0 :(得分:6)

我说朋友函数只是该类公共接口的扩展,它使用稍微不同的语法并允许对其所有参数进行隐式转换(而成员函数不做在他们的第一个/暗示参数上。)

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

答案 1 :(得分:4)

  

但朋友的功能怎么样?我不能为我的生活看到你为什么会这样想。

添加friend函数的常见用例是将实现逻辑放入一个不能成为函数的函数中,而必须是一个独立函数。

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

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