![](http://static.javashuo.com/static/loading.gif)
前言
上一章節主要是詳細介紹了const成員和static成員。不清楚的能夠回顧一下哦。本章節主要針對於C++中的友元作一個詳細介紹。編程
![](http://static.javashuo.com/static/loading.gif)
友元
友元(frend)機制容許一個類將對其非公有成員的訪問權授予指定的函數或者類,友元的聲明以friend開始,它只能出如今類定義的內部,友元聲明能夠出如今類中的任何地方。友元能夠是一個函數,該函數被稱爲友元函數;友元也能夠是一個類,該類被稱爲友元類,在這種狀況下,整個類及其全部成員都是友元。微信
![](http://static.javashuo.com/static/loading.gif)
友元函數app
友元函數的使用,由於友元函數沒有this指針,則參數要有三種狀況: 編輯器
要訪問非static成員時,須要對象作參數。函數
訪問static成員或全局變量時,則不須要對象作參數。學習
全局對象則不須要對象作參數。測試
能夠直接調用友元函數,不須要經過對象或指針。this
在友元函數中對象或者指針才具備無視權限限定的特權url
測試學習代碼以下:spa
![](http://static.javashuo.com/static/loading.gif)
使類B中的成員函數成爲類A的友元函數,這樣類B的該成員函數就能夠訪問類A的全部成員了。
當用到友元成員函數時,需注意友元聲明和友元定義之間的相互依賴,在該例子中,類B必須先定義,不然類A就不能將一個B的函數指定爲友元。然而,只有在定義了類A以後,才能定義類B的該成員函數。更通常的講,必須先定義包含成員函數的類,才能將成員函數設爲友元。另外一方面,沒必要預先聲明類和非成員函數來將它們設爲友元。
以下測試代碼:
![](http://static.javashuo.com/static/loading.gif)
友元類
友元類的全部成員函數都是另外一個類的友元函數,均可以訪問另外一個類中的隱藏信息(包括私有成員和保護成員)。當但願一個類能夠存取另外一個類的私有成員時,能夠將該類聲明爲另外一類的友元類。
關於友元類的注意事項:
友元關係不能被繼承。
友元關係是單向的。
友元關係不具備傳遞性。
如一下測試代碼:
![](http://static.javashuo.com/static/loading.gif)
尾言
容許某些特定的非成員函數訪問一個類的私有成員(及受保護成員),而同時仍阻止通常的訪問的狀況下,友元是可用的。
優勢:
1.靈活實現訪問若干類私有或受保護成員才能完成的任務;
2.便於與不支持類的語言(如C語言、彙編等)進行混合編程;
3.更天然地使用C++語言的IO流庫。
缺點:一個類將對其非公有成員的訪問權限授予其餘函數或者類,會破壞該類的封裝性,下降該類的可靠性和可維護性。
本文分享自微信公衆號 - C語言編程基礎(goodStudyCode)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。