C 友元函式與友元類

2022-09-01 17:21:13 字數 2270 閱讀 6689

c++友元函式與友元類

允許特定的函式訪問乙個類的私有成員,一般直接在類中直接宣告函式就能簡單做到。但需要允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問就需要友元(friend)函式來解決。

一,概念提出:什麼是友元?

友元(friend)機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友元宣告可以出現在類中的任何地方:友元不是授予友元關係的那個類的成員,所以它們不受其宣告出現部分的訪問控制影響。通常,將友元宣告成組地放在類定義的開始或結尾是個好的方法。

二,使用方法:如何使用友元?

下面我們在兩方面介紹友元機制的使用

友元函式 :

友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:

1 friend 型別 函式名(形式引數);
友元類 :

友元類的所有成員函式都是另乙個類的友元函式,都可以訪問另乙個類中的隱藏資訊(包括私有成員和保護成員)。       

當希望乙個類可以訪問另乙個類的私有成員時,可以將該類宣告為另一類的友元類。定義友元類的語句格式如下:

1 friend class 類名;
三,實驗與驗證:如何運用友元?

下面我們通過乙個簡單的實驗來**友元函式的用法

例子:首先定義乙個點類(point) , 現在如何求兩點之間的距離?

**如下:

1 #include2 #include3

4using

namespace

std;

5class

point //

建構函式

7 friend double pointdistance(point &a, point &b);//

宣告友元函式

8private:9

intx, y;

1011

};12

13double pointdistance(point &a,point &b)

1920

21int

main()

22

執行結果:

友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。

乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。

友元函式的呼叫與一般函式的呼叫方式和原理一致。

下面我們通過乙個簡單的實驗來**友元類的用法

例子:設計乙個程式老師(類)通過類的友元修改學生(類)的私有資料

**如下:

1 #include 2 #include

3using

namespace

std;45

class

student613

void

init_info()

1424

void

print_info()

2529 friend class

teacher;

30private:31

string

id, name;

32};

3334

class

teacher

3549

void

check_stu_info()

5053

private:54

student s;

55};

5657

intmain()

58

執行結果:

friend和class是關鍵字,類名必須是程式中的乙個已定義過的類。

友元關係不可傳遞,不能繼承,是單向的。

友元類是為了訪問類的私有和保護成員。

使類b中的成員函式成為類a的友元函式,這樣類b的該成員函式就可以訪問類a的所有成員。

四,友元的缺點

類本身的就有封裝的作用,而友元的作用正好相反,類將對其非公有成員的訪問許可權授予其他函式或者類,會破壞該類的封裝性,降低該類的可靠性和可維護性。

c 友元函式與友元類

友元函式和友元類的需要 類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢...

c 友元函式與友元類

友元函式和友元類的需要 類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢...

C 友元函式與友元類

友元函式 友元的作用是提高程式的執行效率,但是由於它可以直接訪問類的私有和保護成員,因此破壞了類的封裝性,應謹慎使用。注意 1 其函式體可以在類內定義,也可以在類外定義。2 友元函式不是類的成員函式,它不帶有this指標,因此必須將物件名或物件的引用作為友元函式的引數,並在函式體中使用運算子 來訪問...