靜態(tài)成員動(dòng)態(tài)存儲(chǔ)分配_第1頁(yè)
靜態(tài)成員動(dòng)態(tài)存儲(chǔ)分配_第2頁(yè)
靜態(tài)成員動(dòng)態(tài)存儲(chǔ)分配_第3頁(yè)
靜態(tài)成員動(dòng)態(tài)存儲(chǔ)分配_第4頁(yè)
靜態(tài)成員動(dòng)態(tài)存儲(chǔ)分配_第5頁(yè)
已閱讀5頁(yè),還剩34頁(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)介

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

最新文檔

評(píng)論

0/150

提交評(píng)論