繁体   English   中英

为什么PRIVATE成员函数不能成为另一个类的朋友函数?

[英]Why can't a PRIVATE member function be a friend function of another class?

class x
{
    void xx() {}
};

class y
{
    friend void x::xx();
};

这会导致错误

错误:朋友函数'xx'是'x'的私有成员

为什么我不能声明私有成员函数成为另一个类的朋友?

使x::xx private的想法应该是x::xx是其他类不应该依赖的实现细节。 它并不仅仅意味着x::xx不能被其他类调用,它意味着,或者更确切地说它应该意味着,例如将x::xx重命名为x::xy不应该破坏除类本身之外的任何其他类,和班上的朋友们。

在您的情况下,将x::xx重命名为x::xy会导致类y出错,即使它不是x的朋友。

避免这种情况的一种方法是使y成为x的朋友,以便y可以访问xprivate成员。 然后它可以将x::xx声明为friend

(注意:对“为什么编译器不允许这个?”这一问题的更直接的回答是“因为标准不允许这样做。”这自然会导致后续问题“为什么标准不允许这样? “我正试图回答这个后续问题。)

[class.friend] / 9

朋友声明提名的名称应在包含朋友声明的类的范围内访问。

原因很简单; private成员应遵守明确的规则:

一个班级的成员可以

  • private 也就是说,它的名称只能由声明它的类的成员和朋友使用。

允许在不相关的类中的声明中命名私有成员将违反此规则:它允许另一个类依赖于实现细节而不明确允许。 例如,当更改私有成员的名称,类型或签名或完全删除它时,这就成了问题; 这是为了不破坏该类的接口。

这可以通过整体规避x的朋友y

class x {
    void xx() {}
};

class y {
    friend x;
};

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM