C++类的友元
友元是一个与访问控制权限相关的概念。C++语言可以在定义类的时候声明友元,向类外的某些函数或类定向开放类中的所有成员。被类声明为友元的函数称为该类的友元函数,被声明为友元的类称为该类的友元类。
一、友元函数(可以设为类的内联函数)
友元函数的语法形式:
class 类名
{
. . .
frined 返回值类型 友元函数名(参数列表);//友元函数的原型声明
};
友元函数的语法细则:
1)在类声明部分声明友元函数额原型,声明时使用关键字friend。声明语句可以放在大括号内的任意位置,该位置的访问权限与友元函数无关。
2)友元函数是类外的其他函数,不是类的成员。
3)友元函数可以在其他函数体内访问该类对象的所有成员,不受权限约束。
示例:
class A
{
public: int x;
protected: int y;
private: int z;
public:
A(int p1=0,int p2=0,int p3=0) {x=p1;y=p2;z=p3}
frined void fun1(); //声明类外函数fun1为类A的友元函数,此时类外函数可以访问x,y,z
}
二、友元类
示例:
class B
{
. . .
void fun1();
void fun2();
};
class A
{
. . .
frined void B:: fun1(); //声明类B中的fun函数为类A的友元函数
};
如果类B中所有函数成员都是类A的友元函数,则称类B为类A的友元类。声明友元类时不需要逐个声明其函数成员,而是采用统一声明的语法形式:
class A
{
. . .
frined class B; //声明类B为类A的友元类
};
声明为类A的友元类后,类B的函数成员就可以在函数体中访问A类对象的所有成员,包括保护成员和私有成员。
注意:
1)友元关系时单向的。若类A声明类B时自己的友元类,并不意味着A同时成为B的友元,除非对方声明。
2)友元关系不能传递。假设类B时类A的友元,类C又是类B的友元,这并不意味着类A和C之间存在任何友元关系,除非它们自己单独声明。