程序員如何跟 Girl 成為 friend?

我們知道一個(gè)類的變量或函數(shù)申明了 private,那么在別的類是無法訪問的,最近有個(gè)需求,需要調(diào)用 SurfaceFlinger 的 setActiveConfig 方法來修改幀率,在實(shí)現(xiàn)的過程中,發(fā)現(xiàn) setActiveConfig 是私有的,是沒法直接調(diào)用且編譯也通不過,查看其他處寫的代碼,為什么能調(diào)用?難道有什么黑科技?了解后原來是友元 friend 起了作用。
友元可以讓私有變量或函數(shù)直接訪問,友元的聲明可以出現(xiàn)在類的任何地方,當(dāng)然友元破環(huán)了封裝機(jī)制,有友元類和友元函數(shù),先來看個(gè)完整的友元類的例子:
#include <iostream>
using namespace std;
class Girl
{
public:
friend class Boy;//友元類,讓Boy能訪問Girl私有變量和函數(shù)
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();
}
// 程序的主函數(shù)
int main( )
{
Girl girl;
Boy* boy =new Boy(&girl);
boy->getAge();
return 0;
}
運(yùn)行程序,打印
This is a secret!
臥槽!
接下來看下友元函數(shù),申明友元函數(shù)為了是在友元函數(shù)內(nèi)部訪問該類對象的私有成員,友元函數(shù)是不能被繼承的,沒有 this 指針,完整的友元函數(shù)例子如下:
#include <iostream>
using namespace std;
class Girl
{
friend void getAge(Girl* g);//友元函數(shù)
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<<"進(jìn)一步了解:"<<g->age<<endl;
}
// 程序的主函數(shù)
int main( )
{
Girl girl;
getAge(&girl);
return 0;
}
運(yùn)行程序,打印
This is a secret!
進(jìn)一步了解:18
要想獲取 Girl 芳心,首先需要做 friend,也就是說必須顯式地聲明你是 Girl 的 friend,才有進(jìn)一步發(fā)展的機(jī)會,好了,Over。
評論
圖片
表情
