“朋友”关键字的作用是什么?


11

您能否向我解释为什么friend首选关键字来授予对类的私有数据的访问权?


1
如果您问为什么会friend被优先使用,您通常使用什么其他方式从外部访问私有类数据?
本杰明·班尼尔

@honk“首选”可能是在此处使用的错误单词。我编辑了大部分帖子以纠正语法和其他方面的问题,并且保留了最初的单词选择,但是我认为这里可能存在语言障碍。
亚当李尔

我不知道,因为今天我偶然碰到了一位朋友。文章说如果我不使用朋友,我将创建一个单人课程。
道尔顿,

Answers:


17

Friend是扩展类接口的经典方法。
但很棒的是,朋友明确记录了您将特定项目紧密绑定到类的意图。

注意:通过使用好友,您可以将好友紧密地绑定到班级。

一个完美的例子是C ++中的流运算符

class Plop
{
    private:
        int  value;
        friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
        friend std::istream& operator>>(std::istream& stream, Plop&       data);
};

std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
     return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop&       data)
{
     return stream >> data.value;
}

在这里,我们正在扩展Plop类的公共接口,该接口允许我们将对象以流的形式传入和传出流,但又不会暴露内部实现,也不会因要求使用必须使用的get / set方法而引起将来的实现难题。即使更改了内部实现,也要维护它们(因为它们将成为公共接口的一部分)。

注意:这不是破坏了封装,但它确实裹紧流运营商扑通类的实现(即任何改变扑通类的实现将需要改变流运营商的实现)。但这是预期的。公共接口的所有部分(包括公共/受保护的方法)都与实现紧密绑定。

但请注意:您已在类声明中明确记录了此绑定。

注意:我不会将friend作为公开私有数据的首选方式。朋友的过度使用可能与公开实现一样糟糕。像所有语言功能一样,应谨慎使用。


如果您可以公开访问数据(例如,通过吸气剂),您会使用免费功能吗?
Ioanna
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.