友元在C++裡面是一個比較重要的東西,對於類裡面聲明的私有數據與函數,如果在某些應用需求下需要被其他函數調用,這時候就需要使用友元函數。就好像給了一個聲明,說某某函數是我這個類的一個好朋友,你們可以大膽地放他進入我的閨房,訪問我的數據。
在C++裡面,我們定義友元是使用friend 這個關鍵字。聲明友元函數可以有下面四種情況。
friend void h(); 聲明的友元函數是一個全局函數,這裡其實做了兩件事,一件事聲明一個函數 void h();,另一件事是聲明該函數屬於X類的一個友元函數。
friend class Z 聲明類Z是友元類,即類Z裡面所有方法都可以引用A中的私有數據與私有函數。
friend void g(X*, int) 這個是比較常用的方式,跟上面的全局函數是一樣的。
要強調的是friend Y::f(X*); 制定在類Y裡面的特定函數為友元。這裡有一個問題要注意到,就是聲明的順序。在聲明友元函數之前必然是要求先聲明類Y以及類Y裡面的f()方法,不然系統是找不到對應的類。然後由於類Y裡面有類X作為參數,也必然需要在聲明函數f()之前先有類X的聲明。這無疑是一個很大的矛盾。如何解決這個矛盾呢,是有技巧的。
如上面代碼所示,我們在聲明f(X*)之前有了類X的一個聲明,這裡僅僅是聲明,並沒有定義。在聲明友元之前也有類Y的一個聲明,這就圓了場。然而也要注意到,這裡有一個細節,f(X*)的參數是一個指針。由於在類Y前面類X只是一個聲明,但是對於類X的大小,在掃描到類Y時是未知的,所以只能傳入一個指針來解決這個沖突。