【一】为什么引入友元机制?
    总的来说就是为了让非成员函数即   普通函数或其他类    可以访问  类的私有成员,这确实破坏了类的封装性数据的隐蔽性,但为什么要这么做呢?
(c++ primer:尽管友元被授予从外部访问类的私有部分的权限,但它并不与面向对象的编程思想相悖,相反,他们提高了公有接口的灵活性)。
要理解上面这句话,就必须知道友元形成的过程:(任何函数,或者成员函数或者类想成为某个类的友元,这是由这个类来决定的,而不能从外部强加友情)

    下面来看不引进友元的缺点:
(1)数据的封装是把双刃剑,只要数据被封装,类外的函数就无法访问到类内的私有成员函数,但有些情况下,我们必须要访问某一些类的私有成员,我们就会为了这一些特殊的少部分访问操作要把数据成员公有化,即为了满足少量人的需求而把数据置于公共的不安全的状态下,这显然是不明智的,同理,在公共接口中放置一些可以访问私有成员的函数作为接口让其他外部函数进行访问,这样做也就把私有成员通过自己的公有接口暴漏,不可取,这种在数据的安全性和共享性的博弈中,没有两全其美的方案,

所以就产生了友元这种机制,即尽可能的对数据进行封装,有特殊要求就特殊对待,即对某些类外的函数“开后门”,对那些函数“开后门”由类说了算,这正是提高公共接口的灵活性的体现。


【二】友元函数的形态
    友元主要分为 友元函数友元类,在电视机和遥控器的例子中,电视机和遥控器都可以控制电视(换台,调节音量,切换模式等),
但电视机和遥控器不是派生继承的关系,为了复用和控制电视机,就可以把遥控器类声明为电视机的友元类,这样遥控器类中的所有函数就可以使用电视机类中的所有成员,包括复用电视机中的所有操作,但是发现除了 频道这个电视机的私有成员,其他的私有成员在电视机的公共接口中都可以访问,那么,就没必要吧整个遥控器类声明为友元类,只要把直接操作频道的这个函数声明为电视机的友元函数即可。

    【友元函数】在类内部,只能申明函数原型,不能定义函数体,不是访问级别的限制。
    【友元类】友类的每个成员都可以访问另一个类中的保护成员和私有成员。
   注意:调用私有成员需要制定对象,即:对象名.变量

               成员函数有this指针,而友元函数没有this指针。

               友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。


【三】运算符重载
    先来看看普通的运算符重载:
#include<iostream>
using namespace std;

class add
{
public:
    add(int);
    int operator +(add); //重载运算符
private:
    int a;
};
add::add(int x)
{
    a = x;
}
int add::operator +(add tem)
{
    return a - tem.a;
}

int main()
{
    add t1(10),t2(20);
    cout << "t1+t2=" << t1 + t2 << endl;
    system("pause");

}

————————————————
版权声明:本文为CSDN博主「凉凉猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pipinuan/article/details/52848251