版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配本章首先引見程序運轉(zhuǎn)時動態(tài)內(nèi)存分配本章首先引見程序運轉(zhuǎn)時動態(tài)內(nèi)存分配dynamic dynamic memory allocationmemory allocation的概念與方法。到目前為止,本的概念與方法。到目前為止,本教材引見的程序設(shè)計中,變量和對象在內(nèi)存中的分配都教材引見的程序設(shè)計中,變量和對象在內(nèi)存中的分配都是編譯器在編譯程序時安排好了的,這帶來了極大的不是編譯器在編譯程序時安排好了的,這帶來了極大的不便,如數(shù)組必需大開小用,指針必需指向一個曾經(jīng)存在便,如數(shù)組必需大開小用,指針必需指向一個曾經(jīng)存在的變量或?qū)ο?。動態(tài)內(nèi)存分配處理了這個問題。本章將的變量或?qū)ο蟆?/p>
2、動態(tài)內(nèi)存分配處理了這個問題。本章將進一步討論拷貝構(gòu)造函數(shù)。進一步討論拷貝構(gòu)造函數(shù)。 堆內(nèi)存分配堆內(nèi)存分配 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放 堆對象與構(gòu)造函數(shù)堆對象與構(gòu)造函數(shù) 淺拷貝與深拷貝淺拷貝與深拷貝 C/C+C/C+定義了定義了4 4個內(nèi)存區(qū)間:代碼區(qū),個內(nèi)存區(qū)間:代碼區(qū),全局變量與靜態(tài)變量區(qū),部分變量區(qū)全局變量與靜態(tài)變量區(qū),部分變量區(qū)即棧區(qū),動態(tài)存儲區(qū),即堆即棧區(qū),動態(tài)存儲區(qū),即堆heapheap區(qū)或自在存儲區(qū)區(qū)或自在存儲區(qū)free storefree store。通常定義變量或?qū)ο螅幾g器在通常定義變量或?qū)ο?,編譯器在編譯時都可以根據(jù)該變量或?qū)ο缶幾g時都可以根據(jù)該變量或?qū)ο蟮念愋椭?/p>
3、道所需內(nèi)存空間的大小,從的類型知道所需內(nèi)存空間的大小,從而系統(tǒng)在適當(dāng)?shù)臅r候為他們分配確定而系統(tǒng)在適當(dāng)?shù)臅r候為他們分配確定的存儲空間。這種內(nèi)存分配稱為靜態(tài)的存儲空間。這種內(nèi)存分配稱為靜態(tài)存儲分配存儲分配有些操作對象只需在程序運轉(zhuǎn)時才干有些操作對象只需在程序運轉(zhuǎn)時才干確定,這樣編譯器在編譯時就無法為確定,這樣編譯器在編譯時就無法為他們預(yù)定存儲空間,只能在程序運轉(zhuǎn)他們預(yù)定存儲空間,只能在程序運轉(zhuǎn)時,系統(tǒng)根據(jù)運轉(zhuǎn)時的要求進展內(nèi)存時,系統(tǒng)根據(jù)運轉(zhuǎn)時的要求進展內(nèi)存分配,這種方法稱為動態(tài)存儲分配。分配,這種方法稱為動態(tài)存儲分配。一切動態(tài)存儲分配都在堆區(qū)中進展。一切動態(tài)存儲分配都在堆區(qū)中進展。 堆內(nèi)存的分配與
4、釋放堆內(nèi)存的分配與釋放當(dāng)程序運轉(zhuǎn)到需求一個動態(tài)分配的變量或?qū)ο髸r,必需向系統(tǒng)懇求獲當(dāng)程序運轉(zhuǎn)到需求一個動態(tài)分配的變量或?qū)ο髸r,必需向系統(tǒng)懇求獲得堆中的一塊所需大小的存貯空間,用于存貯該變量或?qū)ο?。?dāng)不再運得堆中的一塊所需大小的存貯空間,用于存貯該變量或?qū)ο蟆.?dāng)不再運用該變量或?qū)ο髸r,也就是它的生命終了時,要顯式釋放它所占用的存用該變量或?qū)ο髸r,也就是它的生命終了時,要顯式釋放它所占用的存貯空間,這樣系統(tǒng)就能對該堆空間進展再次分配,做到反復(fù)運用有限的貯空間,這樣系統(tǒng)就能對該堆空間進展再次分配,做到反復(fù)運用有限的資源。資源。在在C+中,懇求和釋放堆中分配的存貯空間,分別運用中,懇求和釋放堆中分配的
5、存貯空間,分別運用new和和delete的的兩個運算符來完成,其運用的格式如下:兩個運算符來完成,其運用的格式如下:指針變量名指針變量名=new 類型名類型名(初始化式初始化式);delete 指針名指針名;new運算符前往的是一個指向所分配類型變量對象的指針。對所運算符前往的是一個指向所分配類型變量對象的指針。對所創(chuàng)建的變量或?qū)ο?,都是?jīng)過該指針來間接操作的,而動態(tài)創(chuàng)建的對象創(chuàng)建的變量或?qū)ο?,都是?jīng)過該指針來間接操作的,而動態(tài)創(chuàng)建的對象本身沒有名字。本身沒有名字。 堆內(nèi)存的分配與釋放普通定義變量和對象時要用標識符命名,稱命名對象,而動普通定義變量和對象時要用標識符命名,稱命名對象,而動態(tài)的稱
6、無名對象態(tài)的稱無名對象( (請留意與棧區(qū)中的暫時對象的區(qū)別,兩者完請留意與棧區(qū)中的暫時對象的區(qū)別,兩者完全不同:生命期不同,操作方法不同,暫時變量對程序員是全不同:生命期不同,操作方法不同,暫時變量對程序員是透明的透明的) )。堆區(qū)是不會自動在分配時做初始化的包括清零,。堆區(qū)是不會自動在分配時做初始化的包括清零,所以必需用初始化式所以必需用初始化式(initializer)(initializer)來顯式初始化。來顯式初始化。newnew表達表達式的操作序列如下:從堆區(qū)分配對象,然后用括號中的值初式的操作序列如下:從堆區(qū)分配對象,然后用括號中的值初始化該對象。從堆區(qū)分配對象時,始化該對象。從堆
7、區(qū)分配對象時,newnew表達式調(diào)用庫操作符表達式調(diào)用庫操作符new()new()。例如:。例如: int int * *pi=new int(0);pi=new int(0);它與以下代碼序列大體等價:它與以下代碼序列大體等價:int ival=0;int ival=0;int int * *pi=&ival;pi=&ival;只是只是pipi如今所指向的變量是由庫操作符如今所指向的變量是由庫操作符new()new()分配的,位于程分配的,位于程序的堆區(qū)中,并且該對象未命名。序的堆區(qū)中,并且該對象未命名。 堆內(nèi)存的分配與釋放堆堆i下面看演示:下面看演示:用初始化式用初始化式(
8、initializer)(initializer)來顯式初始化來顯式初始化 int int * *pi=new int(0);pi=new int(0);當(dāng)當(dāng)pipi生命周期終了時,生命周期終了時,必需釋放必需釋放pipi所指向的目的:所指向的目的: delete pi; delete pi;留意這時釋放了留意這時釋放了pipi所指的目的的內(nèi)存空間,也就是撤銷了所指的目的的內(nèi)存空間,也就是撤銷了該目的,稱動態(tài)內(nèi)存釋放該目的,稱動態(tài)內(nèi)存釋放dynamic memory dynamic memory deallocationdeallocation,但指針,但指針pipi本身并沒有撤銷,它本人依然
9、本身并沒有撤銷,它本人依然存在,該指針所占內(nèi)存空間并未釋放。存在,該指針所占內(nèi)存空間并未釋放。 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放對于數(shù)組進展動態(tài)分配的格式為:對于數(shù)組進展動態(tài)分配的格式為:指針變量名指針變量名=new =new 類型名類型名 下標表達式下標表達式;delete delete 指向該數(shù)組的指針變量名指向該數(shù)組的指針變量名; ;兩式中的方括號是非常重要的,兩者必需配對運兩式中的方括號是非常重要的,兩者必需配對運用,假設(shè)用,假設(shè)deletedelete語句中少了方括號,因編譯器以語句中少了方括號,因編譯器以為該指針是指向數(shù)組第一個元素的指針,會產(chǎn)生為該指針是指向數(shù)組第一個元素的指
10、針,會產(chǎn)生回收不徹底的問題只回收了第一個元素所占空回收不徹底的問題只回收了第一個元素所占空間,加了方括號后就轉(zhuǎn)化為指向數(shù)組的指針,間,加了方括號后就轉(zhuǎn)化為指向數(shù)組的指針,回收整個數(shù)組?;厥照麄€數(shù)組。delete delete 的方括號中不需求填的方括號中不需求填數(shù)組元素數(shù),系統(tǒng)自知。即使寫了,編譯器也忽數(shù)組元素數(shù),系統(tǒng)自知。即使寫了,編譯器也忽略。略。請留意請留意“下標表達式不是常量表達式,即它的值下標表達式不是常量表達式,即它的值不用在編譯時確定,可以在運轉(zhuǎn)時確定。不用在編譯時確定,可以在運轉(zhuǎn)時確定。 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放【例【例7.1】動態(tài)數(shù)組的建立與撤銷】動態(tài)數(shù)組的建立與
11、撤銷#include #include void main()int n;char *pc;cout請輸入動態(tài)數(shù)組的元素個數(shù)請輸入動態(tài)數(shù)組的元素個數(shù)n; /在運轉(zhuǎn)時確定,可輸入在運轉(zhuǎn)時確定,可輸入17pc=new charn; /懇求懇求17個字符可裝個字符可裝8個漢字和一個終了符的內(nèi)存空間個漢字和一個終了符的內(nèi)存空間strcpy(pc,堆內(nèi)存的動態(tài)分配堆內(nèi)存的動態(tài)分配);coutpcendl;delete pc;/釋放釋放pc所指向的所指向的n個字符的內(nèi)存空間個字符的內(nèi)存空間return ; 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放動態(tài)分配數(shù)組有三個特點:動態(tài)分配數(shù)組有三個特點:變量變量n在編譯
12、時沒有確定的值,而是在運轉(zhuǎn)中輸入,按運在編譯時沒有確定的值,而是在運轉(zhuǎn)中輸入,按運轉(zhuǎn)時所需分配堆空間,這一點是動態(tài)分配的優(yōu)點,可抑轉(zhuǎn)時所需分配堆空間,這一點是動態(tài)分配的優(yōu)點,可抑制數(shù)組制數(shù)組“大開小用的弊端,在表、排序與查找中的算大開小用的弊端,在表、排序與查找中的算法,假設(shè)用動態(tài)數(shù)組,通用性更佳。法,假設(shè)用動態(tài)數(shù)組,通用性更佳。delete pc是將是將n個個字符的空間釋放,而用字符的空間釋放,而用delete pc那么只釋放了一個字符那么只釋放了一個字符的空間;的空間;假設(shè)有一個假設(shè)有一個char *pc1,令,令pc1=p,同樣可用,同樣可用delete pc1來來釋放該空間。雖然釋放該
13、空間。雖然C+不對數(shù)組作邊境檢查,但在堆空不對數(shù)組作邊境檢查,但在堆空間分配時,對數(shù)組分配空間大小是紀錄在案的。間分配時,對數(shù)組分配空間大小是紀錄在案的。沒有初始化式?jīng)]有初始化式initializer,不可對數(shù)組初始化。,不可對數(shù)組初始化。 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放多維數(shù)組動態(tài)分配:多維數(shù)組動態(tài)分配:new 類型名類型名下標表達式下標表達式1 下標表達式下標表達式2;建立一個動態(tài)三維數(shù)組建立一個動態(tài)三維數(shù)組float (*cp)3020 ; /指向一個指向一個30行行20列數(shù)組列數(shù)組的指針的指針cp=new float 15 30 20; /建立由建立由15個個30*20數(shù)組組成的
14、數(shù)組;數(shù)組組成的數(shù)組;留意留意cp等效于三維數(shù)組名,但沒有指出其邊境,即等效于三維數(shù)組名,但沒有指出其邊境,即最高維的元素數(shù)量,就像指向字符的指針即等效一最高維的元素數(shù)量,就像指向字符的指針即等效一個字符串個字符串,不要把指向字符的指針,說成指向字符串不要把指向字符的指針,說成指向字符串的指針。這與數(shù)組的嵌套定義相一致。的指針。這與數(shù)組的嵌套定義相一致。 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放比較:比較:float(*cp) 30 20; /三級指針;三級指針;float (*bp) 20; /二級指針;二級指針;cp=new float 1 20 30;bp=new float 30 20;兩
15、個數(shù)組都是由兩個數(shù)組都是由600個浮點數(shù)組成,前者是只需個浮點數(shù)組成,前者是只需一個元素的三維數(shù)組,每個元素為一個元素的三維數(shù)組,每個元素為30行行20列的二列的二維數(shù)組,而另一個是有維數(shù)組,而另一個是有30個元素的二維數(shù)組,每個元素的二維數(shù)組,每個元素為個元素為20個元素的一維數(shù)組。刪除這兩個動態(tài)個元素的一維數(shù)組。刪除這兩個動態(tài)數(shù)組可用下式:數(shù)組可用下式:delete cp; /刪除釋放三維數(shù)組;刪除釋放三維數(shù)組;delete bp; /刪除釋放二維數(shù)組;刪除釋放二維數(shù)組; 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放【例】【例】 動態(tài)創(chuàng)建和刪除一個動態(tài)創(chuàng)建和刪除一個m*n個元素的數(shù)組。采用指針數(shù)組
16、方式來個元素的數(shù)組。采用指針數(shù)組方式來完成二維數(shù)組的動態(tài)創(chuàng)建。完成二維數(shù)組的動態(tài)創(chuàng)建。const int m=4; /行數(shù)行數(shù)const int n=6; /列數(shù)列數(shù)先看二維數(shù)組的動態(tài)創(chuàng)建:先看二維數(shù)組的動態(tài)創(chuàng)建:void main() double *data; /假設(shè)改成假設(shè)改成 double (*data) n;后面如何改動后面如何改動 data = new double*m; /設(shè)置行設(shè)置行 if (data ) = 0) cout Couuld not allocate. Bye .;return; for(int j=0;jm;j+) dataj = new doublen; /設(shè)
17、置列設(shè)置列 if (dataj = 0) cout Couuld not allocate. Bye .;return; for (int i=0;im;i+) for (int j=0;jn;j+) dataij=i*n+j;/初始化數(shù)組元素初始化數(shù)組元素 coutdataijendl; de_allocate(data); return; 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放再看二維數(shù)組的撤銷與內(nèi)存釋放:再看二維數(shù)組的撤銷與內(nèi)存釋放:void de_allocate(double *data) for (int i=0;im;i+) delete datai; /留意撤銷次序,先列后行,與
18、設(shè)置相反留意撤銷次序,先列后行,與設(shè)置相反 delete data; 指針運用的幾個問題:指針運用的幾個問題:動態(tài)分配失敗。前往一個空指針動態(tài)分配失敗。前往一個空指針NULL,表示發(fā)生,表示發(fā)生了異常,堆資源缺乏,分配失敗。了異常,堆資源缺乏,分配失敗。指針刪除與堆空間釋放。刪除一個指針指針刪除與堆空間釋放。刪除一個指針pdelete p;實踐實踐意思是刪除了意思是刪除了p所指的目的變量或?qū)ο蟮?,釋放了它所占的堆空所指的目的變量或?qū)ο蟮龋尫帕怂嫉亩芽臻g,而不是刪除本身,釋放堆空間后,成了空懸指針。間,而不是刪除本身,釋放堆空間后,成了空懸指針。 堆內(nèi)存的分配與釋放堆內(nèi)存的分配與釋放內(nèi)存走
19、漏內(nèi)存走漏memory leak和反復(fù)釋放。和反復(fù)釋放。new與與delete 是配對運用的,是配對運用的, delete只能釋放堆空間。假設(shè)只能釋放堆空間。假設(shè)new前往的指針值喪失,那么所分配的堆空間無法回收,前往的指針值喪失,那么所分配的堆空間無法回收,稱內(nèi)存走漏,同一空間反復(fù)釋放也是危險的,由于該空間稱內(nèi)存走漏,同一空間反復(fù)釋放也是危險的,由于該空間能夠已另分配,所以必需妥善保管能夠已另分配,所以必需妥善保管new前往的指針,以保前往的指針,以保證不發(fā)生內(nèi)存走漏,也必需保證不會反復(fù)釋放堆內(nèi)存空間。證不發(fā)生內(nèi)存走漏,也必需保證不會反復(fù)釋放堆內(nèi)存空間。動態(tài)分配的變量或?qū)ο蟮纳?。無名對象
20、的生命期動態(tài)分配的變量或?qū)ο蟮纳?。無名對象的生命期并不依賴于建立它的作用域,比如在函數(shù)中建立的動態(tài)對并不依賴于建立它的作用域,比如在函數(shù)中建立的動態(tài)對象在函數(shù)前往后仍可運用。我們也稱堆空間為自在空間象在函數(shù)前往后仍可運用。我們也稱堆空間為自在空間free store就是這個緣由。但必需記住釋放該對象所就是這個緣由。但必需記住釋放該對象所占堆空間,并只能釋放一次,在函數(shù)內(nèi)建立,而在函數(shù)外占堆空間,并只能釋放一次,在函數(shù)內(nèi)建立,而在函數(shù)外釋放是一件很容易失控的事,往往會出錯。釋放是一件很容易失控的事,往往會出錯。 堆對象與構(gòu)造函數(shù)堆對象與構(gòu)造函數(shù) 經(jīng)過經(jīng)過new建立的對象要調(diào)用構(gòu)造函數(shù),經(jīng)過建
21、立的對象要調(diào)用構(gòu)造函數(shù),經(jīng)過delete刪除對象刪除對象也要調(diào)用析構(gòu)函數(shù)。也要調(diào)用析構(gòu)函數(shù)。CGoods *pc;pc=new CGoods; /分配堆空間,并構(gòu)造一個無名的分配堆空間,并構(gòu)造一個無名的CGoods對象;對象;.delete pc; /先析構(gòu),然后將內(nèi)存空間前往給堆;先析構(gòu),然后將內(nèi)存空間前往給堆; 堆對象的生命期并不依賴于建立它的作用域,所以除非程序堆對象的生命期并不依賴于建立它的作用域,所以除非程序終了,堆對象無名對象的生命期不會到期,并且需求顯式終了,堆對象無名對象的生命期不會到期,并且需求顯式地用地用delete語句析構(gòu)堆對象,上面的堆對象在執(zhí)行語句析構(gòu)堆對象,上面的堆
22、對象在執(zhí)行delete語句時,語句時,C+自動調(diào)用其析構(gòu)函數(shù)。自動調(diào)用其析構(gòu)函數(shù)。正由于構(gòu)造函數(shù)可以有參數(shù),所以正由于構(gòu)造函數(shù)可以有參數(shù),所以new后面類后面類class類型也可類型也可以有參數(shù)。這些參數(shù)即構(gòu)造函數(shù)的參數(shù)。但對創(chuàng)建數(shù)組,那么以有參數(shù)。這些參數(shù)即構(gòu)造函數(shù)的參數(shù)。但對創(chuàng)建數(shù)組,那么無參數(shù),并只調(diào)用缺省的構(gòu)造函數(shù)。見下例類闡明:無參數(shù),并只調(diào)用缺省的構(gòu)造函數(shù)。見下例類闡明:堆對象與構(gòu)造函數(shù)堆對象與構(gòu)造函數(shù)class CGoods char Name21; int Amount; float Price; float Total_value;public: CGoods(); /缺省構(gòu)
23、造函數(shù)。缺省構(gòu)造函數(shù)。 /因已有構(gòu)造函數(shù),系統(tǒng)不會自動生成,必需顯式闡明。因已有構(gòu)造函數(shù),系統(tǒng)不會自動生成,必需顯式闡明。 CGoods(char* name,int amount ,float price) strcpy(Name,name); Amount=amount; Price=price; Total_value=price*amount; ;堆對象與構(gòu)造函數(shù)堆對象與構(gòu)造函數(shù)下面留意如何運用:下面留意如何運用:void main() int n; CGoods *pc,*pc1,*pc2; pc=new CGoods(“夏利夏利2000,10,118000); /調(diào)用三參數(shù)構(gòu)造函數(shù)
24、調(diào)用三參數(shù)構(gòu)造函數(shù) pc1=new CGoods(); /調(diào)用缺省構(gòu)造函數(shù)調(diào)用缺省構(gòu)造函數(shù) cout“輸入商品類數(shù)組元素數(shù)輸入商品類數(shù)組元素數(shù)n; pc2=new CGoodsn; /動態(tài)建立數(shù)組,不能初始化,調(diào)用動態(tài)建立數(shù)組,不能初始化,調(diào)用n次缺省構(gòu)造函數(shù)次缺省構(gòu)造函數(shù) delete pc; delete pc1; delete pc2;堆對象與構(gòu)造函數(shù)堆對象與構(gòu)造函數(shù)這里再次強調(diào):由堆區(qū)創(chuàng)建對象數(shù)這里再次強調(diào):由堆區(qū)創(chuàng)建對象數(shù)組,只能調(diào)用缺省的構(gòu)造函數(shù),不能調(diào)組,只能調(diào)用缺省的構(gòu)造函數(shù),不能調(diào)用其他任何構(gòu)造函數(shù)。假設(shè)沒有缺省的用其他任何構(gòu)造函數(shù)。假設(shè)沒有缺省的構(gòu)造函數(shù),那么不能創(chuàng)建堆區(qū)的
25、對象數(shù)構(gòu)造函數(shù),那么不能創(chuàng)建堆區(qū)的對象數(shù)組。組。淺拷貝與深拷貝淺拷貝與深拷貝 缺省拷貝構(gòu)造函數(shù),可用一個類對象初始化另一個缺省拷貝構(gòu)造函數(shù),可用一個類對象初始化另一個類對象,稱為缺省的按成員拷貝,而不是對整個類對象類對象,稱為缺省的按成員拷貝,而不是對整個類對象的按位拷貝。這稱為淺拷貝。的按位拷貝。這稱為淺拷貝。 P堆對堆對象象堆對堆對象象PP 圖圖1 淺拷貝淺拷貝 拷貝前拷貝后拷貝后 淺拷貝與深拷貝淺拷貝與深拷貝假設(shè)類中有一個數(shù)據(jù)成員為指針,假設(shè)類中有一個數(shù)據(jù)成員為指針,該類的一個對象該類的一個對象obj1中的這個指針中的這個指針p,指向了動態(tài)分配的一個堆對象,參指向了動態(tài)分配的一個堆對象,
26、參見圖見圖1拷貝前,假設(shè)用拷貝前,假設(shè)用obj1按成員按成員拷貝了一個對象拷貝了一個對象obj2,這時,這時obj2.p也也指向同一個堆對象。當(dāng)析構(gòu)時,如用指向同一個堆對象。當(dāng)析構(gòu)時,如用缺省的析構(gòu)函數(shù),那么動態(tài)分配的堆缺省的析構(gòu)函數(shù),那么動態(tài)分配的堆對象不能回收。假設(shè)在析構(gòu)函數(shù)中有對象不能回收。假設(shè)在析構(gòu)函數(shù)中有“delete p;語句,那么假設(shè)先析構(gòu)函語句,那么假設(shè)先析構(gòu)函數(shù)數(shù)obj1時,堆對象曾經(jīng)釋放,以后再時,堆對象曾經(jīng)釋放,以后再析構(gòu)析構(gòu)obj2時出現(xiàn)了二次釋放的問題。時出現(xiàn)了二次釋放的問題。這時就要重新定義拷貝的構(gòu)造函數(shù),這時就要重新定義拷貝的構(gòu)造函數(shù),給每個對象獨立分配一個堆對象
27、,稱給每個對象獨立分配一個堆對象,稱深拷貝。這時先拷貝對象主體,再為深拷貝。這時先拷貝對象主體,再為obj2分配一個堆對象,最后用分配一個堆對象,最后用obj1的的堆對象拷貝堆對象拷貝obj2的堆對象。的堆對象。 堆對堆對象象PP堆對堆對象象 圖圖2 深拷貝深拷貝 淺拷貝與深拷貝淺拷貝與深拷貝例例7.3定義拷貝定義拷貝copy structor和拷貝賦值操作符和拷貝賦值操作符copy Assignment Operator實現(xiàn)深拷貝。實現(xiàn)深拷貝。 學(xué)生類定義:學(xué)生類定義:class studentchar *pName; /指針成員指針成員public:student();student(char *pname);student(student &s); /拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)student();student & operator=(student &s); /拷貝賦值操作符拷貝賦值操作符;缺省構(gòu)造函數(shù):缺省構(gòu)造函數(shù):student:student()coutConstru
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 采購合同中的供應(yīng)鏈移動應(yīng)用3篇
- 采購合同的爭議解決途徑與方法技巧3篇
- 采購合同預(yù)付款的會計核算細節(jié)3篇
- 采購合同管理遵循合同法律規(guī)范3篇
- 2024年度物流倉儲貨物倉儲配送服務(wù)合同范本9篇
- 行為心理治療新進展-洞察分析
- 采購合同會審制度的意義3篇
- 采購意向書合同范文3篇
- 采購合同框架協(xié)議模板分享3篇
- 采購合同風(fēng)險問題識別與管理3篇
- 中小學(xué)課堂游戲課堂懲罰小游戲【3】
- YY/T 0338.1-2002氣管切開插管 第1部分:成人用插管及接頭
- LM2500燃氣輪機結(jié)構(gòu)簡介
- 書名號測試的文檔
- 第17講凸二次規(guī)劃的有效集方法課件
- 基于PLC的智能照明控制系統(tǒng)研究(完整資料)
- 2023學(xué)年統(tǒng)編版高中語文選擇性必修中冊第三單元文言文句子翻譯練習(xí)及答案-
- 福建省南平市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細及行政區(qū)劃代碼
- 勵志演講講稿
- 附件2.2021年全省文化旅游融合示范項目績效目標表
- 頂管施工技術(shù)全面詳解
評論
0/150
提交評論