<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # C++ 友元函數和友元類 > 原文: [https://www.programiz.com/cpp-programming/friend-function-class](https://www.programiz.com/cpp-programming/friend-function-class) #### 在本文中,您將學習在 C++ 中創建友元函數和類,并在程序中有效地使用它們。 OOP 的重要概念之一是數據隱藏,即[非成員函數](/cpp-programming/object-class "Non-member function object in C++")無法訪問對象的私有或受保護數據。 但是,有時這種限制可能迫使程序員編寫冗長而復雜的代碼。 因此,C++ 編程內置了一種機制,可以從非成員函數訪問私有或受保護的數據。 這是通過使用好友函數或/和好友類完成的。 * * * ## C++ 中的友元函數 如果將函數定義為友元函數,則可以使用[函數](/cpp-programming/function "C++ functions")訪問類的私有數據和受保護數據。 編譯器通過使用關鍵字`friend`知道給定的函數是友元函數。 為了訪問數據,應該在類的主體內部(可以在類內部的任何地方,無論是私有的還是公共的部分),從關鍵字`friend`開始聲明友元函數。 * * * ### C++ 中的友元函數聲明 ```cpp class class_name { ... .. ... friend return_type function_name(argument/s); ... .. ... } ``` 現在,您可以將友元函數定義為訪問該類數據的普通函數。 定義中未使用`friend`關鍵字。 ```cpp class className { ... .. ... friend return_type functionName(argument/s); ... .. ... } return_type functionName(argument/s) { ... .. ... // Private and protected data of className can be accessed from // this function because it is a friend function of className. ... .. ... } ``` * * * ### 示例 1:友元函數的工作原理 ```cpp /* C++ program to demonstrate the working of friend function.*/ #include <iostream> using namespace std; class Distance { private: int meter; public: Distance(): meter(0) { } //friend function friend int addFive(Distance); }; // friend function definition int addFive(Distance d) { //accessing private data from non-member function d.meter += 5; return d.meter; } int main() { Distance D; cout<<"Distance: "<< addFive(D); return 0; } ``` **輸出** ```cpp Distance: 5 ``` 在此,在`Distance`類內聲明了友元函數`addFive()`。 因此,可以從此函數訪問專用數據`meter`。 盡管此示例為您提供了有關友元函數概念的想法,但并未顯示任何有意義的用途。 當您需要對兩個不同類的對象進行操作時,將有一種更有意義的用法。 那時,友元函數會非常有幫助。 您絕對可以在不使用友元函數的情況下對不同類的兩個對象進行操作,但是該程序將很長,復雜且難以理解。 * * * ### 示例 2:使用友元函數相加兩個不同類的成員 ```cpp #include <iostream> using namespace std; // forward declaration class B; class A { private: int numA; public: A(): numA(12) { } // friend function declaration friend int add(A, B); }; class B { private: int numB; public: B(): numB(1) { } // friend function declaration friend int add(A , B); }; // Function add() is the friend function of classes A and B // that accesses the member variables numA and numB int add(A objectA, B objectB) { return (objectA.numA + objectB.numB); } int main() { A objectA; B objectB; cout<<"Sum: "<< add(objectA, objectB); return 0; } ``` **輸出** ```cpp Sum: 13 ``` 在此程序中,類`A`和`B`已將`add()`聲明為友元函數。 因此,該函數可以訪問兩個類的私有數據。 在這里,`add()`函數將兩個對象`objectA`和`objectB`的私有數據`numA`和`numB`相加,并將對象返回到`main`函數。 為了使該程序正常工作,應如上例所示對類類`B`進行前向聲明。 這是因為在類`A`中使用代碼`friend int add(A , B);`引用了類`B`。 * * * ## C++ 編程中的友元類 類似地,像友元函數一樣,也可以使用關鍵字`friend`將一個類變成另一個類的友元。 例如: ```cpp ... .. ... class B; class A { // class B is a friend class of class A friend class B; ... .. ... } class B { ... .. ... } ``` 當一個類成為好友類時,該類的所有成員函數都將成為好友函數。 在此程序中,類`B`的所有成員函數將成為類`A`的友元函數。 因此,類`B`的任何成員函數都可以訪問類`A`的私有數據和受保護的數據。但是,類`A`的成員函數不能訪問類`B`的數據。 請記住,C++ 中的友元關系僅被授予,而不被接受。
                  <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>

                              哎呀哎呀视频在线观看