C++友元的概念和使用的一些介紹
前言:
在C++中,我們使用類對資料進行了隱藏和封裝,類的資料成員一般都定義為私有成員,成員函式一般都定義為公有的,以此提供類與外界的通訊介面。
但是,有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。
除了友元函式外,還有友元類,兩者統稱為友元。
友元的作用是提高了程式的執行效率(即減少了型別檢查和安全性檢查等都需要時間開銷),但它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。
作者:良知猶存
轉載授權以及圍觀:歡迎關注微信公眾號:羽林君
或者新增作者個人微信:become_me
友元函式:
元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,例子如下:
#include <iostream> class A{ private: int value; public: A(int _value):value(_value){} void setValue(int value_) { value = value_; } int getValue() { return value; } friend void printfValue(A a); }; void printfValue(A a) { std::cout<< "value = " <<a.value<<std::endl; } int main(int argc, char** argv) { A temp_a(3); printfValue(temp_a); }
友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的一個友元函式。一個函式可以是多個類的友元函式,只需要在各個類中分別宣告。友元函式的呼叫與一般函式的呼叫方式和原理一致。
友元類:
友元類的所有成員函式都是另一個類的友元函式,都可以訪問另一個類中的隱藏資訊(包括私有成員和保護成員)。
當希望一個類可以存取另一個類的私有成員時,可以將該類宣告為另一類的友元類。示例如下:
#include <iostream> class B; class A{ private: int value; public: A(int _value):value(_value){} void setValue(int value_) { value = value_; } int getValue() { return value; } friend class B; }; class B { public: void printValue(A a) { std::cout<< "value = " <<a.value<<std::endl; } }; int main(int argc, char** argv) { A temp_a(3); B temp_b; temp_b.printValue(temp_a); }
建議:
友元函式我一般都是過載運算子<< 進行一些資料的列印操作。
friend std::ostream &operator<<(std::ostream &os, const A &a);
{
std::cout<< "value = " << a.value << std::endl;
}
而友元類比較少用。不過現在使用過程中,處理器越來越快,C++標準也一直優化,而友元帶給我們的優點無限變小。所以在實際程式碼中,不建議大家使用友元方法,因為它破壞類的封裝來說,是很不好的。所以本文僅做分享,不建議大家使用。
結語
這就是我分享的c++友元的一些操作,如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。
作者:良知猶存,白天努力工作,晚上原創公號號主。公眾號內容除了技術還有些人生感悟,一個認真輸出內容的職場老司機,也是一個技術之外豐富生活的人,攝影、音樂 and 籃球。關注我,與我一起同行。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
推薦閱讀
【3】CPU中的程式是怎麼執行起來的 必讀
本公眾號全部原創乾貨已整理成一個目錄,回覆[ 資源 ]即可獲得。