C 突破封裝 友元和內部類

2021-10-07 15:37:55 字數 1856 閱讀 4367

首先來看乙個date類,當我們想要過載實現 operator<< 和 operator>> 一般會在類的內部寫:

class

date

istream&

operator

>>

(istream& in)

private

:int _year;

int _month;

int _day;

};

但是這樣會存在乙個問題,類中 this指標 隱含的存在於成員函式的第乙個形參位置,在呼叫 operator<< 和 operator>> 的時候,就要反著寫,邏輯上很彆扭,不符合我們的直觀使用。

date d3;

d3 >> cin;

d3 << cout << endl;

return

0;

解決方案:只可以把 operator<< 和 operator>> 寫在類外,這樣不存在this指標,就可以顯示的寫出形參:類型別物件。可是在類外就不能訪問到類中的私有成員變數,這時候就必須用到友元函式。

ostream&

operator

<<

(ostream& out,

const date& d)

istream&

operator

>>

(istream& in, date& d)

如下**就給出了過載 operator<< 和 operator>> 的正確邏輯寫法:

#include

using

namespace std;

class

date

void

print()

private

:int _year;

int _month;

int _day;};

//定義友元函式

ostream&

operator

<<

(ostream& out,

const date& d)

istream&

operator

>>

(istream& in, date& d)

intmain()

如下**:date類為time類的友元類,則在date類中可以訪問time類中的私有成員變數

#include

using

namespace std;

class

time

private

:int _hour;

int _minute;

int _second;};

class

date

void

settime

(int hour,

int minute,

int second)

void

print()

private

:int _year;

int _month;

int _day;

time _t;};

intmain()

#include

using

namespace std;

class

a//b類天生就是a類的友元類

classb}

;private

:int _x;

int _y;};

intmain()

C 之內部類(巢狀類)與外部類及友元

1 class outer 2 5 private 6 int m outerint 7 public 8 內部類定義開始 9 class inner 10 13 private 14 int m innerint 15 public 16 void displayin 如果這樣你都能正常執行,天理...

C 之內部類(巢狀類)與外部類及友元

先上 1 class outer25 private 6 intm outerint 7public 8 內部類定義開始 9class inner 1013 private 14 intm innerint 15public 16 void displayin 17 18 end內部類 19publ...

友元 友元函式 友元類和友元成員函式 C

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...