C++中存在一種朋友關系,這種朋友關系如果體現在函式上,那么我們就稱之為友元函式;如果體現在類上,我們就稱之為友元類,
1.友元函式
友元函式是指某些雖然不是類成員函式卻能夠訪問類的所有成員的函式,類授予它的友元特別的訪問權,這樣該友元函式就能訪問到類中的所有成員,
1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 public: 8 friend void set_show(int x, A &a); //該函式是友元函式的宣告 9 private: 10 int data; 11 }; 12 13 void set_show(int x, A &a) //友元函式定義,為了訪問類A中的成員 14 { 15 a.data =https://www.cnblogs.com/loliconinvincible/p/ x; 16 cout << a.data << endl; 17 } 18 int main(void) 19 { 20 class A a; 21 22 set_show(1, a); 23 24 return 0; 25 }
2、友元類
友元類的所有成員函式都是另一個類的友元函式,都可以訪問另一個類中的隱藏資訊(包括私有成員和保護成員),當希望一個類可以存取另一個類的私有成員時,可以將該類宣告為另一類的友元類,
關于友元類的注意事項:
(1) 友元關系不能被繼承,
(2) 友元關系是單向的,不具有交換性,若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的宣告,
(3) 友元關系不具有傳遞性,若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明,
1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 public: 8 friend class C; //這是友元類的宣告 9 private: 10 int data; 11 }; 12 13 class C //友元類定義,為了訪問類A中的成員 14 { 15 public: 16 void set_show(int x, A &a) { a.data = https://www.cnblogs.com/loliconinvincible/p/x; cout<endl;} 17 }; 18 19 int main(void) 20 { 21 class A a; 22 class C c; 23 24 c.set_show(1, a); 25 26 return 0; 27 }

友元小結:
在需要允許某些特定的非成員函式訪問一個類的私有成員(及受保護成員),而同時仍阻止一般的訪問的情況下,友元是可用的,
優點:
可以靈活地實作需要訪問若干類的私有或受保護的成員才能完成的任務;
便于與其他不支持類概念的語言(如C語言、匯編等)進行混合編程;
通過使用友元函式多載可以更自然地使用C++語言的IO流庫,
缺點:
一個類將對其非公有成員的訪問權限授予其他函式或者類,會破壞該類的封裝性,降低該類的可靠性和可維護性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/52946.html
標籤:C++

