久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 Home of heart 2011-11-09
 

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

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

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

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

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

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

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

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

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

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

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

       因為友元函數(shù)沒有this指針,,則參數(shù)要有三種情況:

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

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

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

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

       因為友元函數(shù)是類外的函數(shù),,所以它的聲明可以放在類的私有段或公有段且沒有區(qū)別,。

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

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

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

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

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

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

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

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

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

                        實現(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)目的:使用單個聲明使Y類的所有函數(shù)成為類X的友元

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

                        具體來說:

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

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

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

                        聲明: 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的一個成員函數(shù)為類X的友元函數(shù)

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

             具體而言:而在類Y的這個成員函數(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ù)可以省略,,但是尖括號不可以省略

  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 

    本站是提供個人知識管理的網(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)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多