




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
靜態(tài)成員動(dòng)態(tài)存儲(chǔ)分配第1頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8動(dòng)態(tài)存儲(chǔ)分配(難點(diǎn))程序在內(nèi)存中的分布new和delete運(yùn)算符復(fù)制構(gòu)造函數(shù)——淺復(fù)制和深復(fù)制析構(gòu)函數(shù)類的靜態(tài)成員分為靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)靜態(tài)數(shù)據(jù)成員如何初始化?是通過(guò)構(gòu)造函數(shù)嗎?靜態(tài)成員函數(shù)的定義和調(diào)用規(guī)則多文件結(jié)構(gòu)主要內(nèi)容第2頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8理解復(fù)制構(gòu)造函數(shù)的作用及其調(diào)用時(shí)機(jī),能正確完成含有資源的對(duì)象復(fù)制理解析構(gòu)函數(shù)的作用和調(diào)用時(shí)機(jī),能正確利用析構(gòu)函數(shù)完成對(duì)象相關(guān)資源的清理能正確使用靜態(tài)成員解決實(shí)際問(wèn)題重點(diǎn)、難點(diǎn)第3頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8回顧--對(duì)象的初始化對(duì)象在定義的時(shí)候?qū)ζ鋽?shù)據(jù)成員進(jìn)行初始化,稱為對(duì)象的初始化C++中對(duì)象的初始化由一個(gè)特殊的成員函數(shù)(構(gòu)造函數(shù))完成其主要功能是創(chuàng)建并初始化對(duì)象如果用戶不自己定義構(gòu)造函數(shù),則編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的構(gòu)造函數(shù)。第4頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8構(gòu)造函數(shù)定義格式:
<類名>::<類名>(<參數(shù)表>){<函數(shù)體>}構(gòu)造函數(shù)名與類名相同,且不指定函數(shù)返回值一般情況下,應(yīng)該構(gòu)造函數(shù)定義為公有成員編譯系統(tǒng)自動(dòng)生成的默認(rèn)構(gòu)造參數(shù)其形式為:
<類名>::<類名>(){}第5頁(yè),共39頁(yè),2023年,2月20日,星期四復(fù)制構(gòu)造函數(shù)主要功能:用一個(gè)已知的對(duì)象來(lái)初始化一個(gè)同類對(duì)象具體聲明格式:
<類名>::<類名>(const<類名>&<對(duì)象名>)復(fù)制構(gòu)造函數(shù)只有一個(gè)參數(shù),是該類對(duì)象的引用若用戶沒(méi)有顯式定義復(fù)制構(gòu)造函數(shù),編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù),其功能是把已知對(duì)象的每個(gè)數(shù)據(jù)成員都復(fù)制到新定義的對(duì)象中第6頁(yè),共39頁(yè),2023年,2月20日,星期四對(duì)象的清理工作對(duì)象的清理工作由析構(gòu)函數(shù)完成主要功能:在對(duì)象生存周期即將結(jié)束的時(shí)刻,由編譯系統(tǒng)自動(dòng)調(diào)用來(lái)完成一些清理工作在程序塊執(zhí)行完最后一條語(yǔ)句后,系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)語(yǔ)法格式為:<類名>::~<類名>(){<函數(shù)體>}第7頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8設(shè)計(jì)一個(gè)整型的Vector類設(shè)計(jì)一個(gè)動(dòng)態(tài)的整型數(shù)組類Vector,它能根據(jù)用戶提供的參數(shù)動(dòng)態(tài)生成元素,即Vectorv1;//生成包含0個(gè)元素的空數(shù)組Vectorv2(n);//生成包含n個(gè)元素的數(shù)組Vectorv2(n,m);//生成包含n個(gè)元素,每個(gè)元素值為m的數(shù)組Vector有別于C語(yǔ)言中的靜態(tài)數(shù)組,它有體現(xiàn)數(shù)組大小的成員size思考:Vector具有哪些成員?如何在程序運(yùn)行起來(lái)以后,根據(jù)用戶從鍵盤輸入的n和m創(chuàng)建數(shù)組?第8頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8分析Vector的數(shù)據(jù)成員有:intSIZE;//數(shù)組當(dāng)前元素個(gè)數(shù)intelems[n];???還是int*elems;???Vector的成員函數(shù)有:構(gòu)造函數(shù)(3個(gè),分別實(shí)現(xiàn)默認(rèn)初始化和帶參初始化)返回下標(biāo)為i的元素,intat(intindex);輸出數(shù)組所有元素,voidprint();返回?cái)?shù)組當(dāng)前元素個(gè)數(shù),intsize();動(dòng)態(tài)創(chuàng)建數(shù)組需要用到動(dòng)態(tài)存儲(chǔ)分配靜態(tài)數(shù)組指數(shù)組長(zhǎng)度在編譯時(shí)即定義好,在整個(gè)程序運(yùn)行過(guò)程中,大小無(wú)法改變動(dòng)態(tài)數(shù)組在程序運(yùn)行中,可根據(jù)需要重新指定大小第9頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8試著思考:為什么定義數(shù)組的時(shí)候下標(biāo)必須是常量?intarr[10];為什么不能是:intm,intarr[m];scanf(“%d”,&m);一個(gè)已經(jīng)編譯完成的C程序取得并使用4塊在邏輯上不同并且用于不同目的的內(nèi)存區(qū)域。程序的內(nèi)存映象棧堆靜態(tài)存儲(chǔ)區(qū)程序區(qū)第10頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8程序運(yùn)行時(shí)需要占用多大的空間需要在編譯時(shí)確定,便于操作系統(tǒng)為程序分配適當(dāng)?shù)膬?nèi)存空間。從靜態(tài)存儲(chǔ)區(qū)分配:程序的全局變量和靜態(tài)變量都在這里分配,且在編譯時(shí)已經(jīng)分配好,在程序終止前被操作系統(tǒng)回收。在棧上創(chuàng)建:在函數(shù)調(diào)用時(shí),函數(shù)的形參和局部變量都在棧上創(chuàng)建,函數(shù)執(zhí)行完畢時(shí)這些內(nèi)存自動(dòng)被釋放掉。從堆(heap)上分配:在程序運(yùn)行期間,用動(dòng)態(tài)存儲(chǔ)分配函數(shù)申請(qǐng)和釋放的內(nèi)存程序中變量的內(nèi)存分配方式第11頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8由動(dòng)態(tài)內(nèi)存管理系統(tǒng)管理的這塊內(nèi)存區(qū)域叫做“堆(heap)”:當(dāng)需要?jiǎng)討B(tài)靈活地分配內(nèi)存空間時(shí),需要用到動(dòng)態(tài)存儲(chǔ)分配動(dòng)態(tài)分配得到的內(nèi)存塊位于堆中,且沒(méi)有名字動(dòng)態(tài)存儲(chǔ)分配由庫(kù)函數(shù)malloc.h提供格式:p=(double*)malloc(n*sizeof(double))C++中動(dòng)態(tài)存儲(chǔ)分配由運(yùn)算符new和delete實(shí)現(xiàn)new和delete完成動(dòng)態(tài)存儲(chǔ)分配時(shí),可以很好地和構(gòu)造函數(shù)、析構(gòu)函數(shù)進(jìn)行交互,malloc和free不能自行調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)動(dòng)態(tài)存儲(chǔ)分配第12頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8具體方法:指針變量名=new類型;指針變量名=new類型(初值);指針變量名=new類型[元素個(gè)數(shù)];當(dāng)執(zhí)行new時(shí),有兩件事發(fā)生:大小適當(dāng)?shù)目臻g被分配給特定類型的變量;該存儲(chǔ)空間首地址作為new表達(dá)式的返回值,若分配失敗則返回0;基本類型一般不采用動(dòng)態(tài)存儲(chǔ)分配動(dòng)態(tài)存儲(chǔ)空間的分配第13頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8用new分配的空間一定要用delete回收具體使用格式:delete指針變量名delete[]指針變量名//用于動(dòng)態(tài)數(shù)組的內(nèi)存回收delete只能用于回收new所分配的空間對(duì)于一個(gè)指針指向的堆對(duì)象只能執(zhí)行一次delete操作delete[]忽略括符內(nèi)的具體數(shù)字,無(wú)論是幾維數(shù)組的空間回收均只用一個(gè)括符表示動(dòng)態(tài)存儲(chǔ)空間的回收第14頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8說(shuō)明以下定義的區(qū)別a)intival=1024;c)int*ip2=newint(1024);b)int*pi=&ival;d)int*ip3=newint[1024];第15頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8vector::vector(intilen,int*ielems){
inti;
length=ilen; elems=newint[length]; for(i=0;i<length;i++) elems[i]=ielems[i];}第16頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8構(gòu)造函數(shù)的初始化列表vector::vector(intilen,int*ielems):length(ilen){
inti;
elems=newint[length]; for(i=0;i<length;i++) elems[i]=ielems[i];}//初始化列表只能出現(xiàn)在成員函數(shù)的定義中??!第17頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8#include"vector.h"intmain(){ intarr[5]={1,2,3,4,5};
vectorv1(arr,5),v2; cout<<"elemsatindex"<<3<<":"<<v1.at(3)<<endl; cout<<"lengthofv2is:"<<v2.len()<<endl; return0;}第18頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8對(duì)象的清理工作對(duì)象的清理工作由析構(gòu)函數(shù)完成主要功能:在對(duì)象生存周期即將結(jié)束的時(shí)刻,由編譯系統(tǒng)自動(dòng)調(diào)用來(lái)完成一些清理工作在程序塊執(zhí)行完最后一條語(yǔ)句后,系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)語(yǔ)法格式為:<類名>::~<類名>(){<函數(shù)體>}第19頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8vector的析構(gòu)函數(shù)vector::~vector(){cout<<"對(duì)象正在析構(gòu)……"<<endl;delete[]elems;//回收指針elems所指堆內(nèi)存}第20頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8幾點(diǎn)說(shuō)明析構(gòu)函數(shù)與類同名,無(wú)參數(shù),無(wú)需指定返回值析構(gòu)函數(shù)不能有參數(shù),因此不能重載析構(gòu)函數(shù)不能回收對(duì)象本身所占空間如果不需要做清理工作,類可以沒(méi)有析構(gòu)函數(shù)思考:在vector中,對(duì)象v1和v2能不能正確析構(gòu)??考慮對(duì)象的內(nèi)存分布……第21頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8對(duì)象的復(fù)制機(jī)制Copy?hello5堆對(duì)象s5305053050v1v2Copy123453050第22頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8深復(fù)制、淺復(fù)制5thello5堆對(duì)象s淺復(fù)制Copyhello5堆對(duì)象shello5堆對(duì)象t深復(fù)制Copy當(dāng)對(duì)象擁有資源時(shí),C++提供復(fù)制構(gòu)造函數(shù)實(shí)現(xiàn)深復(fù)制第23頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8復(fù)制構(gòu)造函數(shù)主要功能:用一個(gè)已知的對(duì)象來(lái)初始化一個(gè)同類對(duì)象具體聲明格式:
<類名>::<類名>(const<類名>&<對(duì)象名>)復(fù)制構(gòu)造函數(shù)只有一個(gè)參數(shù),是該類對(duì)象的引用若用戶沒(méi)有顯式定義復(fù)制構(gòu)造函數(shù),編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù),其功能是把已知對(duì)象的每個(gè)數(shù)據(jù)成員都復(fù)制到新定義的對(duì)象中第24頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8vector類的復(fù)制構(gòu)造函數(shù)vector::vector(constvector&v){length=v.length;elems=newint[v.length];for(i=0;i<length;i++)elems[i]=v.GetElemsi[i];}第25頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8以下3種情況系統(tǒng)調(diào)用復(fù)制構(gòu)造函數(shù):用類的一個(gè)對(duì)象初始化同類的另一個(gè)對(duì)象時(shí)對(duì)象作為函數(shù)參數(shù)傳遞給函數(shù)形參時(shí)函數(shù)返回值是類的對(duì)象,函數(shù)調(diào)用完成時(shí)返回第26頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8觀察下來(lái)程序#include<iostream>usingnamespacestd;classCircle{public: Circle(doubleR=1,doublep=3.14){setR(R,p);}
doublegetArea()const{returnpi*r*r;}
doublegetR()const{returnr;}
voidsetR(doubleR=1,doublep=3.14){r=R;pi=p;}private: doubler;
doublepi;};第27頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8intmain(){Circlec1(1),c2(7),c3(6.9); cout<<"areaofc1="<<c1.getArea()<<endl; cout<<"areaofc2="<<c2.getArea()<<endl; cout<<"areaofc3="<<c3.getArea()<<endl; return0;}第28頁(yè),共39頁(yè),2023年,2月20日,星期四分析Circle類3個(gè)對(duì)象的內(nèi)存分布不同對(duì)象中存在同一數(shù)據(jù)的副本浪費(fèi)儲(chǔ)存空間2023/5/813.1473.146.93.14第29頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8理想狀態(tài)多個(gè)對(duì)象共用一個(gè)3.14的內(nèi)存副本13.1476.95.5第30頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8靜態(tài)數(shù)據(jù)成員的定義:static<靜態(tài)數(shù)據(jù)成員名>;例如:staticintcount;和全局變量一樣,靜態(tài)數(shù)據(jù)成員在程序一開始就存在,程序結(jié)束才銷毀,因此必須在程序已開始運(yùn)行就初始化因此靜態(tài)數(shù)據(jù)成員不能在任何函數(shù)內(nèi)分配存儲(chǔ)空間和初始化,最好在類的實(shí)現(xiàn)部分初始化靜態(tài)成員的調(diào)用:類名::靜態(tài)成員靜態(tài)成員第31頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8classCircle{public: Circle(doubleR=1){setR(R);++COUNT;cout<<"obj"<<COUNT<<'('<<r<<')'<<endl;} doublegetArea()const{returnpi*r*r;} doublegetR()const{returnr;} ~Circle(){cout<<"obj"<<COUNT<<"destucting..."<<endl;--COUNT;} voidsetR(doubleR=1){r=R;}
staticintcount(){returnCOUNT;}private: doubler;
staticdoublepi;
staticintCOUNT;};第32頁(yè),共39頁(yè),2023年,2月20日,星期四doubleCircle::pi=3.14;//靜態(tài)成員初始化intCircle::COUNT=0;intmain(){Circlec1(1),c2(7),c3(6.9); cout<<"areaofc1="<<c1.getArea()<<endl; cout<<"areaofc2="<<c2.getArea()<<endl; cout<<"areaofc3="<<c3.getArea()<<endl; return0;}2023/5/8第33頁(yè),共39頁(yè),2023年,2月20日,星期四觀察程序運(yùn)行結(jié)果對(duì)象的構(gòu)造函數(shù)調(diào)用順序跟析構(gòu)函數(shù)的調(diào)用順序剛好相反構(gòu)造順序:c1、c2、c3析構(gòu)順序:c3、c2、c1靜態(tài)成員在這里實(shí)現(xiàn)了對(duì)Circle類對(duì)象進(jìn)行計(jì)數(shù)的功能2023/5/8第34頁(yè),共39頁(yè),2023年,2月20日,星期四2023/5/8小結(jié)類的靜態(tài)數(shù)據(jù)成員一般在類的實(shí)現(xiàn)文件頭部進(jìn)行初始化,避免在主函數(shù)的cpp文件初始化類的靜態(tài)和非靜態(tài)成員函數(shù)均可訪問(wèn)靜態(tài)數(shù)據(jù)成員類的靜態(tài)成員函數(shù)能直接訪問(wèn)靜態(tài)數(shù)據(jù)成員,若需訪問(wèn)普通數(shù)據(jù)成員,需將該成員作為函數(shù)參數(shù)傳遞進(jìn)來(lái)第35頁(yè),共39頁(yè),2023年,2月20日,星期四課堂練習(xí)--商場(chǎng)的VIP促銷活動(dòng)持VIP卡到商場(chǎng)購(gòu)物享受9折優(yōu)惠活動(dòng)當(dāng)天購(gòu)物滿300者,送50元電子消費(fèi)禮券前100名VIP顧客來(lái)店即送10元電子消費(fèi)禮券請(qǐng)編寫程序幫助商場(chǎng)實(shí)現(xiàn)此次促銷活動(dòng)第36頁(yè),共39頁(yè),2023年,2月20日,星期四設(shè)計(jì)VIPCard類classVIPCard{pub
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 化工工藝知識(shí)培訓(xùn)課件
- 醫(yī)院污水應(yīng)急演練
- 區(qū)塊鏈公司發(fā)展報(bào)告范文
- 請(qǐng)求撤銷科室的報(bào)告范文
- 2025年度茶葉種植基地土地流轉(zhuǎn)與租賃合同
- 2025年度智慧農(nóng)業(yè)項(xiàng)目變更合同聲明及條件細(xì)化
- 玉米種植戶與農(nóng)業(yè)保險(xiǎn)公司合作協(xié)議(2025年度)
- 2025年度水產(chǎn)品電商平臺(tái)與電商平臺(tái)服務(wù)商合作協(xié)議
- MySQL教程(新體系-綜合應(yīng)用實(shí)例視頻)(第4版)習(xí)題及答案 -第02章
- 二零二五年度地下車庫(kù)車位使用權(quán)附帶車位清潔服務(wù)合同
- 2025年黑龍江旅游職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)含答案
- 工藝技術(shù)人員工作總結(jié)
- 醫(yī)院護(hù)理人文關(guān)懷實(shí)踐規(guī)范專家共識(shí)課件
- DeepSeek在自然災(zāi)害預(yù)警中的潛力
- 2025年專利技術(shù)保密協(xié)議書模板
- 個(gè)人合伙開店合同范本
- 2025年江西省高職單招《職業(yè)適應(yīng)性測(cè)試》高頻必練考試題庫(kù)400題(帶答案)
- 2024年設(shè)備監(jiān)理師考試題庫(kù)及答案參考
- 2025年一次性死亡賠償協(xié)議模板(2篇)
- 第6課 識(shí)別界限 拒絕性騷擾 課件 2024-2025學(xué)年人教版(2024)初中體育與健康七年級(jí)全一冊(cè)
- 【MOOC】《思想道德與法治》(東南大學(xué))章節(jié)中國(guó)大學(xué)慕課答案
評(píng)論
0/150
提交評(píng)論