C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式_第1頁(yè)
C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式_第2頁(yè)
C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式_第3頁(yè)
C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式_第4頁(yè)
C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論