C 友元函式和友元類(作用及優缺點)

2021-10-10 07:33:34 字數 1379 閱讀 4639

一、友元函式

二、友元類

三、友元的優缺點

結合著類的特性,可知:類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢查和安全性檢查等都需要時間開銷,而影響程式的執行效率。

為了解決上述問題,提出一種使用友元的方案。友元是一種

定義在類外部的普通函式,但它需要在類體內進行宣告,為了與該類的成員函式加以區別,在宣告時前面加以關鍵字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開始,它只能出現在類定義的內部,友...