在物件導向的程式設計中,類的封裝性使得我們使用類(物件)的成員資料時經常要通過類(物件)的成員函式。這對於類是一種保護。但在某些情況下,頻繁的成員函式呼叫使得效率嚴重受損。
例如,定義矩陣類,並有兩個矩陣物件相乘,為了獲得矩陣中的元素值(私有成員),要頻繁呼叫取值函式(公有成員)。
怎樣可以提高效率?——使用友元函式。在c++中友元(friend)函式允許在類外訪問該類中的任何成員,就象類的成員函式一樣。
友元函式用關鍵字friend說明。下面用友元函式過載運算子「+」,以實現c=d+c。(即實數與複數的加法。)
◆ 1、定義友元函式的一般格式:
首先,在類宣告裡宣告:
class complex
; /*opration+為類complex類的友元函式, friend只用於類說明中 ……*/
第二步,在類外定義:
complex operator + (double d , complex c)
//注意友元不是成員函式,在類宣告以外的地方也不加friend
第三步,使用,友元函式可以在任何地方直接訪問類的私有成員
void main(void)
這裡d+c1被c++編譯器解釋為operator+(d,c1),即調用友元函式operator+(d,c1)。
◆ 2、再進一步,如果使用友元函式
friend complex operator +(complex c1 , complexc2) ;
無論是複數與複數相加,還是實數與複數相加(不論實數在前還是在後)都可以用。為什麼呢?
因為有此例所定義的預設的建構函式,實數會被強制轉換為虛部為零的複數。d+c1被解釋為:
operator+(complex(d) , c1)
◆ 3、
friend complex operator+(const complex & c1,const complex & c2)
這裡採用complex物件的引用而不是物件本身,呼叫時不再重新分配記憶體建立乙個複製的物件,函式效率會更高。加const,實參唯讀,可防止實參被修改。
◆ 4、單目運算子前置「++」的友元函式過載方式如下:
complex complex::operator++(complex & c )
採用友元函式方式定義與使用都很方便。但採用友元方式必須使用引用,因為被施加「++」運算的是乙個引數。
◆ 5、友元函式過載後置「++」如下:
friend complex operator++(complex & c , int)
採用引用型別,實參c做了++,而temp是++前的值。
◆ 6、友元函式注意點:
C 友元函式和友元類詳解
我們已知道類具備封裝和資訊隱 藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式能夠訪問類中的公有成員,但是假如將資料成員都定義 為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性...
C 友元類和友元函式詳解
私有成員只能在類的成員函式內部訪問,如果想在別處訪問物件的私有成員,只能通過類提供的介面 成員函式 間接地進行。這固然能夠帶來資料隱藏的好處,利於將來程式的擴充,但也會增加程式書寫的麻煩。c 是從結構化的c語言發展而來的,需要照顧結構化設計程式設計師的習慣,所以在對私有成員可訪問範圍的問題上不可限制...
C 友元例項詳解
通常對於普通函式來說,要訪問類的保護成員是不可能的,如果想這麼做那麼必須把類的成員都生命成為public,然而這做帶來的問題遍是任何外部函式都可以毫無約束的訪問它操作它,c 利用friend修飾符,可以讓一些你設定的函式能夠對這些保護資料進行操作,避免把類成員全部設定成public,最大限度的保護資...