C 深度剖析教程6 C 之友元

2021-08-13 21:57:22 字數 2486 閱讀 3179

這幾天在複習數學考試,都沒有學c++,今天抽空來學一點。

什麼是友元?

在具體講解友元的性質之前,我們先來看看乙個程式,這個程式是計算兩點之間的距離:

#include

#include

class

point

double

getx()

double

gety()

};double

func

(point& p1,point& p2)

intmain()

上面**執行結果為:

p1(1.000000,2.000000)

p2(10.000000,20.000000)

|p1-p2| = 20.124612

看著也沒什麼大問題。下面我們來簡單分析一下這個程式的實用性:進行計算這個兩點之間的距離時的**為:

ret =

(p1.

getx()

- p2.

getx()

)*(p1.

getx()

- p2.

getx()

)+(p1.

gety()

- p2.

gety()

)*(p1.

gety()

- p2.

gety()

);

進行了8次函式的呼叫!!!這麼簡單的計算,就需要呼叫8次函式,這效率之慢在當初c++誕生的時候,是不被大多數人接受的,大多數人用c程式設計習慣了,都是可以直接這樣呼叫的:

ret =

(p1.x - p2.x)

*(p1.x - p2.x)

+(p1.y - p2.y)

*(p1.y - p2.y)

;

然而c++裡面你就不能像上面那樣直接呼叫類(c裡面可以是結構體或者陣列)的成員變數。因為它是private型別的變數。那麼在c++誕生的那個年代,人們為了讓c++語言完全相容c語言,就在c++中加入了友元的存在。那麼友元的定義以及性質是什麼樣的呢?

直接將上面的**修改一下看看:

#include

#include

class

point

double

getx()

double

gety()

friend

double

func

(point& p1,point& p2);};

double

func

(point& p1,point& p2)

intmain()

執行結果為:

p1(1.000000,2.000000)

p2(10.000000,20.000000)

|p1-p2| = 20.124612

這樣看來,我們已經實現了直接訪問類的私有成員變數。上面的**,func函式是point類的友元,可以直接訪問point的所有資料。但是這樣做,又不好,為什麼呢?

友元的尷尬:

雖然基於以上的尷尬讓友元這個功能在現代軟體工程中很少被使用,但是我們學習嘛,肯定是都要學的,哈哈~

友元需要注意的一些事項:

#include

class

classc

friend

class

classb;}

;class

classb

void

getclasscname

(classc& c)

friend

class

classa;}

;class

classa

void

getclassbname

(classb& b)

/* void getclasscname(classc& c)

*/};

intmain()

執行結果為:

b.n = b

c.n = c

分析**知:類b是c的友元,類a是b的友元,所以在b中可以直接訪問c的私有成員變數,在a中可以直接訪問b的成員變數。 那麼在a中能否直接訪問c呢?試驗一下將上面的**注釋掉得部分恢復,編譯執行,執行結果為:

test.cpp: in member function 『void classa::getclasscname(classc&)』:

test.cpp:6: error: 『const char* classc::n』 is private

test.cpp:44: error: within this context

很顯然,a是不能訪問c的私有成員的。

總結一下:

C 回顧之友元

總的來說,友元分為兩類 友元函式與友元類。友元是針對類而言,它提供了一種非類的成員函式來訪問類的非公有成員的一種機制。可以把乙個函式指定為某類的友元,這個函式稱為這個類的友元函式。也可以將類a指定為類b的友元,則類a是類b的友元類,類a的所有成員函式均是類b的友元函式,均可以訪問類b的非公有成員。友...

C 之友元函式

類的友元.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std class point 預設賦值建構函式,在建立物件時自動呼叫 int getx 隱藏有this指標,指向當前使用的物件,其實是return thi...

C 基礎之友元

友元函式 在本類中使用friend宣告外部的函式,則該外部函式就能訪問本類中的private protected成員。友元類 在本類中使用friend宣告外部的類,則該外部類就能訪問本類中private protected成員。友元關係沒有繼承性 b類是a類的友元,c類繼承a類,則b不能直接訪問c中...