<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
友元分為: 友元函數 和 友元類
友元提供了一種突破封裝的方式,有時提供了便利。但是友元會增加耦合度,破壞了封裝,所以友元不宜多用。
operator<<:因為cout 的 輸出流物件和隱含的 this 指標在搶佔第一個引數的位置 。 this 指標預設是第一個引數也就是左操數了。但是實際使用中cout 需要是第一個形參物件,才能正常使用。所以我們要將 operator<< 過載成全域性函數。但是這樣的話,又會導致類外沒辦法存取成員,那麼這裡就需要友元來解決。operator>> 同理。
友元函數 可以 直接存取 類的 私有 成員,它是 定義在類外部 的 普通函數 ,不屬於任何類,但需要在類的內部宣告,宣告時需要加friend 關鍵字。
#include<iostream> using namespace std; class Date { // 友元函數 friend ostream& operator<<(ostream& out, const Date& d); public: private: int _year; int _month; int _day; }; ostream& operator<<(ostream& out, const Date& d) { out << d._year << "/" << d._month << "/" << d._day << endl; return out; } int main() { Date d; //d << cout; cout << d; return 0; }
【1】友元函數 可存取類的私有和保護成員,但 不是類的成員函數
【2】友元函數 不能用 const 修飾(因為沒有this指標)
【3】友元函數 可以在類定義的任何地方宣告, 不受類存取限定符限制,放在public,private中都行,不放這兩個裡面放在最前面也行,一般都是定義最前面的
【4】一個函數可以是多個類的友元函數
【5】友元函數的呼叫與普通函數的呼叫和原理相同
class Date; // 前置宣告:因為編譯器是向上查詢,在Time類中 class Time { //友元類 friend class Date; 宣告日期類為時間類的友元類,則在日期類中就可以直接存取Time類中的私有成員變數 public: Time(int hour=0, int minute=0, int second = 0) : _hour(hour) , _minute(minute) , _second(second) {} private: int _hour; int _minute; int _second; }; class Date { public: Date(int year = 1900, int month = 1, int day = 1) : _year(year) , _month(month) , _day(day) {} void SetTimeOfDate(int hour, int minute, int second) { // 直接存取時間類私有的成員變數 _t._hour = hour; _t._minute = minute; _t._second = second; } private: int _year; int _month; int _day; Time _t; };
在Date類中有一自定義成員變數Time _t;,成員函數 SetTimeOfDate 想存取 _t 物件的成員變數,因為類Time中的成員變數是私有的,所以正常情況無法存取,則需要藉助友元類:
想在Date類中存取Time類物件的私有成員變數,就需要在類Time中宣告日期類為時間類的友元類,則在日期類中就可以直接存取Time類中的私有成員變數。
格式:friend class Date;
(在Date類中存取Time類物件的成員變數:在Time類中寫日期類宣告並在前面加friend)
【1】友元類的所有成員函數都可以是另一個類的友元函數,都可以存取另一個類中的非公有成員。
【2】友元關係是單向的,不具有交換性。 比如上述Time類和Date類,在Time類中宣告Date類為其友元類,那麼可以在Date類中直接存取Time類的私有成員變數,但想在Time類中存取Date類中私有的成員變數則不行。
【3】友元關係不能傳遞 如果B是A的友元,C是B的友元,則不能說明C時A的友元。
如果一個類定義在另一個類的內部,這個內部類就叫做內部類。
注意:此時這個內部類是一個獨立的類,它不屬於外部類,更不能通過外部類的物件去呼叫內部類。外部類對內部類沒有任何優越的存取許可權。
注意:內部類就是外部類的友元類。注意友元類的定義,內部類可以通過外部類的物件引數來存取外部類中的所有成員。但是外部類不是內部類的友元。
1. 內部類可以定義在外部類的 public 、 protected 、 private 都是可以的。
2. 注意內部類可以直接存取外部類中的 static 、列舉元,不需要外部類的物件 / 類名。
3. sizeof( 外部類 )= 外部類,和內部類沒有任何關係
舉例:B是A的內部類,B是A的友元,A不是B的友元,A的大小是4位元組,類A的大小不包含靜態變數k(存在靜態區)和成員函數(存在公共程式碼段)和內部類B,類A的大小僅僅只有h,所以是4位元組。
class A { private: static int k; int h; public: class B //內部類 { public: void foo(const A& a) { cout << k << endl; //B可以直接存取A內部成員變數 cout << a.h << endl; //B可以直接存取A內部成員變數 } }; }; int main() { cout << sizeof(A) << endl; A aa; A::B bb; //定義B的物件時,需要指定是A的類域 A:: return 0; }
到此這篇關於C++超詳細講解友元與內部類的文章就介紹到這了,更多相關C++友元與內部類內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45