<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 簡介 類的主要特點之一是數據隱藏,即類的私有成員無法在類的外部(作用域之外)訪問。但是,有時候需要在類的外部訪問類的私有成員,怎么辦? 解決方法是使用友元函數,友元函數是一種特權函數,c++允許這個特權函數訪問私有成員。 # 友元語法 * friend關鍵字只出現在聲明處 * 其他類、類成員函數、全局函數都可聲明為友元 * **友元函數不是類的成員,不帶this指針** * 友元函數可訪問對象任意成員屬性,包括私有屬性 ~~~ class Building; //友元類 class MyFriend{ public: //友元成員函數 void LookAtBedRoom(Building& building); void PlayInBedRoom(Building& building); }; class Building{ //全局函數做友元函數 friend void CleanBedRoom(Building& building); #if 0 //成員函數做友元函數 friend void MyFriend::LookAtBedRoom(Building& building); friend void MyFriend::PlayInBedRoom(Building& building); #else //友元類 friend class MyFriend; #endif public: Building(); public: string mSittingRoom; private: string mBedroom; }; void MyFriend::LookAtBedRoom(Building& building){ cout << "我的朋友參觀" << building.mBedroom << endl; } void MyFriend::PlayInBedRoom(Building& building){ cout << "我的朋友玩耍在" << building.mBedroom << endl; } //友元全局函數 void CleanBedRoom(Building& building){ cout << "友元全局函數訪問" << building.mBedroom << endl; } Building::Building(){ this->mSittingRoom = "客廳"; this->mBedroom = "臥室"; } int main(){ Building building; MyFriend myfriend; CleanBedRoom(building); myfriend.LookAtBedRoom(building); myfriend.PlayInBedRoom(building); system("pause"); return EXIT_SUCCESS; } ~~~ [友元類注意] 1. 友元關系不能被繼承。 2. 友元關系是單向的,類A是類B的朋友,但類B不一定是類A的朋友。 3. 友元關系不具有傳遞性。類B是類A的朋友,類C是類B的朋友,但類C不一定是類A的朋友。 # c++是純面向對象的嗎? 如果一個類被聲明為friend,意味著它不是這個類的成員函數,卻可以修改這個類的私有成員,而且必須列在類的定義中,因此他是一個特權函數。c++不是完全的面向對象語言,而只是一個混合產品。增加friend關鍵字只是用來解決一些實際問題,這也說明這種語言是不純的。畢竟c++設計的目的是為了實用性,而不是追求理想的抽象。 # 有元函數 ~~~ #define _CRT_SECURE_NO_WARNINGS #include <string> #include <iostream> using namespace std; class Building { //聲明這個全局函數為友元函數 friend void GoodGay(Building &bd); public: string keting; private: string woshi; public: Building() { keting = "客廳"; woshi = "臥室"; } }; void GoodGay(Building &bd) { cout << "---: " << bd.keting << endl; cout << "---: " << bd.woshi << endl; } void test01() { Building my; GoodGay(my); }; int main() { test01(); system("pause"); return EXIT_SUCCESS; } ~~~ # 有元類 ## 通過傳參訪問 ~~~ #define _CRT_SECURE_NO_WARNINGS #include <string> #include <iostream> using namespace std; class Building { //聲明類為有元類 friend class GoodF; public: string keting; private: string woshi; public: Building() { keting = "客廳"; woshi = "臥室"; } }; class GoodF { public: void func(Building &bd) { cout << "訪問: " << bd.keting << endl; cout << "訪問: " << bd.woshi << endl; } }; int main() { GoodF f; Building bd; f.func(bd); system("pause"); return EXIT_SUCCESS; } ~~~ ## 通過類內指針訪問 ~~~ #define _CRT_SECURE_NO_WARNINGS #include <string> #include <iostream> using namespace std; class Building { //聲明類為有元類 friend class GoodF; public: string keting; private: string woshi; public: Building() { keting = "客廳"; woshi = "臥室"; } }; class GoodF { public: Building* pbd; public: GoodF() { pbd = new Building; } //拷貝構造,防止調用默認拷貝,釋放的時候重復釋放同一空間 GoodF(const GoodF &f) { //申請空間,new的時候就有數據了,因為他里面的new就有了初始化 pbd = new Building; } void func() { cout << "訪問: " << pbd->keting << endl; cout << "訪問: " << pbd->woshi << endl; } ~GoodF() { cout << "析構函數" << endl; if (pbd != NULL) { delete pbd; } } }; int main() { GoodF f; f.func(); GoodF gf1 = f; gf1.func(); system("pause"); return EXIT_SUCCESS; } ~~~ # 類的另一個成員函數成為有元函數 ~~~ #define _CRT_SECURE_NO_WARNINGS #include <string> #include <iostream> using namespace std; //編譯器知道類的聲明不知道類的結構 //聲明類 class Building; class GoodF { public: void func(Building &bud); }; class Building { //那個類的成員函數 是這個類的友元函數 friend void GoodF::func(Building &bud); public: string keting; private: string woshi; public: Building() { keting = "客廳"; woshi = "臥室"; } }; void GoodF::func(Building &bud) { cout << "訪問: " << bud.keting << endl; cout << "訪問: " << bud.woshi << endl; } int main() { Building bud; GoodF gf; gf.func(bud); system("pause"); return EXIT_SUCCESS; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看