友元函数和友元类

1. 友元函数

   类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。

   尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。申明友元函数的语句可以放在类中任意位置。

class A
{
public:
    A() : a(100) {}
    int GetA() { return this->a; }
    friend void SetA(A *p, int a); // 声明一个友元函数, 这个函数是这个类的好朋友, 自己内部的东西对好朋友开放
    
private:
    int a;
};

// 这里提供一个指向A类对象的指针,或者也可以通过其它方法给该函数提供A类对象(任意一个A类对象),以便访问
void SetA(A *p, int a)
{
    p->a = a;
}

int main()
{
    A mya;
    cout << mya.GetA() << endl; 
    SetA(&mya, 300); //通过友元函数 修改A类的私有属性
    cout << mya.GetA() << endl;
    return 0;
}

  

2. 友元类

   若申明B类是A类的友员类,即A类中申明B类是自己的好朋友,则B类的所有成员函数都是A类的友员函数,

   A类中的所有成员都像好朋友B开放。

   友员类通常设计为一种对数据操作或类之间传递消息的辅助类。

class CCar
{
private:
    int price;
    friend class CDriver;     //声明 CDriver 为友元类, 运行其访问自己的成员
};

class CDriver
{
public:
    CCar myCar;               // 既然想访问对方,自然持有对方的对象(任意一个)
    void ModifyCar()          // 改装汽车
    {
        myCar.price += 1000;  // 因CDriver是CCar的友元类,故此处可以访问其私有成员
    }
};

int main()
{
    return 0;
}

 

最后:无论友元函数还是友元类,都是一个类主动使用friend关键字申明想访问自己成员的其它类或者函数为自己的好朋友,这是一个允许

      访问的过程,想去访问的函数或类是没有主动权的。

 

 

 

未完待续。。。。。。

posted @ 2020-05-24 09:57  _yanghh  阅读(234)  评论(0)    收藏  举报