日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

友元函数友元类

發布時間:2024/9/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 友元函数友元类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://blog.csdn.net/insistgogo/article/details/6608672

1、為什么要引入友元函數:在實現類之間數據共享時,減少系統開銷,提高效率

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

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

????? 優點:能夠提高效率,表達簡單、清晰

??????缺點:友元函數破環了封裝機制,盡量不使用成員函數,除非不得已的情況下才使用友元函數。

2、什么時候使用友元函數:

??????1)運算符重載的某些場合需要使用友元。

??????2)兩個類要共享數據的時候

3、怎么使用友元函數:

友元函數的參數:

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

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

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

???????3、? 如果做參數的對象是全局對象,則不需要對象做參數

友元函數的位置:

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

友元函數的調用:

???????可以直接調用友元函數,不需要通過對象或指針

友元函數的分類:

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

1、普通函數友元函數:

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

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

??????????????????????? 聲明: friend?+ 普通函數聲明

??????????????????????? 實現位置:可以在類外或類中

??????????????????????? 實現代碼:與普通函數相同(不加不用friend和類::

??????????????????????? 調用:類似普通函數,直接調用

???????c)?代碼:????????

[cpp]?view plaincopyprint?
  • class?INTEGER??
  • {????
  • private:??
  • ????int?num;??
  • public:??
  • ????friend?void?Print(const?INTEGER&?obj);//聲明友元函數??
  • };??
  • void?Print(const?INTEGER&?obj)//不使用friend和類::??
  • {??
  • ????//函數體??
  • }??
  • void?main()??
  • {??
  • ????INTEGER?obj;??
  • ????Print(obj);//直接調用??
  • }??
  • 2、類Y的所有成員函數都為類X友元函數—友元類

    ??????a)目的:使用單個聲明使Y類的所有函數成為類X的友元

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

    ??????????????????????? 具體來說:

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

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

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

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

    ??????????????????????? 調用:

    ????? c)代碼:

    [cpp]?view plaincopyprint?
  • class?girl;??
  • ??
  • class?boy??
  • {????
  • private:??
  • ????char?*name;????
  • ????int?age;????
  • public:????
  • ????boy();??
  • ????void?disp(girl?&);?????
  • };????
  • ??
  • void?boy::disp(girl?&x)?//函數disp()為類boy的成員函數,也是類girl的友元函數???
  • {???
  • ????cout<<"boy's?name?is:"<<name<<",age:"<<age<<endl;//正常情況,boy的成員函數disp中直接訪問boy的私有變量??
  • ????cout<<"girl's?name?is:"<<x.name<<",age:"<<x.age<<endl;???
  • ????//借助友元,在boy的成員函數disp中,借助girl的對象,直接訪問girl的私有變量??
  • ????//正常情況下,只允許在girl的成員函數中訪問girl的私有變量??
  • }??
  • ??
  • class?girl??
  • {????
  • private:??
  • ????char?*name;????
  • ????int?age;????
  • ????friend?boy;???//聲明類boy是類girl的友元????
  • public:????
  • ????girl();?????
  • };????
  • void?main()????
  • {?????
  • ????boy?b;????
  • ????girl?g;????
  • ????b.disp(g);??//b調用自己的成員函數,但是以g為參數,友元機制體現在函數disp中??
  • }??
  • 3、類Y的一個成員函數為類X的友元函數

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

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

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

    ??????????????????????? 聲明:friend?+?成員函數的聲明

    ??????????????????????? 調用:先定義Y的對象y---使用y調用自己的成員函數---自己的成員函數中使用了友元機制

    ??????c)代碼:?

    [cpp]?view plaincopyprint?
  • 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的成員函數disp()為類girl的友元函數????
  • };????
  • ???
  • void?boy::disp(girl?&x)????
  • {?????
  • ????cout<<"boy's?name?is:"<<name<<",age:"<<age<<endl;??//訪問自己(boy)的對象成員,直接訪問自己的私有變量????
  • ????cout<<"girl's?name?is:"<<x.name<<",age:"<<x.age<<endl;????
  • ????//借助友元,在boy的成員函數disp中,借助girl的對象,直接訪問girl的私有變量??
  • ????//正常情況下,只允許在girl的成員函數中訪問girl的私有變量????
  • }????
  • void?main()????
  • {?????
  • ????boy?b();????
  • ????girl?g();????
  • ????b.disp(g);??}??
  • 4、在模板類中使用友元operator<<(對<<運算符的重載)

    ??? a)使用方法:

    在模板類中聲明:

    [cpp]?view plaincopyprint?
  • friend?ostream&?operator<<?<>(ostream&?cout,const?MGraph<VexType,ArcType>&?G);??
  • 在模板類中定義:

    [cpp]?view plaincopyprint?
  • template<class?VexType,class?ArcType>??
  • ostream&?operator<<(ostream&?cout,const?MGraph<VexType,ArcType>&?G)??
  • {??
  • ????//函數定義??
  • }??
  • ????b)注意:

    把函數聲明非模板函數:

    [cpp]?view plaincopyprint?
  • friend?ostream&?operator<<?(ostream&?cout,const?MGraph&?G);??
  • 把函數聲明為模板函數:

    [cpp]?view plaincopyprint?
  • friend?ostream&?operator<<?<>(ostream&?cout,const?MGraph<VexType,ArcType>&?G);??
  • 或:

    [cpp]?view plaincopyprint?
  • friend?ostream&?operator<<?<VexType,ArcType>(ostream&?cout,const?MGraph<VexType,ArcType>&?G);??
  • 說明:
    ?在函數聲明中加入operator<< <>:是將operator<<函數定義為函數模板,將函數模板申明為類模板的友員時,是一對一綁定的
    ?實際的聲明函數:這里模板參數可以省略,但是尖括號不可以省略

    [cpp]?view plaincopyprint?
  • friend?ostream&?operator<<?<VexType,ArcType>(ostream&?cout,const?MGraph<VexType,ArcType>&?G);??
  • 5、友元函數和類的成員函數的區別:成員函數有this指針,而友元函數沒有this指針。

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


    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的友元函数友元类的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。