友元函式和友元類
友元函式和友元類
採用類的機制後實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的,依此提供類與外界間的通訊介面。但是,有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式外,還有友元類,兩者統稱為友元。友元的作用是提高了程式的執行效率(即減少了型別檢查和安全性檢查等都需要時間開銷),但它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。
友元函式:
友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:
friend 型別 函式名(形式引數);
友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的一個友元函式。
一個函式可以是多個類的友元函式,只需要在各個類中分別宣告。
友元函式的呼叫與一般函式的呼叫方式和原理一致。
友元類:
友元類的所有成員函式都是另一個類的友元函式,都可以訪問另一個類中的隱藏資訊(包括私有成員和保護成員)。
當希望一個類可以存取另一個類的私有成員時,可以將該類宣告為另一類的友元類。定義友元類的語句格式如下:
friend class 類名;
其中:friend和class是關鍵字,類名必須是程式中的一個已定義過的類。
例如,以下語句說明類B是類A的友元類:
class A
{
…
public:
friend class B;
…
};
經過以上說明後,類B的所有成員函式都是類A的友元函式,能存取類A的私有成員和保護成員。
使用友元類時注意:
(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的宣告。
(3) 友元關係不具有傳遞性。若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明
相關文章
- 友元函式的使用方法函式
- C++類將函式模板宣告為友元 例項C++函式
- C++ 友元C++
- C++友元C++
- C++名稱空間與友元函式薦C++函式
- 關於友元函式過載輸入輸出運算子函式
- C++中的友元C++
- C++——內聯,友元C++
- 其他成員與友元
- c++單例模式、常量成員函式、引數傳遞、友元C++單例模式函式
- 15、C++ Primer 4th 筆記,類和資料抽象,友元C++筆記抽象
- YTU-OJ-Problem K: 熟悉題型——程式碼完善(輸出日期時間--友元函式)函式
- 理解神經元和函式函式
- 《C++ Primer Plus》15.1 友元 學習筆記C++筆記
- 面試驅動技術之 - isa && 元類 && 函式呼叫面試函式
- 面試驅動技術之 – isa && 元類 && 函式呼叫面試函式
- 一元、二元函式影象繪製函式
- 華碩X99-DELUXE II售3999元 發燒友必備UX
- 日曆函式單元 (轉)函式
- 友聯
- 友鏈
- 友鏈~
- 小米:Air比一元硬幣還薄! 遭眾網友調侃盤點AI
- IOS 友盟iOS
- 友鏈 & orz
- 你好,小友!
- 元類:Metaclass
- 類函式和物件函式 PHP函式物件PHP
- 餘額寶資產規模突破萬億元 網友:有錢人都不用工作了!
- 打破次元壁!《蛋仔派對》“超燃蛋友會”主題活動火爆開啟
- 敏捷和DevOps:是敵是友?敏捷dev
- 段友福利:Python爬取段友之家貼吧圖片和小視訊Python
- Python 元類Python
- 元類詳解
- 23. 元類
- 遞迴、三元表示式、生成式(列表,字典)、匿名函式遞迴函式
- 函式模版和類模版函式
- 仿函式是什麼?仿函式什麼時候必須繼承一元或者二元謂詞函式繼承