<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
問題:現在我們嘗試去過載operator<<,然後發現我們沒辦法將operator<<過載成成員函數。因為cout的輸出流物件和隱含的this指標在搶佔第一個引數的位置。this指標預設是第一個引數也就是左運算元了。但是實際使用中cout需要是第一個形參物件,才能正常使用。所以我們要將operator<<過載成全域性函數。但是這樣的話,又會導致類外沒辦法存取成員,那麼這裡就需要友元來解決。operator>>同理。
class Date { public: Date(int year, int month, int day) : _year(year) , _month(month) , _day(day) {} ostream& operator<<(ostream& _cout) { _cout<<d._year<<"-"<<d._month<<"-"<<d._day; return _cout; } prvate: int _year; int _month; int _day }; int main() { Date d(2017, 12, 24); d<<cout; return 0; }
但"d<<cout"可讀性很低,所以我們嘗試需要在類外部過載operator<<
友元函數可以直接存取類的私有成員,它是定義在類外部的普通函數,不屬於任何類,但需要在類的內部宣告,宣告時需要加friend關鍵字。
class Date { friend ostream& operator<<(ostream& _cout, const Date& d); friend istream& operator>>(istream& _cin, Date& d); public: Date(int year, int month, int day) : _year(year) , _month(month) , _day(day) {} private: int _year; int _month; int _day; }; ostream& operator<<(ostream& _cout, const Date& d) { _cout<<d._year<<"-"<<d._month<<"-"<<d._day; return _cout; } istream& operator>>(istream& _cin, Date& d) { _cin>>d._year; _cin>>d._month; _cin>>d._day; return _cin; } int main() { Date d; cin>>d; cout<<d<<endl; return 0;
1.友元函數可存取類的私有和保護成員,但不是類的成員函數
2.友元函數不能用const修飾
3.友元函數可以在類定義的任何地方宣告,不受類存取限定符限制
4.一個函數可以是多個類的友元函數
5.友元函數的呼叫與普通函數的呼叫和原理相同
1.友元類的所有成員函數都可以是另一個類的友元函數,都可以存取另一個類中的非公有成員。
2.友元關係是單向的,不具有交換性。
比如上述Time類和Date類,在Time類中宣告Date類為其友元類,那麼可以在Date類中直接存取Time類的私有成員變數,但想在Time類中存取Date類中私有的成員變數則不行。
3.友元關係不能傳遞如果B是A的友元,C是B的友元,則不能說明C時A的友元。
class Date; // 前置宣告 class Time { friend class Date; // 宣告日期類為時間類的友元類,則在日期類中就直接存取Time類中的私有成 員變數 public: Time(int hour, int minute, int second) : _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; };
將const修飾的類成員函數稱之為const成員函數,const修飾類成員函數,實際修飾該成員函數隱含的this指標,表明在該成員函數中不能對類的任何成員進行修改。
總結:
1.const物件不能呼叫非cosnt成員函數(許可權放大:const Date* -> Date*)
2.非const物件可以呼叫const成員函數
3.const成員函數不能呼叫非cosnt成員函數(許可權放大)
4.非cosnt成員函數可以呼叫const成員函數
概念:宣告為static的類成員稱為類的靜態成員,用static修飾的成員變數,稱之為靜態成員變數;用static修飾的成員函數,稱之為靜態成員函數。靜態的成員變數一定要在類外進行初始化
特性:
面試題:實現一個類,計算中程式中建立出了多少個類物件。
class A { public: A() {++_scount;} A(const A& t) {++_scount;} static int GetACount() { return _scount;} private: static int _scount; }; int A::_count = 0; void TestA() { cout<<A::GetACount()<<endl; A a1, a2; A a3(a1); cout<<A::GetACount()<<endl; }
注意:
1.靜態成員函數不能呼叫非靜態成員函數
2.非靜態成員函數可以呼叫靜態成員函數
以上就是關於C++關鍵字friend ,static,const 全部總結,感謝大家的閱讀觀看
到此這篇關於C++範例講解friend static const關鍵字的用法的文章就介紹到這了,更多相關C++ friend static const內容請搜尋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