学习算法时用到了C++语言,遇到了友元函数,曾经学习过但是影响不太深刻,所以今天重新学习记录一下对友元函数的理解和如何使用。
1.什么是友元函数
友元函数是C++中的一种特殊的函数,基本概念相信大家已经很清楚了:
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
2.为什么要使用到友元函数
在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员,那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。
概括来说一般有两种情况要使用到友元函数:
(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。
3.友元函数的形式
friend <函数类型> <函数名> (<参数列表>)
看一段代码:
class INTEGER
{
friend void Print(const INTEGER& obj);//声明友元函数
};
void Print(const INTEGER& obj)
{
//函数体
}
void main()
{
INTEGER obj;
Print(obj);//直接调用
}
大概就是这种形式。
4.友元类的形式
和友元函数类似,例如创建了类A和类B,如果B是友元函数的话,即类B中可以直接访问类A中的私有变量,只需要在A类中声明即可,看如下代码:
class boy
{
public:
void disp(girl &);
};
void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数
{
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量
}
class girl
{
private:
char *name;
int age;
friend boy; //声明类boy是类girl的友元
};
5.友元函数需要注意的点
- 类中通过使用关键字friend 来修饰友元函数,但该函数并不是类的成员函数,其声明可以放在类的私有部分,也可放在共有部分。友元函数的定义在类体外实现,不需要加类限定。
- 一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数。
- 友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用。
- 友元函数在调用上同一般函数一样,不必通过对对象进行引用。
- 一些操作符的重载实现也是要在类外实现的,那么通常这样的话,声明为类的友元是必须的,比如你要自定义算法的时候,对“<<”的重载,就必须声明友元函数。
友元函数和类的成员函数的区别
1.成员函数有this指针,而友元函数没有this指针。
2.友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友
6.缺点
友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。