友元

1.什么是友元

在类中只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。

为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。不过,类的访问权限确实在某些应用场合显得有些呆板,从而容忍了友元这一特别语法现象。
2.友元函数
如果友元是一般函数或类的成员函数,则称为友元函数。友元函数是拥有成员函数一切权利的非成员函数,也就是说,友元函数不是类的成员函数,但可以像成员函数一样直接访问类的私有成员(包括私有数据成员和成员函数)。
定义格式:
friend  返回类型   函数名  (参数列表);
class   MYclass
{
public:
    ...
    friend void  add(int n);
    ...
};
友元函数特点:
     类的友元函数在类作用域之外定义,但可以访问类的私有和保护成员;
    尽管类定义中有友元函数原型,友元函数仍然不是成员函数;
    由于友元函数不是任何类的成员函数,所以不能用句柄(对象)加点操作符来调用;
    public, private, protected成员访问符与友员关系的声明无关,因此友元关系声明可在类定义的任何位置,习惯上在类定义的开始位置;
    友元关系是指定的,不是获取的,如果让类B成为类A的友元类,类A必须显式声明类B为自己的友元类;
    友元关系不满足对称性和传递性;
    如果一个友元函数想与两个或更多类成为友元关系,在每个类中都必须声明为友元函数;
3.友元类
如果友元是一个类,则称为友元类,友元类的所有成员函数都为友元函数。若B类是A类的友元类,则B类的所有成员函数都是A的友元函数,都可以访问A类的私有和保护成员。
定义格式:
class A
{
    ...
    public:
        friend class B;
       ...
};
注意:友元关系式不能被继承的。

 

 
原文地址:https://www.cnblogs.com/zhangmiao14/p/3751143.html