版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式目錄靜態(tài)成員概述靜態(tài)成員數(shù)據(jù)static修飾靜態(tài)成員函數(shù)const修飾靜態(tài)成員const修飾成員函數(shù)靜態(tài)成員案例單例模式
靜態(tài)成員概述
1、靜態(tài)成員包括靜態(tài)成員數(shù)據(jù)、靜態(tài)成員函數(shù)
2、成員數(shù)據(jù)、成員函數(shù)被static修飾就叫靜態(tài)成員數(shù)據(jù)、靜態(tài)成員函數(shù)
3、不管這個(gè)類(lèi)創(chuàng)建了多少個(gè)對(duì)象,靜態(tài)成員只有一份,這一份被所有屬于這個(gè)類(lèi)的對(duì)象共享。
4、靜態(tài)成員是屬于類(lèi)而不是具體的某個(gè)對(duì)象。
5、靜態(tài)成員是在定義完類(lèi)的時(shí)候就存在了。
靜態(tài)成員數(shù)據(jù)
靜態(tài)變量,是在編譯階段就分配空間,對(duì)象還沒(méi)有創(chuàng)建時(shí),就已經(jīng)分配空間。
靜態(tài)成員變量必須在類(lèi)中聲明,在類(lèi)外定義。
靜態(tài)數(shù)據(jù)成員不屬于某個(gè)對(duì)象,在為對(duì)象分配空間中不包括靜態(tài)成員所占空間。
classData
public:
intnum;//普通成員變量
staticintdata;//靜態(tài)成員變量(類(lèi)內(nèi)聲明)
//定義的時(shí)候不需要加static
intData::data=100;//類(lèi)外定義+初始化
voidtest01()
//data是靜態(tài)成員變量是屬于類(lèi)可以通過(guò)類(lèi)名稱::直接訪問(wèn)
coutData::dataendl;//100
//賦值
Data::data=200;
coutData::dataendl;//200
//data靜態(tài)變量是所有對(duì)象共享的可以通過(guò)對(duì)象名訪問(wèn)
Dataob1;
ob1.data=300;
coutData::dataendl;//300
Dataob2;
coutob2.dataendl;//300
//普通成員變量屬于對(duì)象的只能通過(guò)對(duì)象名訪問(wèn)
ob1.num=100;
cout"ob2.num="ob2.numendl;//隨機(jī)值
//coutData::numendl;//普通成員變量不能通過(guò)類(lèi)名稱訪問(wèn)
}
static修飾靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù):只能訪問(wèn)私有靜態(tài)數(shù)據(jù)
引出:
classData
private:
intnum;//普通成員變量
staticintdata;//靜態(tài)成員變量(類(lèi)內(nèi)聲明)
public:
//普通成員函數(shù)依賴于對(duì)象的必須對(duì)象調(diào)用
intgetData(void)
returndata;
//定義的時(shí)候不需要加static
intData::data=100;//類(lèi)外定義+初始化
voidtest01()
//coutData::dataendl;//err靜態(tài)data是私有的類(lèi)外不能直接訪問(wèn)
//coutData::getData()endl;//errgetData()必須對(duì)象調(diào)用
Dataob;
coutob.getData()endl;
//存在問(wèn)題:data靜態(tài)的在創(chuàng)建對(duì)象之前就已經(jīng)存在
//如果類(lèi)沒(méi)有實(shí)例化對(duì)象難道就不能使用data了嗎?
//解決上述問(wèn)題就要用到靜態(tài)成員函數(shù)
}
靜態(tài)成員函數(shù):
classData
private:
intnum;//普通成員變量
staticintdata;//靜態(tài)成員變量(類(lèi)內(nèi)聲明)
public:
//普通成員函數(shù)依賴于對(duì)象的必須對(duì)象調(diào)用
intgetData(void)
returndata;
//靜態(tài)成員函數(shù)屬于類(lèi)而不屬于對(duì)象
staticintgetDataStatic(void)
returndata;
//定義的時(shí)候不需要加static
intData::data=100;//類(lèi)外定義+初始化
voidtest01()
//coutData::dataendl;//err靜態(tài)data是私有的類(lèi)外不能直接訪問(wèn)
//coutData::getData()endl;//errgetData()必須對(duì)象調(diào)用
Dataob;
coutob.getData()endl;
//存在問(wèn)題:data靜態(tài)的在創(chuàng)建對(duì)象之前就已經(jīng)存在
//如果類(lèi)沒(méi)有實(shí)例化對(duì)象難道就不能使用data了嗎?
//解決上述問(wèn)題就要用到靜態(tài)成員函數(shù)
//1、靜態(tài)成員函數(shù)屬于類(lèi)就可以通過(guò)類(lèi)名稱直接訪問(wèn)
coutData::getDataStatic()endl;
//2、也可以通過(guò)對(duì)象名訪問(wèn)(對(duì)象共享靜態(tài)成員函數(shù))
coutob.getDataStatic()endl;
}
注意:
1、靜態(tài)成員函數(shù)的目的操作靜態(tài)成員數(shù)據(jù)。
2、靜態(tài)成員函數(shù)不能訪問(wèn)非靜態(tài)成員數(shù)據(jù)。(靜態(tài)成員函數(shù)內(nèi)部沒(méi)有this指針)
3、普通成員函數(shù)可以操作靜態(tài)成員數(shù)據(jù)非靜態(tài)成員數(shù)據(jù)。
4、靜態(tài)成員變量和靜態(tài)成員函數(shù)都有權(quán)限之分。
const修飾靜態(tài)成員
如果一個(gè)類(lèi)的成員,既要實(shí)現(xiàn)共享,又要實(shí)現(xiàn)不可改變,那就用staticconst修飾
classData
public:
conststaticintdata;//靜態(tài)成員變量(類(lèi)內(nèi)聲明)
public:
//靜態(tài)成員函數(shù)屬于類(lèi)而不屬于對(duì)象
staticintgetDataStatic(void)
//num=200;//err靜態(tài)成員函數(shù)不能訪問(wèn)普通成員變量
returndata;
//定義的時(shí)候不需要加static
constintData::data=100;//類(lèi)外定義+初始化
voidtest02()
//訪問(wèn)
coutData::dataendl;
//賦值
//Data::data=200;//errdata靜態(tài)成員只讀
coutData::dataendl;
}
const修飾對(duì)象叫常對(duì)象
constintnum=10;//系統(tǒng)不會(huì)給num開(kāi)辟空間num被放入符號(hào)表中如果后期對(duì)num這時(shí)系統(tǒng)才會(huì)給num開(kāi)辟空間
classData
private:
intdata;
mutableintnum;
public:
//遍歷成員的函數(shù)不會(huì)去修改成員的值
//如果函數(shù)不會(huì)更改成員數(shù)據(jù)就讓編譯器知道這是一個(gè)const函數(shù)
voidmyPrintData(void)const
//data=10000;//errconst修飾函數(shù)函數(shù)不能操作普通成員變量
coutthis-dataendl;
//coutdataendl;
//mutable修飾的成員變量可以修改
num=200;
//編譯器認(rèn)為普通成員函數(shù)存在修改成員變量可能
voidsetData(intdata)const
//this-data=data;
return;
Data()
cout"無(wú)參構(gòu)造"endl;
Data(intdata)
this-data=data;
cout"有參構(gòu)造"endl;
Data(constDataob)
this-data=ob.data;
cout"拷貝構(gòu)造"endl;
~Data()
cout"析構(gòu)函數(shù)"endl;
voidtest03()
//常對(duì)象
constDataob1(200);
//常對(duì)象只能調(diào)用const修飾的函數(shù)遍歷成員數(shù)據(jù)
ob1.setData(20000);
ob1.myPrintData();
}
運(yùn)行結(jié)果:
const修飾成員函數(shù)
用const修飾的成員函數(shù)時(shí),const修飾this指針指向的內(nèi)存區(qū)域,成員函數(shù)體內(nèi)不可以修改本類(lèi)中的任何普通成員變量,當(dāng)成員變量類(lèi)型符前用mutable修飾時(shí)例外。
intmyFun(void)const//const修飾的是成員函數(shù)
{}//函數(shù)內(nèi)部不能修改普通成員變量mutable修飾時(shí)例外
classData2
public:
inta;
mutableintb;
public:
Data2(inta,intb):a(a),b(b)
//this-a=a;
//this-b=b;
//const修飾的是整個(gè)成員函數(shù)表明在函數(shù)內(nèi)部只能對(duì)數(shù)據(jù)成員讀操作
voidshowData2(void)const
//a=100;//err
//如果在const修飾的成員函數(shù)中修改成員數(shù)據(jù)的值請(qǐng)事先對(duì)成員數(shù)據(jù)進(jìn)行mutable修飾
b=200;//ok
cout"a="a",b="bendl;
voidtest02()
Data2ob(10,20);
ob.showData2();
}
靜態(tài)成員案例
案例1:靜態(tài)成員統(tǒng)計(jì)類(lèi)實(shí)例化對(duì)象的個(gè)數(shù)
#includeiostream
usingnamespacestd;
classData
public:
Data()
cout"無(wú)參構(gòu)造"endl;
count++;
Data(constDataob)
cout"拷貝構(gòu)造函數(shù)"endl;
count++;
~Data()
count--;
cout"析構(gòu)函數(shù)"endl;
staticintcount;
intData::count=0;
intmain(intargc,char*argv[])
Dataob1;
Dataob2;
Dataob3;
Dataob4;
cout"對(duì)象的個(gè)數(shù):"Data::countendl;
cout"對(duì)象的個(gè)數(shù):"Data::countendl;
return0;
}
運(yùn)行結(jié)果:
單例模式
單例模式所設(shè)計(jì)的類(lèi)只能實(shí)例化一個(gè)對(duì)象。
單例模式的步驟:
1、不允許Printer實(shí)例對(duì)象(把構(gòu)造、拷貝構(gòu)造函數(shù)私有化)
2、定義一個(gè)靜態(tài)對(duì)象指針保存唯一的對(duì)象地址
3、定義一個(gè)靜態(tài)成員函數(shù)拿到唯一的對(duì)象的地址方便外界使用
案例:
單例模式設(shè)計(jì)--打印機(jī)(重要)
步驟1:在單例類(lèi)內(nèi)部定義了一個(gè)Singleton類(lèi)型的靜態(tài)對(duì)象,作為外部共享的唯一實(shí)例
步驟2:提供一個(gè)公共靜態(tài)的方法,讓客戶可以訪問(wèn)它的唯一實(shí)例。
步驟3:為了防止在外部對(duì)實(shí)例化其他對(duì)象,將其默認(rèn)構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)設(shè)計(jì)為私有
#includeiostream
usingnamespacestd;
classPrinter
public:
//2、提供一個(gè)方法獲得單例指針
staticPrinter*getSignlePrint(void)
returnsignlePrint;
//4、設(shè)置功能函數(shù)(自定義)
voidprintText(char*str)
cout"打印"strendl;
count++;
intcount;
private:
//1、定義一個(gè)靜態(tài)的對(duì)象指針變量保存唯一實(shí)例地址
staticPrinter*signlePrint;
private:
//3、防止該類(lèi)實(shí)例化其他對(duì)象將構(gòu)造函數(shù)全部私有
Printer(){count=0;}
Printer(constPrinterob){}
Printer*Printer::signlePrint=newPrinter;
intmain(intargc,char*argv[])
//打印任務(wù)1
Printer*p1=Printer::getSignlePrint(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 大秦醫(yī)院面試題及答案
- C語(yǔ)言基礎(chǔ)選擇測(cè)試題含多知識(shí)點(diǎn)考察及答案
- 感控護(hù)士院感防控知識(shí)試題及答案
- 新疆成人考試真題及答案
- 成都三基試題題庫(kù)附答案
- 市事業(yè)單位招聘考試公共基礎(chǔ)知識(shí)試題題庫(kù)附答案詳解
- 輸血三基考試試題及答案
- 三級(jí)醫(yī)院護(hù)士招聘面試題含答案
- 嵌入式開(kāi)發(fā)面試題及答案
- 河南專(zhuān)升本試題及答案
- 起重設(shè)備安全使用指導(dǎo)方案
- 江蘇省揚(yáng)州市區(qū)2025-2026學(xué)年五年級(jí)上學(xué)期數(shù)學(xué)期末試題一(有答案)
- 干部履歷表(中共中央組織部2015年制)
- GB/T 5657-2013離心泵技術(shù)條件(Ⅲ類(lèi))
- GB/T 3518-2008鱗片石墨
- GB/T 17622-2008帶電作業(yè)用絕緣手套
- GB/T 1041-2008塑料壓縮性能的測(cè)定
- 400份食物頻率調(diào)查問(wèn)卷F表
- 滑坡地質(zhì)災(zāi)害治理施工
- 實(shí)驗(yàn)動(dòng)物從業(yè)人員上崗證考試題庫(kù)(含近年真題、典型題)
- 可口可樂(lè)-供應(yīng)鏈管理
評(píng)論
0/150
提交評(píng)論