一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C++_友元函數(shù)

 Home of heart 2011-11-09
 

C++_友元函數(shù)

1、為什么要引入友元函數(shù):在實(shí)現(xiàn)類之間數(shù)據(jù)共享時(shí),減少系統(tǒng)開銷,提高效率

      具體來說:為了使其他類的成員函數(shù)直接訪問類的私有變量

      即:允許外面的類或函數(shù)去訪問類的私有變量和保護(hù)變量,從而使兩個(gè)類共享同一函數(shù)

      優(yōu)點(diǎn):能夠提高效率,表達(dá)簡單、清晰

      缺點(diǎn):友元函數(shù)破環(huán)了封裝機(jī)制,盡量不使用成員函數(shù),除非不得已的情況下才使用友元函數(shù)。

2、什么時(shí)候使用友元函數(shù):

      1)運(yùn)算符重載的某些場合需要使用友元。

      2)兩個(gè)類要共享數(shù)據(jù)的時(shí)候

3、怎么使用友元函數(shù):

友元函數(shù)的參數(shù):

       因?yàn)橛言瘮?shù)沒有this指針,則參數(shù)要有三種情況:

       1、  要訪問非static成員時(shí),需要對象做參數(shù);--常用(友元函數(shù)常含有參數(shù))

       2、  要訪問static成員或全局變量時(shí),則不需要對象做參數(shù)

       3、  如果做參數(shù)的對象是全局對象,則不需要對象做參數(shù)

友元函數(shù)的位置:

       因?yàn)橛言瘮?shù)是類外的函數(shù),所以它的聲明可以放在類的私有段或公有段且沒有區(qū)別。

友元函數(shù)的調(diào)用:

       可以直接調(diào)用友元函數(shù),不需要通過對象或指針

友元函數(shù)的分類:

根據(jù)這個(gè)函數(shù)的來源不同,可以分為三種方法:

1、普通函數(shù)友元函數(shù):

       a) 目的:使普通函數(shù)能夠訪問類的友元

       b) 語法:聲明位置:公有私有均可,常寫為公有

                        聲明: friend + 普通函數(shù)聲明

                        實(shí)現(xiàn)位置:可以在類外或類中

                        實(shí)現(xiàn)代碼:與普通函數(shù)相同(不加不用friend和類::

                        調(diào)用:類似普通函數(shù),直接調(diào)用

       c) 代碼:        

  1. class INTEGER  
  2. {    
  3. private:  
  4.     int num;  
  5. public:  
  6.     friend void Print(const INTEGER& obj);//聲明友元函數(shù)  
  7. };  
  8. void Print(const INTEGER& obj)//不使用friend和類::  
  9. {  
  10.     //函數(shù)體  
  11. }  
  12. void main()  
  13. {  
  14.     INTEGER obj;  
  15.     Print(obj);//直接調(diào)用  
  16. }  

2、類Y的所有成員函數(shù)都為類X友元函數(shù)—友元類

      a)目的:使用單個(gè)聲明使Y類的所有函數(shù)成為類X的友元

                        它提供一種類之間合作的一種方式,使類Y的對象可以具有類X和類Y的功能

                        具體來說:

                                前提:A是B的友元(=》A中成員函數(shù)可以訪問B中有所有成員,包括私有成員和公有成員--老忘)

                                    則:在A中,借助類B,可以直接使用~B . 私有變量~的形式訪問私有變量

      b)語法:聲明位置:公有私有均可,常寫為私有(把類看成一個(gè)變量)

                        聲明: friend + 類名---不是對象啊

                        調(diào)用:

      c)代碼:

  1. class girl;  
  2.   
  3. class boy  
  4. {    
  5. private:  
  6.     char *name;    
  7.     int age;    
  8. public:    
  9.     boy();  
  10.     void disp(girl &);     
  11. };    
  12.   
  13. void boy::disp(girl &x) //函數(shù)disp()為類boy的成員函數(shù),也是類girl的友元函數(shù)   
  14. {   
  15.     cout<<"boy's name is:"<<name<<",age:"<<age<<endl;//正常情況,boy的成員函數(shù)disp中直接訪問boy的私有變量  
  16.     cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;   
  17.     //借助友元,在boy的成員函數(shù)disp中,借助girl的對象,直接訪問girl的私有變量  
  18.     //正常情況下,只允許在girl的成員函數(shù)中訪問girl的私有變量  
  19. }  
  20.   
  21. class girl  
  22. {    
  23. private:  
  24.     char *name;    
  25.     int age;    
  26.     friend boy;   //聲明類boy是類girl的友元    
  27. public:    
  28.     girl();     
  29. };    
  30. void main()    
  31. {     
  32.     boy b;    
  33.     girl g;    
  34.     b.disp(g);  //b調(diào)用自己的成員函數(shù),但是以g為參數(shù),友元機(jī)制體現(xiàn)在函數(shù)disp中  
  35. }  

3、類Y的一個(gè)成員函數(shù)為類X的友元函數(shù)

      a)目的:使類Y的一個(gè)成員函數(shù)成為類X的友元

             具體而言:而在類Y的這個(gè)成員函數(shù)中,借助參數(shù)X,可以直接以X。私有變量的形式訪問私有變量

      b)語法:聲明位置:聲明在公有中 (本身為函數(shù))

                        聲明:friend + 成員函數(shù)的聲明

                        調(diào)用:先定義Y的對象y---使用y調(diào)用自己的成員函數(shù)---自己的成員函數(shù)中使用了友元機(jī)制

      c)代碼: 

  1. class girl;   
  2. class boy  
  3. {    
  4. private:  
  5.     char *name;    
  6.     int age;    
  7. public:    
  8.     boy();  
  9.     void disp(girl &);       
  10. };     
  11.    
  12. class girl  
  13. {  
  14. private:  
  15.     char *name;    
  16.     int age;    
  17. public:    
  18.     girl(char *N,int A);    
  19.     friend void boy::disp(girl &); //聲明類boy的成員函數(shù)disp()為類girl的友元函數(shù)    
  20. };    
  21.    
  22. void boy::disp(girl &x)    
  23. {     
  24.     cout<<"boy's name is:"<<name<<",age:"<<age<<endl;  //訪問自己(boy)的對象成員,直接訪問自己的私有變量    
  25.     cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;    
  26.     //借助友元,在boy的成員函數(shù)disp中,借助girl的對象,直接訪問girl的私有變量  
  27.     //正常情況下,只允許在girl的成員函數(shù)中訪問girl的私有變量    
  28. }    
  29. void main()    
  30. {     
  31.     boy b();    
  32.     girl g();    
  33.     b.disp(g);  }  

4、在模板類中使用友元operator<<(對<<運(yùn)算符的重載)

    a)使用方法:

在模板類中聲明:

  1. friend ostream& operator<< <>(ostream& cout,const MGraph<VexType,ArcType>& G);  

在模板類中定義:

  1. template<class VexType,class ArcType>  
  2. ostream& operator<<(ostream& cout,const MGraph<VexType,ArcType>& G)  
  3. {  
  4.     //函數(shù)定義  
  5. }  

    b)注意:

把函數(shù)聲明非模板函數(shù):

  1. friend ostream& operator<< (ostream& cout,const MGraph& G);  

把函數(shù)聲明為模板函數(shù):

  1. friend ostream& operator<< <>(ostream& cout,const MGraph<VexType,ArcType>& G);  

或:

  1. friend ostream& operator<< <VexType,ArcType>(ostream& cout,const MGraph<VexType,ArcType>& G);  

說明:
 在函數(shù)聲明中加入operator<< <>:是將operator<<函數(shù)定義為函數(shù)模板,將函數(shù)模板申明為類模板的友員時(shí),是一對一綁定的
 實(shí)際的聲明函數(shù):這里模板參數(shù)可以省略,但是尖括號不可以省略

  1. friend ostream& operator<< <VexType,ArcType>(ostream& cout,const MGraph<VexType,ArcType>& G);  

5、友元函數(shù)和類的成員函數(shù)的區(qū)別:成員函數(shù)有this指針,而友元函數(shù)沒有this指針。

6、記憶:A是B的友元《=》A是B的朋友《=》借助B的對象,在A中可以直接 通過B。成員變量(可以是公有,也可以為私有變量) 的方式訪問B 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产一级片内射视频免费播放| 99久久精品一区二区国产| 日韩人妻毛片中文字幕| 欧美又黑又粗大又硬又爽| 国产老熟女超碰一区二区三区| 国产中文另类天堂二区| 亚洲一区二区三区一区| 国产又色又爽又黄又免费 | 91天堂免费在线观看| 视频一区二区三区自拍偷| 又大又紧又硬又湿又爽又猛| 欧美黑人暴力猛交精品| 亚洲欧洲一区二区综合精品| 在线日韩欧美国产自拍| 九九热这里有精品20| 极品熟女一区二区三区| 日韩毛片视频免费观看| 黑色丝袜脚足国产一区二区| 国产丝袜女优一区二区三区| 国产老熟女超碰一区二区三区| 国产又爽又猛又粗又色对黄| 国产日产欧美精品视频| 日韩人妻欧美一区二区久久| 天堂网中文字幕在线视频| 99精品人妻少妇一区二区人人妻| 日木乱偷人妻中文字幕在线| 亚洲日本韩国一区二区三区| 又黄又硬又爽又色的视频| 91欧美日韩中在线视频| 日本午夜福利视频免费观看| 日本人妻精品中文字幕不卡乱码| 日韩精品成区中文字幕| 丝袜美女诱惑在线观看| 久久精品久久精品中文字幕| 免费高清欧美一区二区视频| 亚洲综合精品天堂夜夜| 国产一区二区熟女精品免费| 国产韩国日本精品视频| 成人午夜在线视频观看| 狠狠干狠狠操亚洲综合| 国产又粗又深又猛又爽又黄|