一、友元函式
二、友元類
三、友元的優缺點
結合著類的特性,可知:類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性檢查等都需要時間開銷,而影響程式的執行效率。
為了解決上述問題,提出一種使用友元的方案。友元是一種
定義在類外部的普通函式,但它需要在類體內進行宣告,為了與該類的成員函式加以區別,在宣告時前面加以關鍵字friend。
友元不是成員函式,但是它可以訪問類中的私有成員。友元的作用在於提高程式的執行效率,但是,
它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問類的私有成員。
案例分析:
問題:現在我們嘗試去過載operator<<,然後發現我們沒辦法將operator《過載成成員函式。因為cout的輸出流物件和隱含的this指標在搶占第乙個引數的位置。this指標預設是第乙個引數也就是左運算元了。但是實際使用中cout需要是第乙個形參物件,才能正常使用。所以我們要將operator《過載成全域性函式。但是這樣的話,又會導致類外沒辦法訪問成員,那麼這裡就需要友元來解決。operator>>同理。
class date
prvate:
int _year;
int _month;
int _day
};ostream& operator<<(ostream& _cout, const date& d)
int main()
private:
int _hour;
int _minute;
int _second;
};class date
void settimeofdate(int hour, int minute, int second)
private:
int _year;
int _month;
int _day;
time _t;
};
利用 friend 修飾符,可以讓一些普通函式 或 另乙個類的成員函式 直接對某個類的保護成員和私有成員進行操作,提高了程式的執行效率;同時避免把類的成員都宣告為public,最大限度地保護資料成員的安全。
但是,即使是最大限度地保護資料成員,友元也破壞了類的封裝性。
如果將類的封裝比喻成一堵牆的話,那麼友元機制就像牆上開了乙個門。所以使用友元時一定要慎重。
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
C 友元 友元函式 友元類和友元成員函式
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...