C++友元和内部类
一、友元
1.1 友元分為:友元函數和友元類
友元提供了一種突破封裝的方式,有時提供了便利。但是友元會增加耦合度,破壞了封裝,所以友元不宜多用。
1.2 友元函數:友元函數可以直接訪問類的私有成員,它是定義在類外部的普通函數,不屬于任何類,但需要在類的內部聲明,聲明時需要加friend關鍵字。
說明:
① 友元函數可訪問類的私有成員,但不是類的成員函數
② 友元函數不能用const修飾
③ 友元函數可以在類定義的任何地方聲明,不受類訪問限定符限制
④ 一個函數可以是多個類的友元函數
⑤ 友元函數的調用與普通函數的調用和原理相同
1.3 友元成員函數:friend函數不僅可以是一般函數(非成員函數),而且可以是另一個類中的成員函數。注意:可能會用到類的提前引用聲明。
#include <iostream> using namespace std;class Date; //對Date類的提前引用聲明 class Time { public:Time(int hour, int minute, int second):hour(hour), minute(minute), second(second){}void display(Date& d); //引用Date類的對象 private:int hour;int minute;int second; };class Date //Date類的聲明 { public:Date(int year, int month, int day):year(year), month(month), day(day){}friend void Time::display(Date& d); //聲明Time類中display函數為本類的友元函數 private:int year;int month;int day; };void Time::display(Date& d) //定義display函數,只能在Date類后面定義 {cout << d.year << "-" << d.month << "-" << d.day << " " << hour << ":" << minute << ":" << second << endl; }int main() {Time t(12, 30, 8);Date d(2019, 12, 23);t.display(d);return 0; }1.3 友元類
①友元類的所有成員函數都可以是另一個類的友元函數,都可以訪問另一個類中的非公有成員。
②友元關系是單向的,不具有交換性。
比如上述Time類和Date類,在Time類中聲明Date類為其友元類,那么可以在Date類中直接訪問Time類的私有成員變量,但想在Time類中訪問Date類中私有的成員變量則不行。
③友元關系不能傳遞
如果B是A的友元,C是B的友元,則不能說明C時A的友元。
1.4友元利弊:友元是對面向對象的封裝性進行破環,但是有助于數據共享,能提高程序的效率。使用時做好權衡!
二、內部類
2.1 概念:如果一個類定義在另一個類的內部,這個內部類就叫做內部類。注意此時這個內部類是一個獨立的類,它不屬于外部類,更不能通過外部類的對象去調用內部類。外部類對內部類沒有任何優越的訪問權限。
注意:內部類就是外部類的友元類。注意友元類的定義,內部類可以通過外部類的對象參數來訪問外部類中的所有成員。但是外部類不是內部類的友元。
2.2 特性:
①內部類可以定義在外部類的public、protected、private都是可以的。
②注意內部類可以直接訪問外部類中的static、枚舉成員,不需要外部類的對象/類名。
③sizeof(外部類)=外部類,和內部類沒有任何關系。
總結
- 上一篇: 共享电单车充电桩平台
- 下一篇: 计算机网络交换箱套什么定额,计算机网络实