




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第C++類與對象深入之靜態(tài)成員與友元及內(nèi)部類詳解目錄一:靜態(tài)成員1.1:靜態(tài)成員分類1.2:靜態(tài)成員變量1.3:靜態(tài)成員函數(shù)1.4:總結(jié)特性1.5:試題示例1.6:C++11成員初始化新玩法二:友元2.1:全局函數(shù)做友元2.2:類做友元2.3:成員函數(shù)做友元三:內(nèi)部類3.1:概念3.2:特性
一:靜態(tài)成員
靜態(tài)成員就是在成員變量和成員函數(shù)前加上關鍵字static,稱為靜態(tài)成員。C++里面盡量用靜態(tài)成員變量代替全局變量。
1.1:靜態(tài)成員分類
1?靜態(tài)成員變量:
所有對象共享同一份數(shù)據(jù)在編譯階段分配內(nèi)存類內(nèi)聲明,類外初始化
靜態(tài)成員函數(shù)
所有對象共享同一個函數(shù)靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量
1.2:靜態(tài)成員變量
classPerson
public:
staticintm_A;//靜態(tài)成員變量
private:
staticintm_B;//靜態(tài)成員變量也是有訪問權(quán)限的
intPerson::m_A=10;
intPerson::m_B=10;
voidtest01()
//靜態(tài)成員變量兩種訪問方式
//1、通過對象
Personp1;
p1.m_A=100;
cout"p1.m_A="p1.m_Aendl;
Personp2;
p2.m_A=200;
cout"p1.m_A="p1.m_Aendl;//共享同一份數(shù)據(jù)
cout"p2.m_A="p2.m_Aendl;
//2、通過類名
cout"m_A="Person::m_Aendl;
//cout"m_B="Person::m_Bendl;//私有權(quán)限訪問不到
intmain(){
test01();
system("pause");
return0;
代碼解釋:上述代碼我們主要驗證了利用兩種方式來訪問靜態(tài)成員變量,以及靜態(tài)成員變量屬于整個類,屬于類的所有對象
1.3:靜態(tài)成員函數(shù)
classPerson
public:
staticvoidfunc()
cout"func調(diào)用"endl;
m_A=100;
//m_B=100;//錯誤,不可以訪問非靜態(tài)成員變量
staticintm_A;//靜態(tài)成員變量
intm_B;//
private:
//靜態(tài)成員函數(shù)也是有訪問權(quán)限的
staticvoidfunc2()
cout"func2調(diào)用"endl;
intPerson::m_A=10;
voidtest01()
//靜態(tài)成員變量兩種訪問方式
//1、通過對象
Personp1;
p1.func();
//2、通過類名
Person::func();
//Person::func2();//私有權(quán)限訪問不到
intmain(){
test01();
system("pause");
return0;
}
代碼解釋:上述代碼我們主要驗證了利用兩種方式來訪問靜態(tài)成員函數(shù),利用對象訪問和利用類名訪問,以及靜態(tài)成員函數(shù)只可以訪問靜態(tài)成員變量
??????:為什么不可以訪問非靜態(tài)成員?
??因為沒有this指針
1.4:總結(jié)特性
靜態(tài)成員為所有類對象所共享,不屬于某個具體的類實例靜態(tài)成員變量必須在類外定義,定義時不加static關鍵字類靜態(tài)成員類名::靜態(tài)成員或者對象.靜態(tài)成員來訪問靜態(tài)成員函數(shù)沒有隱含的this指針,不可以訪問任何非靜態(tài)成員靜態(tài)成員和類的普通成員也一樣,也有三種訪問權(quán)限,也可以有返回值。
1.5:試題示例
?實現(xiàn)一個類,計算程序中創(chuàng)建了多少個類對象
classA
public:
A(){
++_count1;
A(constAaa){
++_count2;
//成員函數(shù)也可以是靜態(tài),static成員函數(shù)沒有this指針
staticintGetCount1(){
return_count1;
staticintGetCount2(){
return_count2;
//private:
//靜態(tài)成員變量屬于整個類,所以類的所有對象
staticint_count1;
staticint_count2;//聲明
//定義
intA::_count1=0;
intA::_count2=0;
AFunc(Aa)
Acopy(a);
returncopy;
intmain()
Aa1;
Aa2=Func(a1);
couta1._count1endl;
couta2._count1endl;
couta1._count2endl;
couta2._count2endl;
coutA::_count1endl;
coutA::_count2endl;
couta1.GetCount1()endl;
couta2.GetCount2()endl;
coutA::GetCount1()endl;
coutA::GetCount2()endl;
system("pause");
return0;
1
1
3
3
1
3
1
3
1
3
請按任意鍵繼續(xù)...
1.6:C++11成員初始化新玩法
classB
public:
B(intb=0)
:_b(b)
int_b;
classA
public:
//A()//其實是編譯器自己生產(chǎn)的默認構(gòu)造函數(shù)用缺省值初始化
//:a(10)
//,b(20)
//,p((int*)malloc(4))
//{}
voidPrint()
coutaendl;
coutb._bendl;
coutpendl;
coutnendl;
private:
//非靜態(tài)成員變量,可以在成員聲明時給缺省值。
inta=10;
Bb=20;//單參數(shù)的構(gòu)造函數(shù),支持隱式類型的轉(zhuǎn)換
int*p=(int*)malloc(4);
staticintn;
//非靜態(tài)成員變量定義在構(gòu)造函數(shù)
//靜態(tài)在類外
intA::n=0;
intmain()
Aa;
a.Print();
system("pause");
return0;
}
二:友元
在程序里,有些私有屬性也想讓類外特殊的一些函數(shù)或者類進行訪問,就需要用到友元的技術(shù)
友元的目的就是讓一個函數(shù)或者類訪問另一個類中私有成員
友元的關鍵字為friend
友元分為:
友元函數(shù)友元類
友元的三種實現(xiàn):
全局函數(shù)做友元
類做友元
成員函數(shù)做友元
2.1:全局函數(shù)做友元
??說明:友元函數(shù)可以直接訪問類的私有成員,它是定義在類外部的普通成員函數(shù),不屬于任何類,但需要在類的內(nèi)部聲明,聲明的時候需要加friend關鍵字。
classBuilding
//告訴編譯器goodGay全局函數(shù)是Building類的好朋友,可以訪問類中的私有內(nèi)容
friendvoidgoodGay(Building*building);
public:
Building(){
this-m_SittingRoom="客廳";
this-m_BedRoom="臥室";
public:
stringm_SittingRoom;//客廳
private:
stringm_BedRoom;//臥室
voidgoodGay(Building*building){
cout"好基友正在訪問:"building-m_SittingRoomendl;
cout"好基友正在訪問:"building-m_BedRoomendl;
voidtest01(){
Buildingb;
goodGay(
intmain(){
test01();
system("pause");
return0;
}
代碼解釋:如上述代碼中,我們需要告訴編譯器goodGay全局函數(shù)是Building類的好朋友,可以訪問類中的私有內(nèi)容
2.2:類做友元
友元類的所有成員函數(shù)都可以是另一個類的友元函數(shù),都可以訪問另一個類的非公有成員。
友元關系是單向的,不具有交換性。友元關系不可以傳遞。如果B是A的友元,C是B的友元,但是不可以說C是A的友元。
代碼示例:
classBuilding;
classgoodGay
public:
goodGay();
voidvisit();
private:
Building*building;
classBuilding
//告訴編譯器goodGay類是Building類的好朋友,可以訪問到Building類中私有內(nèi)容
friendclassgoodGay;
public:
Building();
public:
stringm_SittingRoom;//客廳
private:
stringm_BedRoom;//臥室
Building::Building(){
this-m_SittingRoom="客廳";
this-m_BedRoom="臥室";
goodGay::goodGay(){
building=newBuilding;
voidgoodGay::visit(){
cout"好基友正在訪問"building-m_SittingRoomendl;
cout"好基友正在訪問"building-m_BedRoomendl;
voidtest01(){
goodGaygg;
gg.visit();
intmain(){
test01();
system("pause");
return0;
}
代碼解釋:如上述代碼中,我們需要告訴編譯器告訴編譯器goodGay類是Building類的好朋友,可以訪問到Building類中私有內(nèi)容
2.3:成員函數(shù)做友元
一個類的成員函數(shù)做另一個類的友元。
代碼示例:
classBuilding;//提前聲明
classgoodGay
public:
goodGay();
voidvisit();//只讓visit函數(shù)作為Building的好朋友,可以發(fā)訪問Building中私有內(nèi)容
voidvisit2();
private:
Building*building;
classBuilding
//告訴編譯器goodGay類中的visit成員函數(shù)是Building好朋友,可以訪問私有內(nèi)容
friendvoidgoodGay::visit();
public:
Building();
public:
stringm_SittingRoom;//客廳
private:
stringm_BedRoom;//臥室
Building::Building(){
this-m_SittingRoom="客廳";
this-m_BedRoom="臥室";
goodGay::goodGay(){
building=newBuilding;
voidgoodGay::visit(){
cout"好基友正在訪問"building-m_SittingRoomendl;
cout"好基友正在訪問"building-m_BedRoomendl;
voidgoodGay::visit2(){
cout"好基友正在訪問"building-m_SittingRoomendl;
//cout"好基友正在訪問"building-m_BedRoomendl;
voidtest01(){
goodGaygg;
gg.visit();
intmain(){
test01();
system("pause");
return0;
}
代碼解釋:如上述代碼中,我們需要告訴編譯器goodGay類中的visit成員函數(shù)是Building好朋友,可以訪問私有內(nèi)容
三:內(nèi)部類
3.1:概念
概念:如果一個類定義在另一個類的內(nèi)部,這個類就叫內(nèi)部類。注意此時的內(nèi)部類是一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術(shù)服務合同范式
- 無人機高級應用實戰(zhàn)指南試題及答案
- 在不同天氣條件下的無人機考試適應性試題及答案
- 消防安全法律責任研討試題及答案
- 助力成功2025年入團考試試題及答案
- 碩士外語考試的安全管理概念試題及答案
- 碩士外語與安全合規(guī)知識試題及答案
- 區(qū)塊鏈技術(shù)在物聯(lián)網(wǎng)通信中的應用
- 2025年環(huán)境影響評價工程師考試真題卷:環(huán)境影響評價報告質(zhì)量評估試題
- 醫(yī)學教育中倫理教育的實施與評估
- 2023年南京大學校聘崗位招聘筆試真題
- 魏晉南北朝課件好看
- TSG-Z7001-2025《特種設備檢驗檢測機構(gòu)核準規(guī)則》
- 尼康D5200說明書簡體中文
- 4.1 樹與二叉樹(教學課件)-高中《信息技術(shù)》選修1數(shù)據(jù)與數(shù)據(jù)結(jié)構(gòu)同步高效課堂(浙教版)
- 《職業(yè)衛(wèi)生》專題培訓
- 建行個人經(jīng)營性貸款合同
- 2024年江蘇省南通市中考地理試題(含答案)
- 《現(xiàn)代企業(yè)管理學》本科教材
- 工業(yè)園區(qū)消防安全管理制度
- 慢阻肺康復治療病例匯報
評論
0/150
提交評論