版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
動(dòng)態(tài)內(nèi)存分配1本章主要內(nèi)容基本數(shù)據(jù)類型的初始化單個(gè)對(duì)象內(nèi)存的動(dòng)態(tài)分配與釋放對(duì)象數(shù)組內(nèi)存的動(dòng)態(tài)分配與釋放使用new和delete在空閑存儲(chǔ)區(qū)中存儲(chǔ)字符串多維數(shù)組內(nèi)存的動(dòng)態(tài)分配與釋放內(nèi)存分配:靜態(tài)與動(dòng)態(tài)靜態(tài)內(nèi)存分配:編譯器在處理程序源代碼時(shí)(即編譯時(shí))分配。動(dòng)態(tài)內(nèi)存分配:程序執(zhí)行時(shí)調(diào)用運(yùn)行時(shí)刻庫(kù)函數(shù)來(lái)分配。靜態(tài)與動(dòng)態(tài)內(nèi)存分配的三個(gè)主要區(qū)別:靜態(tài)對(duì)象是有名字的變量,我們直接對(duì)其進(jìn)行操作。而動(dòng)態(tài)對(duì)象是沒有名字的變量,我們通過(guò)指針間接地對(duì)它進(jìn)行操作。靜態(tài)對(duì)象的分配與釋放由編譯器自動(dòng)處理。程序員需要理解這一點(diǎn),但不需要做任何事情。相反,動(dòng)態(tài)對(duì)象地分配與釋放,必須由程序員顯示地管理,相對(duì)來(lái)說(shuō)比較容易出錯(cuò)。
內(nèi)存分配內(nèi)存分配:靜態(tài)與動(dòng)態(tài)效率與靈活性之間的平衡準(zhǔn)則不同。靜態(tài)內(nèi)存分配是在程序執(zhí)行之前進(jìn)行的因而效率比較高,但是它缺少靈活性,它要求在程序執(zhí)行之前就知道所需內(nèi)存的類型和數(shù)量。例如:利用靜態(tài)分配的字符串?dāng)?shù)組,我們無(wú)法很容易地處理和存儲(chǔ)任意的文本文件一般來(lái)說(shuō)存儲(chǔ)未知數(shù)目的元素需要?jiǎng)討B(tài)內(nèi)存分配的靈活性。
內(nèi)存分配概述在C語(yǔ)言中進(jìn)行內(nèi)存的動(dòng)態(tài)分配與釋放,我們使用malloc()和free()函數(shù)。C++中不再使用C語(yǔ)言中的malloc()和free()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配與釋放。因?yàn)椋簃alloc()函數(shù)在運(yùn)行時(shí)從自由內(nèi)存中分配存儲(chǔ)單元。在C++中創(chuàng)建對(duì)象時(shí)會(huì)發(fā)生兩件事情:(1)為對(duì)象分配內(nèi)存;(2)調(diào)用構(gòu)造函數(shù)來(lái)初始化那個(gè)內(nèi)存。而構(gòu)造函數(shù)不允許向它傳遞內(nèi)存地址來(lái)進(jìn)行初始化。在C++中使用new和delete來(lái)進(jìn)行內(nèi)存的動(dòng)態(tài)分配與釋放。new會(huì)觸發(fā)類對(duì)象的構(gòu)造函數(shù)delete會(huì)觸發(fā)類對(duì)象的析構(gòu)函數(shù)
動(dòng)態(tài)內(nèi)存分配動(dòng)態(tài)申請(qǐng)內(nèi)存操作符new語(yǔ)法格式:類型名T*指針變量名P=
new類型名T(初值列表);功能:在程序執(zhí)行期間,申請(qǐng)用于存放T類型對(duì)象的連續(xù)的、未命名的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存。失?。?(NULL)new運(yùn)算符是一個(gè)一元運(yùn)算符。它隱含地生成一個(gè)函數(shù)來(lái)調(diào)用函數(shù)operatornew(),從這個(gè)函數(shù)返回被分配內(nèi)存對(duì)象的指針。
動(dòng)態(tài)內(nèi)存分配釋放內(nèi)存操作符delete語(yǔ)法格式:delete指針變量名P;delete[]指針變量名P;功能:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。delete表達(dá)式首先調(diào)用析構(gòu)函數(shù),然后釋放內(nèi)存(經(jīng)常調(diào)用free())。若正在刪除的指針是0,則將不發(fā)生任何事情,是安全的。故開發(fā)人員經(jīng)常在刪除指針后立即把指針賦值為0以免對(duì)它刪除兩次(對(duì)一個(gè)對(duì)象刪除兩次可能會(huì)產(chǎn)生某些問(wèn)題)。使用deletevoid*可能會(huì)出錯(cuò)如果想對(duì)一個(gè)void*類型指針進(jìn)行delete操作,要注意這將可能成為一個(gè)程序錯(cuò)誤,除非指針?biāo)傅膬?nèi)容是非常簡(jiǎn)單的,因?yàn)樗鼘⒉粓?zhí)行析構(gòu)函數(shù)。一個(gè)void*指針被初始化時(shí)指向“元”數(shù)據(jù)(它沒有指向含有析構(gòu)函數(shù)的對(duì)象),在調(diào)用delete刪除void*指針時(shí)不會(huì)發(fā)生什么錯(cuò)誤,因?yàn)樗枰膬H是釋放指針本身(對(duì)象)的這塊內(nèi)存。但這樣只會(huì)釋放對(duì)象的內(nèi)存,不調(diào)用析構(gòu)函數(shù),從而也就不會(huì)釋放指針?biāo)赶虻臄?shù)據(jù)的內(nèi)存,這樣就會(huì)引起內(nèi)存泄漏。編譯這樣的程序時(shí),編譯器會(huì)認(rèn)為我們知道所做的一切,從而編譯器不會(huì)給出任何警告。所以對(duì)于void指針必須轉(zhuǎn)換為適當(dāng)?shù)念愋?。如何為單個(gè)對(duì)象分配動(dòng)態(tài)內(nèi)存語(yǔ)法格式:
數(shù)據(jù)類型T*指針變量名P=new數(shù)據(jù)類型T(初始化列表);示例:
int*ptrInt=newint;//Oneint
double*ptrDouble=newdouble;//Onedoublefloat**ptrPtrFloat=newfloat*;//Onepointer-to-float不同類型所占用的不同的空間由編譯器自動(dòng)處理。
動(dòng)態(tài)內(nèi)存分配如何初始化基本類型C++中很重要的一點(diǎn)就是遵循PITA規(guī)則,即要在創(chuàng)建對(duì)象時(shí)初始化對(duì)象而不是先創(chuàng)建對(duì)象然后再賦值??梢栽谌魏螘r(shí)候初始化由空閑存儲(chǔ)區(qū)分配的單個(gè)對(duì)象。初始化方法:在特定的類型后面使用圓括號(hào)內(nèi)的初始化值來(lái)完成。
new數(shù)據(jù)類型T(初始化列表);
動(dòng)態(tài)內(nèi)存分配示例:
int*ptrInt=newint(100);double*ptrDouble=newdouble(1.414);float*ptrFloat=newfloat(3.1415926F);float**ptrPtrFloat=newfloat*(ptrFloat);
動(dòng)態(tài)內(nèi)存分配如何初始化基本類型空?qǐng)A括號(hào)的含義在new表達(dá)式中,可以在類型名后使用空?qǐng)A括號(hào):new數(shù)據(jù)類型T();功能:將初始化為數(shù)據(jù)類型T的默認(rèn)值。
動(dòng)態(tài)內(nèi)存分配new數(shù)據(jù)類型T;與new數(shù)據(jù)類型T();的區(qū)別示例:
int*ptrInt1=newint;//Valueisunknown
int*ptrInt1=newint();//Valueiszero說(shuō)明:第一種情況下,在空閑存儲(chǔ)區(qū)中創(chuàng)建了一個(gè)int類型對(duì)象,但其值未知。在第二種情況下,在空閑存儲(chǔ)區(qū)中創(chuàng)建了一個(gè)int類型對(duì)象并初始化為int在全局作用域中的值(默認(rèn)值)。而所有的全局基本類型在默認(rèn)情況下的初始值為0,故第二種情況在創(chuàng)建了對(duì)象后將其值初始化為0。
動(dòng)態(tài)內(nèi)存分配如何釋放單個(gè)對(duì)象的空閑空間語(yǔ)法格式:delete指針變量名P;指針變量名P=NULL;功能:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。刪除基于0的指針(空指針)總是一種安全的操作。
動(dòng)態(tài)內(nèi)存分配如何為對(duì)象數(shù)組分配空閑空間語(yǔ)法格式:數(shù)據(jù)類型T*指針變量名P=new數(shù)據(jù)類型T[元素個(gè)數(shù)];功能:在空閑空間分配對(duì)象數(shù)組,指針P指向數(shù)組的第一個(gè)元素。如果在方括號(hào)中的表達(dá)式的值為0,則就會(huì)分配沒有元素的數(shù)組,new表達(dá)式返回的指針是非0值,并且與其他指向任何對(duì)象的指針都不同。如果這個(gè)值在運(yùn)行期間被確定是無(wú)效的,則結(jié)果不可預(yù)知。
動(dòng)態(tài)內(nèi)存分配如何為對(duì)象數(shù)組分配空閑空間示例:
//Arrayof5intsint*ptrInt=newint[5];
//Arrayof6doubles
intdimension=6;double*ptrDouble=newdouble[dimension];
動(dòng)態(tài)內(nèi)存分配如何為對(duì)象數(shù)組分配空閑空間不可能初始化數(shù)組:在C++中并沒有語(yǔ)法來(lái)真正的初始化空閑存儲(chǔ)區(qū)中的各個(gè)元素(不遵循PITA規(guī)則)。對(duì)于所有的基本數(shù)據(jù)類型而言,每個(gè)元素的值都是未知的,所能做的就是在創(chuàng)建數(shù)組之后,再給每個(gè)元素賦值,如下所示:
intconstdimension=5;
//Allocatespacefor5ints,alluninitializedint*ptrInt=newint[dimension];
//Providesomemeaningfulvaluesfor(inti=0;i<dimension;++i)
ptrInt[i]=i;說(shuō)明:空閑存儲(chǔ)區(qū)中用戶自定義數(shù)據(jù)類型的數(shù)組可以被初始化。
動(dòng)態(tài)內(nèi)存分配如何釋放對(duì)象數(shù)組的空閑空間語(yǔ)法格式:delete[]指針變量名P;功能:釋放空閑存儲(chǔ)區(qū)中的對(duì)象數(shù)組內(nèi)存空間。說(shuō)明:必須用方括號(hào)“[]”來(lái)通知編譯器這是一個(gè)對(duì)象數(shù)組,該代碼的任務(wù)是將從數(shù)組創(chuàng)建時(shí)存放在某處的對(duì)象數(shù)量取回并為數(shù)組的所有對(duì)象調(diào)用析構(gòu)函數(shù)。當(dāng)刪除用戶自定義數(shù)據(jù)類型的數(shù)組時(shí)非常重要。同釋放單個(gè)對(duì)象一樣,針對(duì)包含0值的指針使用delete被認(rèn)為是安全的。
動(dòng)態(tài)內(nèi)存分配保持平衡涉及到new以及delete的主要規(guī)則相當(dāng)簡(jiǎn)單:使用delete來(lái)平衡每一個(gè)new。如果在new語(yǔ)句中使用了方括號(hào)(即分配了對(duì)象數(shù)組),必須在delete后使用方括號(hào)。無(wú)論何時(shí)使用new,一定要確保使用正確的delete格式。
動(dòng)態(tài)內(nèi)存分配如何分配和刪除多維數(shù)組可以為任意維數(shù)的數(shù)組分配空間,并非僅能為一維數(shù)組分配空間。示例:
introws=3;
intconstcols=5;
double(*ptr)[cols]=newdouble[rows][cols];
//……delete[]ptr;
動(dòng)態(tài)內(nèi)存分配如何分配和刪除多維數(shù)組示例說(shuō)明:二維數(shù)組的元素是一維數(shù)組的集合(行)。故為了創(chuàng)建一個(gè)指向一維數(shù)組的指針,包含*ptr的圓括號(hào)是必須的。ptr+1代表了第二個(gè)一維數(shù)組的開始(第一行,第0列),而不是第二個(gè)double元素(第0行,第一列)。當(dāng)使用new從空閑存儲(chǔ)區(qū)中給數(shù)組分配空間時(shí),所有的維數(shù)(除了第一維)都必須讓編譯器知道并且必須是正數(shù)。這就是rows可以在運(yùn)行期間確定,而cols必須是常量從而讓編譯器知道的原因。如何分配和刪除多維數(shù)組當(dāng)刪除數(shù)組時(shí),注意delete語(yǔ)句的格式與一維數(shù)組的格式相同。即列的數(shù)目不需要指定。使用typedef可以簡(jiǎn)化語(yǔ)法。如:
introws=3;
intconstcols=5;
typedefdoubleONE_DIM[cols];
ONE_DIM*ptr=newONE_DIM[rows];
//……delete[]ptr;命名該空間當(dāng)使用new在空閑存儲(chǔ)區(qū)中為一個(gè)對(duì)象分配空間時(shí),會(huì)得到一個(gè)指向?qū)ο蟮闹羔?,然后解引用這個(gè)指針來(lái)訪問(wèn)該對(duì)象。但是也可以不使用解引用的指針來(lái)訪問(wèn)空閑存儲(chǔ)區(qū)中的對(duì)象,為此,只需要解引用有new返回的地址并創(chuàng)建別名,然后就可以簡(jiǎn)單地使用這個(gè)別名來(lái)引用這個(gè)對(duì)象。不過(guò)因?yàn)閐elete需要所分配的空閑存儲(chǔ)區(qū)的地址,故注意要小心使用取地址運(yùn)算符&。
double&refFreeStore=*newdouble(3.1416);
refFreeStore=3.1415926;//changethecontent
//……
delete&refFreeStore;
//releasethespace兩個(gè)程序輸出示例intmain(){ int*ptrFreeStore=newint(1);
int&refFreeStore=*ptrFreeStore; cout<<refFreeStore<<endl; ptrFreeStore=newint(2); cout<<refFreeStore<<endl; delete&refFreeStore; deleteptrFreeStore;}intmain(){ int*ptrFreeStore=newint(1);
int*&refPtrFreeStore=ptrFreeStore; cout<<*refPtrFreeStore<<endl; deleterefPtrFreeStore; ptrFreeStore=newint(2); cout<<*refPtrFreeStore<<endl; deleterefPtrFreeStore;}運(yùn)行結(jié)果:11運(yùn)行結(jié)果:12例1動(dòng)態(tài)創(chuàng)建對(duì)象舉例usingnamespacestd;classPoint{public:Point(){X=Y=0;cout<<"DefaultConstructorcalled.\n";}Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled.\n";}~Point(){cout<<"Destructorcalled.\n";}intGetX(){returnX;}intGetY(){returnY;} voidMove(intx,inty) {X=x;Y=y;}private:intX,Y;};intmain(){cout<<"StepOne:“<<endl;Point*Ptr1=newPoint;deletePtr1;cout<<"StepTwo:“<<endl;Ptr1=newPoint(1,2);deletePtr1;}運(yùn)行結(jié)果:StepOne:DefaultConstructorcalled.Destructorcalled.StepTwo:Constructorcalled.Destructorcalled.26例2動(dòng)態(tài)創(chuàng)建對(duì)象數(shù)組舉例usingnamespacestd;classPoint{
//類的聲明同例1,略};intmain(){Point*Ptr=newPoint[2];//創(chuàng)建對(duì)象數(shù)組
Ptr[0].Move(5,10);//通過(guò)指針訪問(wèn)數(shù)組元素的成員
Ptr[1].Move(15,20);//通過(guò)指針訪問(wèn)數(shù)組元素的成員
cout<<"Deleting...“<<endl;delete[]Ptr;//刪除整個(gè)對(duì)象數(shù)組}運(yùn)行結(jié)果:DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.28例3動(dòng)態(tài)數(shù)組類usingnamespacestd;classPoint{
//類的聲明同例1…
};classArrayOfPoints{public:ArrayOfPoints(intn){numberOfPoints=n;points=newPoint[n];}~ArrayOfPoints(){cout<<"Deleting...“<<endl;numberOfPoints=0;delete[]points;}Point&Element(intn){returnpoints[n];}private:Point*points;intnumberOfPoints;};29intmain(){ intnumber; cout<<"Pleaseenterthenumberofpoints:"; cin>>number;
//創(chuàng)建對(duì)象數(shù)組
ArrayOfPointspoints(number);
//通過(guò)指針訪問(wèn)數(shù)組元素的成員
points.Element(0).Move(5,10);
//通過(guò)指針訪問(wèn)數(shù)組元素的成員
points.Element(1).Move(15,20);}30運(yùn)行結(jié)果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.31動(dòng)態(tài)創(chuàng)建多維數(shù)組new類型名T[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]…;如果內(nèi)存申請(qǐng)成功,new運(yùn)算返回一個(gè)指向新分配內(nèi)存首地址的指針,是一個(gè)T類型的數(shù)組,數(shù)組元素的個(gè)數(shù)為除最左邊一維外各維下標(biāo)表達(dá)式的乘積。例如:char(*fp)[3];fp=newchar[2][3];char(*fp)[3];fpfp+1fp[0][0]fp[0][1]fp[0][2]fp[1][0]fp[1][1]fp[1][2]33淺拷貝與深拷貝淺拷貝實(shí)現(xiàn)對(duì)象間數(shù)據(jù)元素的一一對(duì)應(yīng)復(fù)制。深拷貝當(dāng)被復(fù)制的對(duì)象數(shù)據(jù)成員是指針類型時(shí),不是復(fù)制該指針成員本身,而是將指針?biāo)傅膶?duì)象進(jìn)行復(fù)制。淺拷貝與深拷貝例5對(duì)象的淺拷貝usingnamespacestd;classPoint{
//類的聲明同例1//……};classArrayOfPoints{
//類的聲明同例3//……};淺拷貝與深拷貝intmain(){ intnumber; cin>>number;ArrayOfPointspointsArray1(number);pointsArray1.Element(0).Move(5,10);pointsArray1.Element(1).Move(15,20);
ArrayOfPointspointsArray2(pointsArray1);
cout<<"CopyofpointsArray1:“<<endl;cout<<"Point_0ofarray2:"<<pointsArray2.Element(0).GetX()<<",“<<pointsArray2.Element(0).GetY()<<endl;cout<<"Point_1ofarray2:"<<pointsArray2.Element(1).GetX()<<",“<<pointsArray2.Element(1).GetY()<<endl;36pointsArray1.Element(0).Move(25,30);pointsArray1.Element(1).Move(35,40);cout<<"AfterthemovingofpointsArray1:“<<endl;cout<<"Point_0ofarray2:"<<pointsArray2.Element(0).GetX()<<","<<pointsArray2.Element(0).GetY()<<endl;cout<<"Point_1ofarray2:"<<pointsArray2.Element(1).GetX()<<",“<<pointsArray2.Element(1).GetY()<<endl;}37運(yùn)行結(jié)果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.CopyofpointsArray1:Point_0ofarray2:5,10Point_1ofarray2:15,20AfterthemovingofpointsArray1:Point_0ofarray2:25,30Point_1ofarray2:35,40Deleting...Destructorcalled.Destructorcalled.Deleting...接下來(lái)程序出現(xiàn)異常,也就是運(yùn)行錯(cuò)誤。38拷貝前拷貝后pointsArray1的數(shù)組元素占用的內(nèi)存pointsnumberOfPointspointsArray1pointsnumberOfPointspointsArray1pointsArray1的數(shù)組元素占用的內(nèi)存pointsnumberOfPointspointsArray239淺拷貝例6對(duì)象的深拷貝usingnamespacestd;classPoint{
//類的聲明同例1};classArrayOfPoints{public:ArrayOfPoints(ArrayOfPoints&pointsArray);
//其它成員同例3};淺拷貝與深拷貝ArrayOfPoints::ArrayOfPoints(ArrayOfPoints&pointsArray){numberOfPoints=pointsArray.numberOfPoints;points=newPoint[numberOfPoints];for(inti=0;i<numberOfPoints;i++)
points[i].Move(
pointsArray.Element(i).GetX(),
pointsArray.Element(i).GetY());}intmain(){
//同例5}41程序的運(yùn)行結(jié)果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.DefaultConstructorcalled.DefaultConstructorcalled.CopyofpointsArray1:Point_0ofarray2:5,10Point_1ofarray2:15,20AfterthemovingofpointsArray1:Point_0ofarray2:5,10Point_1ofarray2:15,20Deleting...Destructorcalled.Destructorcalled.Deleting...Destructorcalled.Destructorcalled.42拷貝前pointsArray1的數(shù)組元素占用的內(nèi)存pointsnumberOfPointspointsArray1拷貝后pointsnumberOfPointspointsArray1pointsArray1的數(shù)組元素占用的內(nèi)存pointsnumberOfPointspointsArray243深拷貝*44/106對(duì)象成員的另一種訪問(wèn)方式聲明形式類名*對(duì)象指針名;例:PointA(5,10);Piont*ptr=NULL;ptr=&A;通過(guò)指針訪問(wèn)對(duì)象成員對(duì)象指針名->成員名ptr->getx()相當(dāng)于(*ptr).getx();
指針44*45/106曾經(jīng)出現(xiàn)過(guò)的錯(cuò)誤例子classFred;//前向引用聲明classBarney{Fredx;//錯(cuò)誤:類Fred的聲明尚不完善
};classFred{Barneyy;};classFred; //前向引用聲明classBarney{Fred*x; };classFred{Barneyy;};45指向類的非靜態(tài)成員的指針申明通過(guò)指向成員的指針只能訪問(wèn)公有成員聲明指向成員的指針聲明指向公有數(shù)據(jù)成員的指針類型說(shuō)明符類名::*指針名;
聲明指向公有函數(shù)成員的指針類型說(shuō)明符(類名::*指針名)(參數(shù)表);46類的非靜態(tài)成員的指針使用指向數(shù)據(jù)成員的指針說(shuō)明指針應(yīng)該指向哪個(gè)成員指針名=&類名::數(shù)據(jù)成員名;通過(guò)對(duì)象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來(lái)訪問(wèn)數(shù)據(jù)成員對(duì)象名.*類成員指針名或:對(duì)象指針名—>*類成員指針名47類的非靜態(tài)成員的函數(shù)指針使用指向函數(shù)成員的指針初始化指針名=類名::函數(shù)成員名;通過(guò)對(duì)象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來(lái)訪問(wèn)函數(shù)成員(對(duì)象名.*類成員指針名)(參數(shù)表);或:(對(duì)象指針名—>*類成員指針名)(參數(shù)表);48指向類的非靜態(tài)成員的指針例13訪問(wèn)對(duì)象的公有成員函數(shù)的不同方式intmain(){PointA(4,5);//聲明對(duì)象A Point*p1=&A;//聲明對(duì)象指針并初始化
//聲明成員函數(shù)指針并初始化
int(Point::*p_GetX)()=Point::GetX;
//(1)使用成員函數(shù)指針訪問(wèn)成員函數(shù)
cout<<(A.*p_GetX)()<<endl;
//(2)使用對(duì)象指針訪問(wèn)成員函數(shù)
cout<<(p1->GetX)()<<endl;
//(3)使用對(duì)象名訪問(wèn)成員函數(shù)
cout<<A.GetX()<<endl; }49例15通過(guò)指針訪問(wèn)類的靜態(tài)函數(shù)成員#include<iostream>usingnamespacestd;classPoint//Point類聲明{public://外部接口(公有數(shù)據(jù)成員)
//其它函數(shù)略
staticvoidGetC()//靜態(tài)函數(shù)成員
{cout<<"Objectid="<<countP<<endl;}private://私有數(shù)據(jù)成員
intX,Y; staticintcountP; //靜態(tài)數(shù)據(jù)成員引用性說(shuō)明};//函數(shù)實(shí)現(xiàn)略intPoint::countP=0; //靜態(tài)數(shù)據(jù)成員定義性說(shuō)明50intmain(){
//指向函數(shù)的指針,指向類的靜態(tài)成員函數(shù)
void(*gc)()=Point::GetC; PointA(4,5); //聲明對(duì)象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY(); gc();//輸出對(duì)象序號(hào),通過(guò)指針訪問(wèn)靜態(tài)函數(shù)成員
PointB(A); //聲明對(duì)象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY(); gc();//輸出對(duì)象序號(hào),通過(guò)指針訪問(wèn)靜態(tài)函數(shù)成員}51引用的概念引用:
為一個(gè)變量、函數(shù)等對(duì)象規(guī)定一個(gè)別名,該別名稱為引用。此后,對(duì)別名的操作即是對(duì)別名所代表的對(duì)象的操作。即引用變量創(chuàng)建了變量和對(duì)象的別名。引用雖是一種類型,但不是值,只能用它標(biāo)識(shí)另一個(gè)對(duì)象。從理論意義上說(shuō),引用是一種映射,把一個(gè)標(biāo)識(shí)符映射到一個(gè)對(duì)象。從直觀意義上說(shuō),引用是用一個(gè)標(biāo)識(shí)符給一個(gè)對(duì)象起了一個(gè)別名,引用標(biāo)識(shí)對(duì)象,就是用一個(gè)別名標(biāo)識(shí)對(duì)象。52引用的創(chuàng)建(聲明)創(chuàng)建(聲明)引用:創(chuàng)建引用與定義指針類似,只不過(guò)將*換成&。引用只有聲明,沒有定義。因?yàn)橐貌徽即鎯?chǔ)空間,而定義要分配存儲(chǔ)空間。創(chuàng)建(聲明)引用格式如下:
類型&別名[=別名所代表的對(duì)象];例:
inti=0;
int
&ir=i;//定義引用ir作為對(duì)象i的別名
ir=2;//形式上向ir賦值,實(shí)際上是向i賦值,等同于i=2;
int*p=&ir;//形式上取ir的地址,實(shí)際上是取i的地
//址,等同于int*p=&i;
53引用的初始化引用若不是作為函數(shù)參數(shù)的,則必須初始化(PITA),并且必須引用某個(gè)“真實(shí)”的變量或?qū)ο?。否則發(fā)生編譯錯(cuò)誤。方法:一般使用相同類型的變量來(lái)初始化。例:intsomeVar=1;
int&ref=someVar;引用總是作為目標(biāo)的別名使用。也就是說(shuō):引用一旦初始化,它就維系在所代表的對(duì)象上,再也分不開。任何對(duì)該引用的賦值,都是對(duì)引用所維系目標(biāo)賦值,而不是將引用維系到另一目標(biāo)上。即一旦引用變量被聲明并初始化,在引用的作用域內(nèi),不能再作為其他對(duì)象的引用(別名)。54創(chuàng)建對(duì)數(shù)組的引用可以創(chuàng)建對(duì)數(shù)組的引用。例:intconstdimension=5;doublearray1[dimension]={0.0};double(&refArray1)[dimension]=array1;//……doubleconstarray2[dimension]={0.0
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版新能源產(chǎn)品銷售合同標(biāo)準(zhǔn)模板
- 2025年度熱鍍鋅鋼管銷售合同范本2篇
- 二零二五年度企業(yè)財(cái)務(wù)報(bào)表編制與分析合同范本3篇
- 2025年度體育場(chǎng)館教練個(gè)人聘用合同示例4篇
- 2025年度二手房全款買賣合同房產(chǎn)交易風(fēng)險(xiǎn)提示協(xié)議
- 2025年度城市綜合體商業(yè)空間租賃及品牌入駐協(xié)議
- 跨領(lǐng)域的安全逃生技巧探索
- 綠色能源在農(nóng)業(yè)機(jī)械中的運(yùn)用前景
- 智能家居時(shí)代下的家用醫(yī)療設(shè)備選擇
- 2025版新能源產(chǎn)業(yè)信托借款合同范本系列3篇
- 2025年人民教育出版社有限公司招聘筆試參考題庫(kù)含答案解析
- 康復(fù)醫(yī)學(xué)治療技術(shù)(士)復(fù)習(xí)題及答案
- 完整版100以內(nèi)加減法混合運(yùn)算4000道100
- 2024年產(chǎn)權(quán)管理部年終工作總結(jié)例文(3篇)
- 《血管性血友病》課件
- 高三日語(yǔ)一輪復(fù)習(xí)日語(yǔ)助詞「に」和「を」的全部用法課件
- 機(jī)場(chǎng)地勤勞動(dòng)合同三篇
- 2024年山東省高考政治試卷真題(含答案逐題解析)
- 《用銳角三角函數(shù)解決問(wèn)題(3)》參考課件
- 訂婚協(xié)議書手寫模板攻略
- 風(fēng)水學(xué)的基礎(chǔ)知識(shí)培訓(xùn)
評(píng)論
0/150
提交評(píng)論