c++中,類外的成員不能訪問類內的私有和保護型別成員。而友元函式可以不受訪問限制訪問類的任何成員。友元函式雖然可以在類內進行宣告,但是友元函式不是成員函式,因此沒有this指標。
舉例說明:
class clock
;clock::clock(int h, int m, int s)
void show(clock& c)
int main()
一般來說,友元函式帶有乙個與其有好友關係的類型別的入口引數。因為友元函式不是與其有好友關係的類的成員函式,它沒有this指標,所以它不能直接引用類成員的名字。它必須通過作為入口引數傳遞進來的物件名或物件指標來引用該物件的成員。
如上例子,show函式的引數是乙個clock型別的引用,可以利用引用來訪問友元函式的好友類的私有成員。
class clock
;clock::clock(int h, int m, int s)
void clock::show()
int main()
而上述**是將show()宣告為成員函式,利用this指標來訪問該類的私有資料。
那麼,友元函式究竟有什麼用呢?
首先,友元機制是對類的封裝機制的補充,利用這種機制,乙個類可以賦予某些函式訪問它的私有成員的特權。宣告乙個類的友元函式,就可以用這個函式直接訪問該類的私有資料,從而提高程式執行的效率。
其次,友元提供了不同類的成員函式之間、類的成員函式和普通函式之間進行資料共享的機制。尤其當乙個函式需要訪問多個類的私有成員時,友元函式非常有用。普通的成員函式只能訪問其所屬類的私有成員,但是多個類的友元函式能夠訪問相關所有類的私有成員。
友元函式的宣告可以出現在類的任何地方,(包括在public和private部分)也就是說友元的宣告不受成員訪問控制符的限制。
友元的關係是單向的,而不是雙向的。如果宣告了b是a的友元類,不等於a類也是b類的友元類,a類中的成員函式不一定能夠訪問b類的成員。
友元關係不能傳遞。
在c++中,要實現類的多個物件之間的資料共享,可使用靜態成員。靜態成員包括兩種,一種是靜態資料成員,另一種是靜態成員函式。
類的普通資料成員在類的每個物件中都擁有乙個拷貝,就是說每個物件的同名資料成員可以分別儲存不同的數值,這也保證物件擁有自身區別於其他物件的特徵需要。但是靜態資料成員每個類只有乙個拷貝,由該類所有物件共同維護和使用,從而實現了同乙個類的不同物件之間的資料共享。
靜態資料成員在記憶體中只占用乙份儲存空間,它是屬於類的,但是它被該類的所有物件所共享,每個物件都可以訪問這個靜態資料成員。靜態資料成員的值對所有物件都是一樣的。如果改變它的值,則在各個物件中這個資料成員的值都同時變了。可以節約空間,提高效率。
如果只宣告了類而未定義物件,則類的一般資料成員是不佔儲存空間的,只有在定義物件時,才為物件的資料成員分配空間。但是靜態資料成員不屬於某乙個物件,在為物件開闢空間的同時並不會為靜態資料成員分配空間。靜態資料成員是在所有物件之外單獨開闢空間。它是在程式編譯時被分配空間的,到程式結束時才釋放空間。
靜態成員與友元
靜態成員與友元 1 實驗目的 學習友元函式的定義和原理。學習靜態資料成員和靜態成員函式的使用。學習靜態成員代替全域性變數實現物件間的共享。2 實驗內容 1 有如下類的定義。類成員函式copy用於實現兩個物件的相互拷貝,請完成該函式的實現。有兩種方法即用成員函式和友元函式實現 include incl...
靜態成員與友元函式
1 靜態成員 由來 使用全域性物件實現資料共享,由於其處處可見,不夠安全,故可使用靜態成員實現類的多個物件之間的資料共享。包括 靜態資料成員 靜態成員函式 特點 靜態資料成員屬於類,而不屬於某個物件獨有,類的所有物件共享靜態資料成員 靜態資料成員使用關鍵字static,在類體中宣告,在類體外定義,以...
實驗4 靜態成員與友元
1.除錯下列程式,寫出輸出結果,並分析輸出結果。解釋 建構函式進行賦值,所以a分別等於6和8,靜態成員函式b第一次賦值時,b 100 6 94,第二次賦值b 94 8 86。2.分析並除錯程式,完成下列問題。include include using namespace std class my m...