//友元函数  友元类
#include<iostream>
using namespace std;



class PointB
{
public:
    friend class PointC;
    //类PointC是类PointB的友元类--意味着类PointC对象可以调用PointB中所有的成员
    void Test(){
        ;
    }
private:
    int x;
    int y;
};

class PointC
{
public:
    void printfPointB(){
        //调用其友元类的私有属性
        cout << pb.y << endl;
        //调用PointB的成员函数
        pb.Test();
    }
private:
    PointB pb;
};


class PointA
{
public:
    //友元函数
    friend void Friendfun(PointA* pin);
    int GetA(){
        return a;
    }
    int GetB(){
        return b;
    }
private:
    int a;
    int b;
};

//friend 关系户
//const(C语言)冒牌货
//register cpu身边的小太监(寄存器)
//typedef 混号王(起别名)


//友元函数
//友元必须有一个参数,就是友元函数所在类的对象指针(不然无法访问对象的私有属性)
//友元函数是一个全局函数
//友元函数破坏类的封装性
void Friendfun(PointA* pin){
    //可以直接访问类的私有成员
    pin->a = 10;
    pin->b = 20;
}


void protectA(){
    PointA *p1 = new PointA();
    Friendfun(p1);
    cout << "a=" << p1->GetA() << ";b=" << p1->GetB() << endl;
    if (p1!=NULL)
    {
        delete p1;
    }
}

void main(){
    protectA();
    system("pause");
}