C++示例講解friend static const關(guān)鍵字的用法
一、友元函數(shù)
1.1重載operator<<
問題:現(xiàn)在我們嘗試去重載operator<<,然后發(fā)現(xiàn)我們沒辦法將operator<<重載成成員函數(shù)。因為cout的輸出流對象和隱含的this指針在搶占第一個參數(shù)的位置。this指針默認是第一個參數(shù)也就是左操作數(shù)了。但是實際使用中cout需要是第一個形參對象,才能正常使用。所以我們要將operator<<重載成全局函數(shù)。但是這樣的話,又會導致類外沒辦法訪問成員,那么這里就需要友元來解決。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<<
1.2友元函數(shù)
友元函數(shù)可以直接訪問類的私有成員,它是定義在類外部的普通函數(shù),不屬于任何類,但需要在類的內(nèi)部聲明,聲明時需要加friend關(guān)鍵字。
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.友元函數(shù)可訪問類的私有和保護成員,但不是類的成員函數(shù)
2.友元函數(shù)不能用const修飾
3.友元函數(shù)可以在類定義的任何地方聲明,不受類訪問限定符限制
4.一個函數(shù)可以是多個類的友元函數(shù)
5.友元函數(shù)的調(diào)用與普通函數(shù)的調(diào)用和原理相同
1.3友元類
1.友元類的所有成員函數(shù)都可以是另一個類的友元函數(shù),都可以訪問另一個類中的非公有成員。
2.友元關(guān)系是單向的,不具有交換性。
比如上述Time類和Date類,在Time類中聲明Date類為其友元類,那么可以在Date類中直接訪問Time類的私有成員變量,但想在Time類中訪問Date類中私有的成員變量則不行。
3.友元關(guān)系不能傳遞如果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; };
二、關(guān)鍵字const
2.1const修飾類的成員函數(shù)
將const修飾的類成員函數(shù)稱之為const成員函數(shù),const修飾類成員函數(shù),實際修飾該成員函數(shù)隱含的this指針,表明在該成員函數(shù)中不能對類的任何成員進行修改。
總結(jié):
1.const對象不能調(diào)用非cosnt成員函數(shù)(權(quán)限放大:const Date* -> Date*)
2.非const對象可以調(diào)用const成員函數(shù)
3.const成員函數(shù)不能調(diào)用非cosnt成員函數(shù)(權(quán)限放大)
4.非cosnt成員函數(shù)可以調(diào)用const成員函數(shù)
三、關(guān)鍵字static
3.1static類成員
概念:聲明為static的類成員稱為類的靜態(tài)成員,用static修飾的成員變量,稱之為靜態(tài)成員變量;用static修飾的成員函數(shù),稱之為靜態(tài)成員函數(shù)。靜態(tài)的成員變量一定要在類外進行初始化
特性:
- 靜態(tài)成員為所有類對象所共享,不屬于某個具體的實例
- 靜態(tài)成員變量必須在類外定義,定義時不添加static關(guān)鍵字
- 類靜態(tài)成員即可用類名::靜態(tài)成員或者對象.靜態(tài)成員來訪問
- 靜態(tài)成員函數(shù)沒有隱藏的this指針,不能訪問任何非靜態(tài)成員
- 靜態(tài)成員和類的普通成員一樣,也有public、protected、private3種訪問級別,也可以具有返回值
3.2面試題
面試題:實現(xiàn)一個類,計算中程序中創(chuàng)建出了多少個類對象。
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.靜態(tài)成員函數(shù)不能調(diào)用非靜態(tài)成員函數(shù)
2.非靜態(tài)成員函數(shù)可以調(diào)用靜態(tài)成員函數(shù)
總結(jié)
以上就是關(guān)于C++關(guān)鍵字friend ,static,const 全部總結(jié),感謝大家的閱讀觀看
到此這篇關(guān)于C++示例講解friend static const關(guān)鍵字的用法的文章就介紹到這了,更多相關(guān)C++ friend static const內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言示例講解動態(tài)/文件/靜態(tài)功能版本的通訊錄實現(xiàn)
通訊錄是一個可以記錄親人、好友信息的工具,這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07Qt專欄之模態(tài)與非模態(tài)對話框的實現(xiàn)
這篇文章主要介紹了Qt專欄之模態(tài)與非模態(tài)對話框的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04openCV中meanshift算法查找目標的實現(xiàn)
本文主要介紹了openCV中meanshift算法查找目標的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11