這幾天在複習數學考試,都沒有學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中...