C++友元和内部类
一、友元
1.1 友元分為:友元函數(shù)和友元類
友元提供了一種突破封裝的方式,有時(shí)提供了便利。但是友元會(huì)增加耦合度,破壞了封裝,所以友元不宜多用。
1.2 友元函數(shù):友元函數(shù)可以直接訪問類的私有成員,它是定義在類外部的普通函數(shù),不屬于任何類,但需要在類的內(nèi)部聲明,聲明時(shí)需要加friend關(guān)鍵字。
說明:
① 友元函數(shù)可訪問類的私有成員,但不是類的成員函數(shù)
② 友元函數(shù)不能用const修飾
③ 友元函數(shù)可以在類定義的任何地方聲明,不受類訪問限定符限制
④ 一個(gè)函數(shù)可以是多個(gè)類的友元函數(shù)
⑤ 友元函數(shù)的調(diào)用與普通函數(shù)的調(diào)用和原理相同
1.3 友元成員函數(shù):friend函數(shù)不僅可以是一般函數(shù)(非成員函數(shù)),而且可以是另一個(gè)類中的成員函數(shù)。注意:可能會(huì)用到類的提前引用聲明。
#include <iostream> using namespace std;class Date; //對(duì)Date類的提前引用聲明 class Time { public:Time(int hour, int minute, int second):hour(hour), minute(minute), second(second){}void display(Date& d); //引用Date類的對(duì)象 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函數(shù)為本類的友元函數(shù) private:int year;int month;int day; };void Time::display(Date& d) //定義display函數(shù),只能在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 友元類
①友元類的所有成員函數(shù)都可以是另一個(gè)類的友元函數(shù),都可以訪問另一個(gè)類中的非公有成員。
②友元關(guān)系是單向的,不具有交換性。
比如上述Time類和Date類,在Time類中聲明Date類為其友元類,那么可以在Date類中直接訪問Time類的私有成員變量,但想在Time類中訪問Date類中私有的成員變量則不行。
③友元關(guān)系不能傳遞
如果B是A的友元,C是B的友元,則不能說明C時(shí)A的友元。
1.4友元利弊:友元是對(duì)面向?qū)ο蟮姆庋b性進(jìn)行破環(huán),但是有助于數(shù)據(jù)共享,能提高程序的效率。使用時(shí)做好權(quán)衡!
二、內(nèi)部類
2.1 概念:如果一個(gè)類定義在另一個(gè)類的內(nèi)部,這個(gè)內(nèi)部類就叫做內(nèi)部類。注意此時(shí)這個(gè)內(nèi)部類是一個(gè)獨(dú)立的類,它不屬于外部類,更不能通過外部類的對(duì)象去調(diào)用內(nèi)部類。外部類對(duì)內(nèi)部類沒有任何優(yōu)越的訪問權(quán)限。
注意:內(nèi)部類就是外部類的友元類。注意友元類的定義,內(nèi)部類可以通過外部類的對(duì)象參數(shù)來訪問外部類中的所有成員。但是外部類不是內(nèi)部類的友元。
2.2 特性:
①內(nèi)部類可以定義在外部類的public、protected、private都是可以的。
②注意內(nèi)部類可以直接訪問外部類中的static、枚舉成員,不需要外部類的對(duì)象/類名。
③sizeof(外部類)=外部類,和內(nèi)部類沒有任何關(guān)系。
總結(jié)
- 上一篇: 共享电单车充电桩平台
- 下一篇: c/c++: bss data 段