【C++】友元|friend class
Friend Classes(友元类)
友元作用:
在一个类中指明其他的类(或者)函数能够直接访问该类中的private和protected成员。
在类的成员函数外部直接访问对象的私有成员。
你可以这样来指明:
friend class aClass;
注意:friend在类中的声明可以再public、protected和private的如何一个控制域中,而不影响其效果。例如,如果你在protected域中有这样的声明,那么aClass类同样可以访问该类的private成员。
这有一个例子:
Node是节点类,要让BinaryTree 不需要调用public方法就能够访问到Node的私有成员。
class Node
{
private:
int data;
int key;
// ...
friend class BinaryTree; // class BinaryTree can now access data directly
};
这样BinaryTree就可以直接访问Node中的private的成员了,就像下面这样:
key和data都是Node的私有变量,BinaryTree可以直接访问
class BinaryTree
{
private:
Node *root;
int find(int key);
};
int BinaryTree::find(int key)
{
// check root for NULL...
if(root->key == key)
{
// no need to go through an accessor function
return root->data;
}
// perform rest of find
}
注意:类作为友元需要注意的是友元类和原始类之间的相互依赖关系,如果在友元类中定义的函数使用到了原始类的私有变量,那么就需要在友元类定义的文件中包含原始类定义的头文件。
Friend Functions(友元函数)
友元函数和友元类的作用是一样的,它允许一个函数不需要通过其public接口就能够访问到类中的private和protected成员变量。
你可以这样去声明:
friend return_type class_name::function(args);
这里有一个例子:
class Node
{
private:
int data;
int key;
// ...
friend int BinaryTree::find(); // Only BinaryTree's find function has access
};
这样find方法就可以直接访问Node中的私有成员变量了,而BinaryTree中的其他的方法去不能够直接的访问Node的成员变量。(这就是友元类和友元函数的区别)
C++中的友元机制允许类的非公有成员被一个类或者函数访问,友元按类型分为三种:普通非类成员函数作为友元,类的成员函数作为友元,类作为友元。
注意:先定义包含友元函数的类,再定义原始类,这个顺序不能乱。
-
#include "B.h"
-
#include "A.h"
6 友元不能被继承
B是A的友元类,C是B的子类,推不出C是A的友元
7 友元不具有传递性
B是A的友元,C是B的友元,推不出C是A的友元
9 如果想要指定两个类都有成员函数作为对方的友元,那么必须第2个类是第一个类的友元