友元函数的引入:
类的主要特点之一是信息隐藏和封装,即类的私有成员(或者保护成员)只能在类定义的范围内使用,只允许本类的成员函数来调用,但是有时候也需要在类外引用私有成员(或者保护成员);那么问题就是如何在不放弃私有成员(或者保护成员)的数据安全性的情况下,可以允许一个普通函数或者另一个类的成员函数来使用这个类的私有成员(或者保护成员);C++引入了友元 (包括友元类和友元函数)-------提供了外界通向私有成员(或者保护成员)的通路;下面分开来介绍友元函数和友元类;
友元函数
1.
① 友元函数可以是不属于任何类的非成员函数;
② 友元函数也可以是属于另一个类的成员函数;
③ 友元函数可以访问该类的所有成员;
④ 友元函数不是当前类的成员函数,是独立于当前类的外部函数;
2.
友元函数声明:friend 函数类型 函数名(形参列表);
友元函数在类中声明,可以放在公有部分,也可以放在保护部分和私有部分;
友元函数可以在类中定义,也可以在类外定义(定义时不需要加 friend)
注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使 用"::"作用域符号;
友元函数不是类成员,所以不能直接访问类成员,只能通过作为入口参数传递进来的对象名(或对象指针,对象引用)来访问类 成员;
3. 友元函数参数
友元函数没有this指针;
① 要访问非static成员时,需要对象做参数;
②要访问static成员或全局变量时,则不需要对象做参数;
③如果做参数的对象是全局对象,则不需要对象做参数;
4.友元函数分类:
① 将非成员函数声明为友元函数
class example
{
friend void print(example &x);//友元函数声明
};
void print(example &x)//函数名前不加friend
{
//访问类数据成员
}
int main()
{
example ee;
print(ee);//直接调用友元函数
}
一个函数同时定义为两个类的友元函数:
class example1;//对第一个类的提前引用说明
class example2
{
friend void print(example1 &e1,example2 &e2);
//声明函数print为类example2的友元函数
};
class example1
{
friend void print(example1 &e1,example2 &e2);
//声明函数print为类example1的友元函数
};
//定义友元函数
void print(example1 &e1,example2 &e2)
{
//访问两个类的数据成员;
}
友元函数带了两个不同的类的对象,其中一个是类example1的对象,而类example1要在后面才被定义,为避免编译错误,要提前声明。
② 将成员函数声明为友元函数
一个类的成员函数也可以作为另一个类的友元,它是友元函数的一种,称为友元成员函数;友元成员函数不仅可以访问自己所在类对象的数据成员,还可以访问friend声明语句所在类对象中的所有成员,这样能使两个类相互合作,协调工作,完成某一任务;