首先來看乙個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開始,它只能出現在類定義的內部,友...