友元提供了不同類的成員函式之間、類的成員函式與一般函式之間進行資料共享的機制。通過友元,乙個不同函式或另乙個類中的成員函式可以訪問類中的私有成員和保護成員。c++中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。
友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝性和資料的隱藏性,導致程式可維護性變差。
友元提供了不同類的成員函式之間、類的成員函式與一般函式之間進行資料共享的機制。通過友元,乙個不同函式或另乙個類中的成員函式可以訪問類中的私有成員和保護成員。c++中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。
友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝性和資料的隱藏性,導致程式可維護性變差。
友元函式 :
友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:
friend 型別 函式名(形式引數);
友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。
乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。
友元函式的呼叫與一般函式的呼叫方式和原理一致。
友元類 :
友元類的所有成員函式都是另乙個類的友元函式,都可以訪問另乙個類中的隱藏資訊(包括私有成員和保護成員)。
當希望乙個類可以訪問另乙個類的私有成員時,可以將該類宣告為另一類的友元類。定義友元類的語句格式如下:
friend class 類名;
其中:friend和class是關鍵字,類名必須是程式中的乙個已定義過的類。
1: #include
2: using namespace std;
3:4: class radius
5: 13: ~radius()
14:
16:17: private:
18: int r;
19: };
20:21: void show_r(radius &n)
22: ;
screen 類的非公有成員現在可以被window 的每個成員函式訪問。
使用友元類時注意:
(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定是類b的友元,要看在類中是否有相應的宣告。
(3) 友元關係不具有傳遞性。若類b是類a的友元,類c是b的友元,類c不一定是類a的友元,同樣要看類中是否有相應的申明友元函式 :
友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:
friend 型別 函式名(形式引數);
友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。
乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。
友元函式的呼叫與一般函式的呼叫方式和原理一致。
友元類 :
友元類的所有成員函式都是另乙個類的友元函式,都可以訪問另乙個類中的隱藏資訊(包括私有成員和保護成員)。
當希望乙個類可以訪問另乙個類的私有成員時,可以將該類宣告為另一類的友元類。定義友元類的語句格式如下:
friend class 類名;
其中:friend和class是關鍵字,類名必須是程式中的乙個已定義過的類。
1: #include
2: using namespace std;
3: 4: class radius
5: 13: ~radius()
14:
16:
17: private:
18: int r;
19: };
20:
21: void show_r(radius &n)
22:
25:
26: class circle
27:
30: ~circle(){}
31: double area(radius a)
32:
36: private:
37: double s;
38: };
39:
40: int main(int argc, char *argv)
41:
被宣告兩個類的友元宣告
如果我們決定乙個函式必須被宣告為兩個類的友元則友元宣告如下
1: class window; // 只宣告
2: 3: class screen
4: 5: ;
12:
13: class window
14:
15: ;
作為乙個類的函式又是另乙個類的友元
如果我們決定該函式必須作為乙個類的成員函式並又是另乙個類的友元,則成員函式宣告和友元宣告如下:
1: class window;
2: 3: class screen
4: 5: ;
16:
17: class window
18:
19: ;
只有當乙個類的定義已經被看到時它的成員函式才能被宣告為另乙個類的友元。這並不總是能夠做到的。
例如如果screen 類必須把window 類的成員函式宣告為友元,而window類必須把screen 類的成員函式宣告為友元。該怎麼辦呢?在這種情況下可以把整個window類宣告為screen 類的友元。
例如:1: class window;
2: 3: class screen
4: 5: ;
screen 類的非公有成員現在可以被window 的每個成員函式訪問。
使用友元類時注意:
(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定是類b的友元,要看在類中是否有相應的宣告。
(3) 友元關係不具有傳遞性。若類b是類a的友元,類c是b的友元,類c不一定是類a的友元,同樣要看類中是否
乙個類作為另乙個類的資料成員
寫程式的時候希望乙個類能夠訪問另乙個類的資料成員 protected,private 例如類a要訪問類b中的資料成員。1.保持封裝性 可以通過在被訪問的類 b 中定義訪問許可權為public的函式,用來返回資料成員的引用。2.繼承 當乙個派生類從父類繼承時,父類的所有成員就成為子類的成員,因此可以將...
C 乙個類呼叫另乙個類的成員變數 成員函式
有時候,兩個類之間並沒有繼承的關係,但是其中乙個類需要引用另乙個類中的成員變數或者成員函式。怎樣辦到呢?假設已經新建了兩個類a b。class a class b 現在需要在類a的成員函式中呼叫類b的成員變數b nadd b x,使得a nadd與b nadd相加,那麼只需要在類a的.cpp檔案中包...
C 中乙個類成員函式呼叫另乙個類成員的方法
在繼承之外,在c 中乙個類成員函式呼叫另乙個類成員的方法主要有 類的組合,友元類,類的前向宣告,單例模式等,下面主要講講這4種方法的實現 組合通俗來講就是類b有類a的屬性,如宣告乙個person類,再宣告乙個teacher類,person類物件有年齡和姓名成員,而teacher類物件成員也有年齡和姓...