HELLO,大家好,我是GeekBand的學員,在學習網課上,因為作業的關係,所以要向大家發表一下我在學習C++上的一些心得與筆記,可能寫得不太好,因為畢竟剛接觸程式語言才半年,所以大家若是有甚麼地方覺得錯誤或是解釋的不是很恰當,都可以跟我說,或是qq給我,我都可以跟大家討論關於電腦的事物
那我們就開始吧!這周的我想分享的是我對於類中friend(友元)的理解,那friend是什麼?friend就是可以調用在在類中的數據的函數,那類的特性是:封裝性與資訊隱藏,因而才會有public與private的區別,也就是說只有類的成員函數才能訪問類的私有成員(private),非類的成員函數只能訪問公有成員(public),如下:
class temp { public: int a=10; private: int b=20; };</span></span>
在這個class中,我們用了int定義了兩個數(a,b),但是由於兩個數所放置的位置不同,差異就出來了,在temp類外,我們是無法調用與改變b的,但是a卻可以,因為兩者的權限不同
我們可以發現,若是想要保護數據與保持封裝性,就必須要把數據放在private,但是有時候要利用時,卻會變得相當的麻煩,在安全性與程式運行效率中都會變得相當不好。
為了解決這些問題,友元這個方案設計就應運而生。友元是定義在類之外的函數或類,但在類中說明,然後再說明的同時需要把friend放在整個函數或是類前,所以嚴格的看,其實友元不是類中的成員函數,但是可以訪問類中的private成員,所以可以提高類的運行效率,但是它同時也破壞類的封裝性與隱藏性,所以在使用上還是要相當謹慎,下面是我所寫的friend用法:
int complex(int a,int b); class temp { public: private: int aa,bb; friend int complex(int a,int b); };</span>
然而我是這樣想的,因為你所創造的函數是在外,而firend我就將他想成是個標記,把她聲明在類中,告訴類,我是你的朋友或是成員,我就可以自由取用你的object。
這裡再補充一下,其實每個類中的object都可以看成是對方的friend,下面我們看一下:
class temp { public: temp(int a=0,int b=0):aa(a),bb(b) {} int func(const temp& param) { return param.aa+param.bb; } private: int aa,bb; };</span>
這段代碼是由侯老師在課堂中介紹中,我就改一下一些字母而已,可以看到,其實函數func在調用的時候是沒有破壞封裝性的,但是他的前面也沒有加上friend,這是為什麼?因為在class中每個object都是互為友元的,只是不需要把friend寫出。
最後我們再總結一下有玄的性質與意義:
1.友元是為了在調用時,運行效率更好,卻也失去封裝性
2.友元在作用時是可以自由取得private成員
3.friend是加在想要訪問class中的private的函數或是類