1. 程式人生 > 其它 >C++友元的概念和使用的一些介紹

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  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

推薦閱讀

【1】C++的智慧指標你瞭解嗎?

【2】嵌入式底層開發的軟體框架簡述

【3】CPU中的程式是怎麼執行起來的 必讀

【4】cartographer環境建立以及建圖測試

【5】設計模式之簡單工廠模式、工廠模式、抽象工廠模式的對比

本公眾號全部原創乾貨已整理成一個目錄,回覆[ 資源 ]即可獲得。