• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            分享知識(shí)

            與大家一起分享知識(shí)

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              19 Posts :: 3 Stories :: 45 Comments :: 0 Trackbacks

            在C++中,如果以一個(gè)類想允許不屬于當(dāng)前類的成員函數(shù)訪問該結(jié)構(gòu)中的私有或保護(hù)數(shù)據(jù)時(shí),那該怎么辦呢?
            這時(shí)可以用上friend這個(gè)關(guān)鍵字。例如:
            class A;//Declaration

            class B
            {
            public:
            ?void fun(A *a);
            };

            class A
            {
            private:
            ?int i;
            public:
            ?void initialize();
            ?class D
            {
            ?private:
            ??? A *h;
            ?public:
            ????void initialize();
            ?}
            ?friend void g(A *a,int i);
            ?friend void B::fun(A *a);
            ?friend class C;
            ?friend void h();
            ?friend A::D;
            };

            void X::initialize()
            {
            ?i = 0;
            }

            void g(A *a,int i)//全局函數(shù)g直接訪問了類A的私有成員
            {
            ?a->i = i;
            }

            void B::fun(A *a)//類B的成員函數(shù)直接訪問了類A的私有成員
            {
            ?a->i = 47;
            }

            class C
            {
            private:
            ?int j;
            public:
            ?void initialize()
            ?void g(A *a);
            };

            void C::initialize()
            {
            ?j = 99;
            }

            void C::g(A *a)//類C的成員函數(shù)g直接訪問了類A的私有成員
            {
            ?a->i = j;
            }

            void h()//全局函數(shù)h直接訪問了類A的私有成員
            {
            ?A a;
            ?a.i = 100;//
            }

            void A::D::initialize()//訪問A的私有變量i
            {
            ???h->i = 10;
            }

            void main()
            {
            ?A a;
            ?C c;
            ?c.g(&a);
            }

            通過上面的例子,我們可以看到直接訪問類A的私有成員i的方法。但是,由此我想到,
            當(dāng)我們發(fā)布我們自己的C++庫(kù)的時(shí)候,比如我們有這樣一個(gè)庫(kù)(含有tools.h,tools.lib,tools.dll三個(gè)文件)
            頭文件定義:
            class CTools
            {
            private:
            ?int m_nId;
            ?int m_nSize;
            ?...
            public:
            ?...
            };
            我們的目的想讓像m_nId,m_nSize這樣的私有變量隱藏起來,但是有一個(gè)用戶在使用我這個(gè)庫(kù)的時(shí)候,
            只要他用friend關(guān)鍵字稍作修改就可以直接訪問我們的私有變量了。如下:
            class CTools
            {
            ????friend class CUser;
            ?private:
            ????int m_nId;
            ????int m_nSize;
            ????...
            public:
            ????...
            };
            這樣的話,friend關(guān)鍵字是不是跟我們最初想把一些東西封裝和隱藏起來相矛盾呢?

            posted on 2006-04-03 15:06 史傳紅 閱讀(552) 評(píng)論(2)  編輯 收藏 引用 所屬分類: C/C++細(xì)節(jié)知識(shí)

            Feedback

            # 謝謝 2006-04-05 09:29 甘霖
            偶是個(gè)初學(xué)者,給了我一些幫助,相當(dāng)感謝樓主。  回復(fù)  更多評(píng)論
              

            # re: 對(duì)C++中友元的思考 2007-10-29 22:22 范圍
            感謝,很有幫助啊!!!  回復(fù)  更多評(píng)論
              

            久久久久久亚洲精品不卡| 久久国产免费| 国产成人精品免费久久久久| 精品无码久久久久久尤物| 国产精品99久久久久久董美香 | 欧美性猛交xxxx免费看久久久| 久久只这里是精品66| 久久国产精品无码HDAV| 久久国产福利免费| 久久精品aⅴ无码中文字字幕不卡| 久久久久18| 久久国产精品成人免费 | 一本久久a久久精品综合夜夜| 亚洲国产精品成人AV无码久久综合影院 | 久久久无码精品午夜| 99精品久久精品| 亚洲中文字幕久久精品无码APP| 韩国无遮挡三级久久| 精品多毛少妇人妻AV免费久久 | 热re99久久6国产精品免费| 久久艹国产| 国产精品亚洲美女久久久| 好属妞这里只有精品久久| 伊人久久综合无码成人网| 亚洲精品乱码久久久久久蜜桃| 久久香蕉综合色一综合色88| 精品久久无码中文字幕| 亚洲中文久久精品无码ww16 | 国产精品久久久福利| 亚洲欧洲日产国码无码久久99| 伊人久久精品影院| 久久久久久精品成人免费图片| 国产亚洲成人久久| 久久精品国产一区二区| 久久久久国色AV免费观看 | 亚洲va久久久噜噜噜久久男同 | 久久中文字幕人妻熟av女| 久久综合久久伊人| 久久精品国产99久久香蕉| 超级碰久久免费公开视频| 国产叼嘿久久精品久久|