友元函數(shù)

類的友元函數(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í)討論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容