类的friend函数(友元函数)在类的作用域之外定义,却具有访问类的非public(以及public)成员的权限。单独的函数或者整个类都可以被声明为另一个类的友元。使用friend函数可以提高程序的性能。
定义友元函数:
在类定义中函数原型前面加保留字friend,就将函数声明为该类的友元。比如:要将类ClassTwo的所有成员函数声明为类ClassOne的友元,应在ClassOne定义中加入如下的形式的一条声明:
friend class ClassTwo;
注意点1:即使friend函数的原型在类定义内出现,友元仍然不是成员函数!
注意点2:private ,public , protected 这些成员访问说明符标志与友元的声明无关,因此友元定义可以放到类的任何地方!
注意点3:养成良好的编程友习惯,在类定义中把所有友元关系声明在最前面的位置,并且不要在其前面添加任何成员访问说明符!
友元关系是授予的不是索取的!
对于类B是类A的友元,类A必须显示的声明类B是他的友元,另外,友元关系既不是对称的也不是传递的,即如果类A是类B的友元,类B是类C的友元,不能够推断出类A是类C的友元(有缘关系不是传递的),也不能推出类B是类A的友元(友元关系不是对称的),同时也不能推出类C是类B的友元(友元关系不是对称的)。
举例说明(使用friend函数修改类的private数据):
在这个例子中,定义friend函数setX来设置Count类的private数据成员x。请注意,友元声明首先出现在类的定义中,甚至出现在public成员函数之前。再次说明,友元声明可以在类的任何地方。
#include
using namespace std;
//Count 类定义
class Count
{
friend void setX(Count &,int);//友元函数setX定义
public:
//构造函数
Count()
:x(0)//初始化x为0
{
//空的函数体
}
void print()const
{
cout<
}
private:
int x;
};
//setX函数可以更改count类的私有成员
//因为setX被定义为count类的友元函数
void setX(Count &c, int val)
{
c.x= val;//将val变量的值赋给count类c对象的x数据成员
}
int main()
{
Count counter;
cout<
counter.print();
setX(counter,8);//使用友元函数
cout<
counter.print();
system("pause");
return 0;
}
其运行结果是:
函数setX是一个c语言风格的独立函数——他不是Count类的成员函数。因此,对于counter对象,当setX被调用的时候,第41行将counter作为参数传递给setX,而不是语句 counter.setX(8) ; 一样的句柄来调用此函数。如果把友元的声明去掉,就会出现错误的信息,函数setX不能修改count类的私有成员。
一般情况下,我们将上述该程序分割成如下的三个文件:
一个头文件(比如:Count.h)包含Count类的定义,而在类的定义中又包含了friend函数setX的函数模型。一个执行文件(比如:Count.cpp)包含Count类成员函数的定义以及friend函数setX的定义。一个主函数(比如:main.cpp)含有main函数。
以上就是有关friend友元的基础知识,希望对大家有帮助。