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指標,因此必須將物件名或物件的引用作為友元函式的引數,並在函式體中使用運算子 來訪問...