小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C++ 友元關(guān)系

 tianht 2016-05-31

在封裝中C++類數(shù)據(jù)成員大多情況是private屬性;但是如果接口采用多參數(shù)實(shí)現(xiàn)肯定影響程序效率;然而這時候如果外界需要頻繁訪問這些私有成員,就不得不需要一個既安全又理想的“后門”——友元關(guān)系;

C++中提供三種友元關(guān)系的實(shí)現(xiàn)方式,友元函數(shù)、友元成員函數(shù)、友元類。

友元函數(shù):既將一個普通的函數(shù)在一個類中說明為一個friend屬性;其定義(大多數(shù)會訪問該類的成員)應(yīng)在類后;

友元成員函數(shù):既然是成員函數(shù),那么肯定這個函數(shù)屬于某個類,對了就是因?yàn)檫@個函數(shù)是另外一個類的成員函數(shù),有時候因?yàn)槲覀兿胗靡粋€類通過一個接口去訪問另外一個類的信息,然而這個信息只能是被它授權(quán)的類才能訪問;那么也需要用friend去實(shí)現(xiàn);這個概念只是在聲明的時候稍有變化;

友元類:友元類聲明會將整個類說明成為另一個類的友元關(guān)系;和之前兩種的區(qū)別是集體和個人的區(qū)別;友元類的所有成員函數(shù)都可以是另一個類的友元函數(shù);

值得注意的是友元關(guān)系是單向的,有點(diǎn)像我們戀愛中出現(xiàn)的單相思 O(∩_∩)O,單向關(guān)系就是說如果A被說明成B的友元關(guān)系,那么只能說A是B的友元,并不代表B是A的友元;其次在多數(shù)情況下友元關(guān)系的函數(shù)都會訪問它被說明中類的成員,這時候應(yīng)該將函數(shù)定義在類的后面;

下面給一個簡單的例程代碼;

 

復(fù)制代碼
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class B;
 6 
 7 class A{
 8     private:
 9         int x;
10     public:
11         A();
12         void display(B &);
13 };
14 
15 class C;
16 
17 class B{
18     private:
19         int y;
20         int z;
21     public:
22         B();
23         B(intint);
24     friend void A::display(B &);//友元成員函數(shù)
25     friend void display(B &);//友元函數(shù)
26     friend class C;//友元類
27 };
28 
29 class C{
30     private:
31         int sum;
32         void calc(B &);
33     public:
34         C();
35         void display(B &);
36 };
37 
38 //必須在友元關(guān)系的類后進(jìn)行定義
39 void display(B &v)//友元函數(shù)
40 {
41     cout << v.y << " " << v.z << endl;
42 }
43 
44 A::A()
45 {
46     this->= 0;
47 }
48 
49 void A::display(B &v)//友元成員函數(shù)
50 {
51     this->= v.y + v.z;
52     cout << this-><< endl;
53 }
54 
55 B::B()
56 {
57     this->= 0;
58     this->= 0;
59 }
60 
61 B::B(int y, int z)
62 {
63     this->= y;
64     this->= z;
65 }
66 
67 C::C()
68 {
69     sum = 0;
70 }
71 
72 void C::display(B &v)
73 {
74     this->calc(v);
75     cout << sum << " = " << v.y << " + " << v.z << endl;
76 }
77 
78 void C::calc(B &v)
79 {
80     sum = v.y + v.z;
81 }
82 
83 int main()
84 {
85     A a;
86     B b(23);
87     display(b);
88     a.display(b);
89     C c;
90     c.display(b);
91     
92     return 0;
93 }
94 
復(fù)制代碼

    本站是提供個人知識管理的網(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ā)表

    請遵守用戶 評論公約

    類似文章 更多