友元声明
如果声明以前未声明的友元函数,则该函数将被导出到封闭非类范围。
友元声明中声明的函数被视为已使用 extern 关键字声明。(有关 extern 的详细信息,请参阅静态存储类说明符。)
尽管具有全局范围的函数可以在其原型之前声明为友元函数,但是成员函数在它们的完整类声明出现前不能声明为友元函数。 以下代码演示此失败的原因:
class ForwardDeclared; // Class name is known.
class HasFriends
{
friend int ForwardDeclared::IsAFriend(); // C2039 error expected
};
前面的示例将类名 ForwardDeclared 输入到范围中,但是完整的声明(具体而言,声明函数 IsAFriend 的部分)是未知的。 因此,HasFriends 类中的 friend 声明会生成一个错误。
若要声明两个互为友元的类,则必须将整个第二个类指定为第一个类的友元。 此限制的原因是该编译器仅在声明第二个类的位置有足够的信息来声明各个友元函数。
备注
尽管整个第二个类必须是第一个类的友元,但是可以选择将第一个类中的哪些函数作为第二个类的友元。