程序员如何跟 Girl 成为 friend?

吴小龙同学

共 2241字,需浏览 5分钟

 ·

2021-10-02 02:56

我们知道一个类的变量或函数申明了 private,那么在别的类是无法访问的,最近有个需求,需要调用 SurfaceFlinger 的 setActiveConfig 方法来修改帧率,在实现的过程中,发现 setActiveConfig 是私有的,是没法直接调用且编译也通不过,查看其他处写的代码,为什么能调用?难道有什么黑科技?了解后原来是友元 friend 起了作用。

友元可以让私有变量或函数直接访问,友元的声明可以出现在类的任何地方,当然友元破环了封装机制,有友元类和友元函数,先来看个完整的友元类的例子:

#include <iostream>
using namespace std;

class Girl
{


public:
    friend class Boy;//友元类,让Boy能访问Girl私有变量和函数
    void setAge(int a);
private:
    int age=18;
    void getAge();
};

void Girl::setAge(int a)
{
    age=a;
}

void Girl::getAge()
{
    cout<<"This is a secret!"<<endl;
}

class Boy
{


public:
    Girl* girl;
    Boy(Girl* girl);
    void getAge();

};

Boy::Boy(Girl* girl)
{
    girl=girl;
}
void Boy::getAge()
{
    girl->getAge();

}

// 程序的主函数
int main( )
{
    Girl girl;
    Boy* boy =new Boy(&girl);
    boy->getAge();


    return 0;
}

运行程序,打印

This is a secret!

卧槽!

接下来看下友元函数,申明友元函数为了是在友元函数内部访问该类对象的私有成员,友元函数是不能被继承的,没有 this 指针,完整的友元函数例子如下:

#include <iostream>
using namespace std;
class Girl
{

friend void getAge(Girl* g);//友元函数
public:
    void setAge(int a);
private:
    int age=18;
};

void Girl::setAge(int a)
{
    age=a;
}

void getAge(Girl* g)
{
    cout<<"This is a secret!"<<endl;
    cout<<"进一步了解:"<<g->age<<endl;
}

// 程序的主函数
int main( )
{
    Girl girl;
    getAge(&girl);

    return 0;
}

运行程序,打印

This is a secret!
进一步了解:18

要想获取 Girl 芳心,首先需要做 friend,也就是说必须显式地声明你是 Girl 的 friend,才有进一步发展的机会,好了,Over。

浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报