什麼場景下會用到友元函式,友元函式的作用是什麼,友元函式和普通成員函式又有怎樣的區別?這都是c++當中的一些基本概念,掌握好了無論是維護專案還是做專案開發都大有裨益。本文主要**一下c++中的友元函式,如有不足或者疏漏之處,煩請讀者朋友及時指出,大家一起改進。
一、概述
友元函式在實現類之間資料共享時,可以減少系統開銷,調高效率。比如:類a中的函式需要訪問類b中的成員,那麼類a中該函式要是類b的友元函式。
友元函式允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式。
二、使用場景
其實一些操作符的過載實現也是要在類外實現,通常宣告為類的友元。
結合上面所述,一般在以下兩個場景中會用到友元函式:
1、運算子過載的某些場合需要使用友元函式;
2、兩個類要共享資料的時候。
三、優缺點
1、優點:能夠提高效率,表達清晰、簡單;
2、缺點:破壞了類的封裝(盡量不要使用成員函式,除非不得已才使用友元函式)。
四、使用說明
1、友元函式是類外函式,宣告可以放在類的私有或者公有,且都沒有區別;
2、直接調用友元函式不需要通過物件或者指標;
3、友元函式沒有this指標,且不能被繼承;
4、友元函式宣告形式 friend + 普通函式宣告。
五、舉例說明
1、已知兩點座標,求兩點之間的距離
#include
#include
using namespace std;
class point
void getxy();
friend double distance(point &a, point &b);
protected:
private:
double x, y;
};void point::getxy()
double distance(point &a, point &b)
void main(void)
執行結果:
分析:在該程式中的point類中說明了乙個友元函式distance(),它在說明時前邊加friend關鍵字,標識它不是成員函式,而是友元函式。它的定義方法與普通函式定義一樣,而不同於成員函式的定義,因為它不需要指出所屬的類。但是,它可以引用類中的私有成員,函式體中的a.x,b.x,a.y,b.y都是類的私有成員,它們是通過物件引用的。在調用友元函式時,也是同普通函式的呼叫一樣,不要像成員函式那樣呼叫。本例中,p1.getxy()和p2.getxy()這是成員函式的呼叫,要用物件來表示。而distance(p1, p2)是友元函式的呼叫,它直接呼叫,不需要物件表示,它的引數是物件。
2、下面對上面例子輸出流過載,輸入輸出流過載需要用到友元函式
#include
#include
using namespace std;
class point
void getxy();
friend double distance(point &a, point &b);
friend ostream &operator 3、通過友元函式和友元類列印類的私有成員
分別定義乙個類a和類b ,各有乙個私有整數成員變數通過建構函式初始化,類a有乙個成員函式show(b &b)用來列印a和b的私有成員變數,分別通過友元函式和友元類來實現此功能。
#include
using namespace std;
class b
//default constructor
};class a
//default constructor
void show(b &b)
};void show(a& a, b& b)
void main()
上述例子中提到的預設建構函式
為什麼c 要引入友元函式?
例如 程式 表示為 a b 2.75可以等於a b.operator 2.75 但是 a 2.75 b 就不能寫成這樣 因為 operator 是成員函式 只有類的物件才能引用 a b 2.75這樣的寫法只有非成員函式才能這麼寫因為 a operaotor 2.75 b 但是由於大部分非成員函式 都...
為什麼要使用relu ReLu 啟用函式
引入relu的原因 第一,採用sigmoid等函式,算啟用函式時 指數運算 計算量大,反向傳播求誤差梯度時,求導涉及除法,計算量相對大,而採用relu啟用函式,整個過程的計算量節省很多。第二,對於深層網路,sigmoid函式反向傳播時,很容易就會出現 梯度消失 的情況 在sigmoid接近飽和區時,...
為什麼需要友元與友元的缺點
通常對於普通函式來說,要訪問類的保護成員是不可能的,如果想這麼做那麼必須把類的成員都生命成為public 共用的 然而這做帶來的問題遍是任何外部函式都可以毫無約束的訪問它操作它,c 利用friend修飾符,可以讓一些你設定的函式能夠對這些保護資料進行操作,避免把類成員全部設定成public,最大限度...