類的友元函數(shù)是定義在類外部,但有權(quán)訪問(wèn)類的所有私有(private)成員和保護(hù)(protected)成員。盡管友元函數(shù)的原型有在類的定義中出現(xiàn)過(guò),但是友元函數(shù)并不是成員函數(shù)。
友元可以是一個(gè)函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個(gè)類,該類被稱為友元類,在這種情況下,整個(gè)類及其所有成員都是友元。
友元提供了不同類的成員函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制。通過(guò)友元,一個(gè)不同函數(shù)或另一個(gè)類中的成員函數(shù)可以訪問(wèn)類中的私有成員和保護(hù)成員。c++中的友元為封裝隱藏這堵不透明的墻開了一個(gè)小孔,外界可以通過(guò)這個(gè)小孔窺視內(nèi)部的秘密。
如果要聲明函數(shù)為一個(gè)類的友元,需要在類定義中該函數(shù)原型前使用關(guān)鍵字 friend,如下所示:
class A
{
double width;
public:
double length;
friend void printWidth( Box box );
void setWidth( double wid );
};
聲明類 ClassTwo 的所有成員函數(shù)作為類 ClassOne 的友元,需要在類 ClassOne 的定義中放置如下聲明:
friend class B;
轉(zhuǎn)載部分:
1、為什么要引入友元函數(shù):在實(shí)現(xiàn)類之間數(shù)據(jù)共享時(shí),減少系統(tǒng)開銷,提高效率
具體來(lái)說(shuō):為了使其他類的成員函數(shù)直接訪問(wèn)該類的私有變量
即:允許外面的類或函數(shù)去訪問(wèn)類的私有變量和保護(hù)變量,從而使兩個(gè)類共享同一函數(shù)
優(yōu)點(diǎn):能夠提高效率,表達(dá)簡(jiǎn)單、清晰
缺點(diǎn):友元函數(shù)破環(huán)了封裝機(jī)制,盡量不使用成員函數(shù),除非不得已的情況下才使用友元函數(shù)。
2、什么時(shí)候使用友元函數(shù):
1)運(yùn)算符重載的某些場(chǎng)合需要使用友元。
2)兩個(gè)類要共享數(shù)據(jù)的時(shí)候
3、怎么使用友元函數(shù):
友元函數(shù)的參數(shù):
因?yàn)橛言瘮?shù)沒(méi)有this指針,則參數(shù)要有三種情況:
1、 要訪問(wèn)非static成員時(shí),需要對(duì)象做參數(shù);--常用(友元函數(shù)常含有參數(shù))
2、 要訪問(wèn)static成員或全局變量時(shí),則不需要對(duì)象做參數(shù)
3、 如果做參數(shù)的對(duì)象是全局對(duì)象,則不需要對(duì)象做參數(shù)
友元函數(shù)的位置:
因?yàn)橛言瘮?shù)是類外的函數(shù),所以它的聲明可以放在類的私有段或公有段且沒(méi)有區(qū)別。
友元函數(shù)的調(diào)用: 可以直接調(diào)用友元函數(shù),不需要通過(guò)對(duì)象或指針
友元函數(shù)的分類:
根據(jù)這個(gè)函數(shù)的來(lái)源不同,可以分為三種方法:
1、普通函數(shù)友元函數(shù):
a) 目的:使普通函數(shù)能夠訪問(wèn)類的友元
b) 語(yǔ)法:聲明位置:公有私有均可,常寫為公有
聲明: friend + 普通函數(shù)聲明
實(shí)現(xiàn)位置:可以在類外或類中
實(shí)現(xiàn)代碼:與普通函數(shù)相同(不加不用friend和類::)
調(diào)用:類似普通函數(shù),直接調(diào)用
class INTEGER
{
private:
int num;
public:
friend void Print(const INTEGER& obj);//聲明友元函數(shù)
};
void Print(const INTEGER& obj)//不使用friend和類::
{
//函數(shù)體
}
void main()
{
INTEGER obj;
Print(obj);//直接調(diào)用
}
2、類Y的所有成員函數(shù)都為類X友元函數(shù)—友元類
a)目的:使用單個(gè)聲明使Y類的所有函數(shù)成為類X的友元
它提供一種類之間合作的一種方式,使類Y的對(duì)象可以具有類X和類Y的功能
具體來(lái)說(shuō):
前提:A是B的友元(=》A中成員函數(shù)可以訪問(wèn)B中有所有成員,包括私有成員和公有成員--老忘) 則:在A中,借助類B,可以直接使用~B . 私有變量~的形式訪問(wèn)私有變量
b)語(yǔ)法:聲明位置:公有私有均可,常寫為私有(把類看成一個(gè)變量)
聲明: friend + 類名---不是對(duì)象啊
調(diào)用:
c)代碼:
class girl;
class boy
{
private:
char *name;
int age;
public:
boy();
void disp(girl &);
};
void boy::disp(girl &x) //函數(shù)disp()為類boy的成員函數(shù),也是類girl的友元函數(shù)
{
cout<<"boy's name is:"<<name<<",age:"<<age<<endl;//正常情況,boy的成員函數(shù)disp中直接訪問(wèn)boy的私有變量
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
//借助友元,在boy的成員函數(shù)disp中,借助girl的對(duì)象,直接訪問(wèn)girl的私有變量
//正常情況下,只允許在girl的成員函數(shù)中訪問(wèn)girl的私有變量
}
class girl
{
private:
char *name;
int age;
friend boy; //聲明類boy是類girl的友元
public:
girl();
};
void main()
{
boy b;
girl g;
b.disp(g); //b調(diào)用自己的成員函數(shù),但是以g為參數(shù),友元機(jī)制體現(xiàn)在函數(shù)disp中
}
3、類Y的一個(gè)成員函數(shù)為類X的友元函數(shù)
a)目的:使類Y的一個(gè)成員函數(shù)成為類X的友元
具體而言:而在類Y的這個(gè)成員函數(shù)中,借助參數(shù)X,可以直接以X。私有變量的形式訪問(wèn)私有變量
b)語(yǔ)法:聲明位置:聲明在公有中 (本身為函數(shù))
聲明:friend + 成員函數(shù)的聲明
調(diào)用:先定義Y的對(duì)象y---使用y調(diào)用自己的成員函數(shù)---自己的成員函數(shù)中使用了友元機(jī)制
c)代碼:
class girl;
class boy
{
private:
char *name;
int age;
public:
boy();
void disp(girl &);
};
class girl
{
private:
char *name;
int age;
public:
girl(char *N,int A);
friend void boy::disp(girl &); //聲明類boy的成員函數(shù)disp()為類girl的友元函數(shù)
};
void boy::disp(girl &x)
{
cout<<"boy's name is:"<<name<<",age:"<<age<<endl; //訪問(wèn)自己(boy)的對(duì)象成員,直接訪問(wèn)自己的私有變量
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
//借助友元,在boy的成員函數(shù)disp中,借助girl的對(duì)象,直接訪問(wèn)girl的私有變量
//正常情況下,只允許在girl的成員函數(shù)中訪問(wèn)girl的私有變量
}
void main()
{
boy b();
girl g();
b.disp(g); }
作者:AndrewYZWang
來(lái)源:CSDN
原文:https://blog.csdn.net/andrewgithub/article/details/78760381
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
歡迎掃碼加入QQ群一起學(xué)習(xí)討論。
