C 中的friend友元函式詳細解析

2021-07-14 16:24:17 字數 1816 閱讀 1506

友元可以是乙個函式,該函式被稱為友元函式;友元也可以是乙個類,該類被稱為友元類。友元函式的特點是能夠訪問類中的私有成員的非成員函式。友元函式從語法上看,它與普通函式一樣,即在定義上和呼叫上與普通函式一樣

友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend。

我們已知道類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性檢查等都需要時間開銷,而影響程式的執行效率。

為了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函式,但它需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字friend。友元不是成員函式,但是它可以訪問類中的私有成員。友元的作用在於提高程式的執行效率(即減少了型別檢查和安全性檢查等都需要的時間開銷),但是,它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。

友元可以是乙個函式,該函式被稱為友元函式;友元也可以是乙個類,該類被稱為友元類。

友元函式的特點是能夠訪問類中的私有成員的非成員函式。友元函式從語法上看,它與普通函式一樣,即在定義上和呼叫上與普通函式一樣

#include "cmath"

#include "iostream"

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)

int main(void)

成員函式,而是友元函式。它的定義方法與普通函式定義一樣,而不同於成員函式的定義,因為它不需要指出所屬的類。但是,它可以引用類中的私有成員,函式體中的a.x,b.x,a.y,b.y都是類的私有成員,它們是通過物件引用的。在調用友元函式時,也是同普通函式的呼叫一樣,不要像成員函式那樣呼叫。本例中,p1.getxy()和p2.getxy()這是成員函式的呼叫,要用物件來表示。而distance(p1, p2)是友元函式的呼叫,它直接呼叫,不需要物件表示,它的引數是物件。(該程式的功能是已知兩點座標,求出兩點的距離。)

下面對上面的**進行輸入、輸出流的過載:

#include

#include

using namespace std;

class point

void getxy();

friend double distance(point &a,point &b);

friend ostream &operator <<(ostream &a,point &b);

protected:

private:

double x,y;

};// friend ostream& operator<<(ostream& o,a& another);

ostream &operator <<(ostream &out,point &b)   //在類中宣告的時候,可以是ostream &a,函式定義的時候也可以是ostream &out

void point::getxy()

double distance(point &a,point &b)

int main(void)

C 中的友元函式friend

class int 友元函式的定義 void print const int obj int obj print obj 直接調用友元函式,不需要使用物件或者指標!下面例項是友元類的使用,詳細見下面的例項 class box 成員函式的定義 void box setwidth double wid ...

友元函式 friend

類的外部,也就是通過例項來訪問私有 private 或保護 protected 成員,這是被禁止的。但從實用性來說,的確有時很需要在外部訪問,c 增加了一種稱之為 友元 friend 函式的申明,將 特權 賦給一些函式 可以是全域性函式,也可以是其它類的成員函式 使之能夠訪問該類的私有和保護成員。友...

友元函式 friend

一 乙個類的成員函式有三個互不相干作用 1.可以通過類的成員方法,訪問它的私有資料。2.該函式的作用域在類中。3.在外部調動該函式必須通過成員訪問符訪問,也就是必須經由乙個物件去啟用 有乙個this指標 二 友元函式 1.友元函式作用域不屬於類的作用域,不是類的成員,也就不是類的方法,不受公有 私有...