【发布时间】:2009-12-18 05:20:59
【问题描述】:
Bjarne Stroustrup 写道:
“朋友类必须事先在封闭范围内声明或在非类范围内定义,立即封闭正在声明它为朋友的类”
语句的第一部分不是多余的吗,因为“立即封闭类的非类作用域”包括“先前在封闭作用域中声明的”? IE:这两个范围有什么区别?
【问题讨论】:
-
“必须事先声明一个朋友类”——听起来很奇怪。在没有事先声明
B的情况下说struct A { friend class B; };是完全有效的。 -
AFAIK 你可以将 any 类声明为朋友:struct A {friend classDNE;}。我认为 Bjarne 在这里谈论的是朋友声明语句中的类如何“绑定”到定义(如果存在的话)。因此,在您的情况下,如果 B 在全局空间中定义,而 A 在命名空间中定义,则 A 声明中的友元类“B”不会“绑定”到全局类 B - 全局类 B 将无法访问A 的私有成员。