时间:2021-05-19
在某些情况下,为不是类成员的函数或单独类中的所有函数授予成员级别的访问权会更方便。仅类实现器可以声明其友元。函数或类不能将其自身声明为任何类的友元。在类声明中,使用 friend 关键字和非成员函数名称或其他类,以允许其访问你的类的专用和受保护成员。
语法
友元声明
如果声明以前未声明的友元函数,则该函数将被导出到封闭非类范围。
友元声明中声明的函数被视为已使用 extern 关键字声明。(有关 extern 的详细信息,请参阅静态存储类说明符。)
尽管具有全局范围的函数可以在其原型之前声明为友元函数,但是成员函数在它们的完整类声明出现前不能声明为友元函数。以下代码演示此失败的原因:
前面的示例将类名 ForwardDeclared 输入到范围中,但是完整的声明(具体而言,声明函数 IsAFriend 的部分)是未知的。因此,friend 类中的 HasFriends 声明会生成一个错误。
若要声明两个互为友元的类,则必须将整个第二个类指定为第一个类的友元。此限制的原因是该编译器仅在声明第二个类的位置有足够的信息来声明各个友元函数。
注意
尽管整个第二个类必须是第一个类的友元,但是可以选择将第一个类中的哪些函数作为第二个类的友元。
友元函数
friend 函数是一个不为类成员的函数,但它可以访问类的私有和受保护的成员。友元函数不被视为类成员;它们是获得了特殊访问权限的普通外部函数。友元不在类的范围内,除非它们是另一个类的成员,否则不会使用成员选择运算符(. 和 –>)调用它们。 friend 函数由授予访问权限的类声明。可将 friend 声明放置在类声明中的任何位置。它不受访问控制关键字的影响。
以下示例显示 Point 类和友元函数 ChangePrivate。 friend 函数可以访问其接受为参数的 Point 对象的私有数据成员。
在前面的示例中,仅为函数 A::Func1( B& ) 授予对类 B 的友元访问权限。因此,访问私有成员 _b 在类 Func1 的 A 中是正确的,但在 Func2 中是不正确的。
friend 类是其所有成员函数都是类的友元函数的类,即,其成员函数具有对类的私有成员和受保护成员访问权限。假定类 friend 中的 B 声明是:
在这种情况下,将为类 A 中所有成员函数授予对类 B 的友元访问权限。以下代码是友元类的示例:
友元关系不是相互的,除非如此显式指定。在上面的示例中,YourClass 的成员函数无法访问 YourOtherClass 的私有成员。
托管类型不能具有任何友元函数、友元类或友元接口。
友元关系不能继承,这意味着从 YourOtherClass 派生的类不能访问 YourClass 的私有成员。友元关系不可传递,因此 YourOtherClass 的友元类无法访问 YourClass 的私有成员。
下图显示了 4 个类声明:Base、Derived、aFriend 和 anotherFriend。只有类 aFriend 具有对 Base 的私有成员(以及对 Base 可能已继承的所有成员)的直接访问权限。
内联友元定义
可以在类声明中定义友元函数。这些函数是内联函数,类似于成员内联函数,其行为就像它们在所有类成员显示后但在类范围关闭前(类声明的结尾)被定义时的行为一样。
类声明中定义的友元函数不被认为在封闭类的范围内;它们在文件范围内。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一个C++类中的变量如果如下关键字作为修饰符.1.public:程序的任何地方都可以访问.2protected:只有类本身及其派生类和其友元函数,友元类可以访问
C++中友元函数与友元类详解总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frie
C++中友元的实例详解尽管友元被授予从外部访问类的私有部分的权限,但他们并不与面向对象的编程思想相悖;相反他提高了公共接口的灵活性。一、友元类友元声明可以位于公
友元函数和友元类的需要:类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员