程序员如何跟 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。
评论