Answers:
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作为公开私有数据的首选方式。朋友的过度使用可能与公开实现一样糟糕。像所有语言功能一样,应谨慎使用。
friend
被优先使用,您通常使用什么其他方式从外部访问私有类数据?