版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院 內(nèi)存空間的訪問方式內(nèi)存空間的訪問方式 計(jì)算機(jī)的內(nèi)存儲器被劃分為一個(gè)個(gè)的存儲單元。存儲單元計(jì)算機(jī)的內(nèi)存儲器被劃分為一個(gè)個(gè)的存儲單元。存儲單元按一定的規(guī)則編號,這個(gè)編號就是存儲單元的地址。每個(gè)字節(jié)按一定的規(guī)則編號,這個(gè)編號就是存儲單元的地址。每個(gè)字節(jié)是一個(gè)基本內(nèi)存單元。是一個(gè)基本內(nèi)存單元。 在在C+C+程序中是如何從內(nèi)存單元中存取數(shù)據(jù)呢?程序中是如何從內(nèi)存單元中存取數(shù)據(jù)呢?1 1、通過變量名、通過變量名 在變量獲得內(nèi)存空間的同時(shí),變量名成了相應(yīng)內(nèi)存空間的在變量獲得內(nèi)存空間的同時(shí),變量名
2、成了相應(yīng)內(nèi)存空間的名稱。名稱。2 2、通過地址、通過地址 如果當(dāng)變量名不夠方便或者根本沒有變量名可用時(shí),這是如果當(dāng)變量名不夠方便或者根本沒有變量名可用時(shí),這是就需要直接用地址來訪問內(nèi)存空間。就需要直接用地址來訪問內(nèi)存空間。1.1.指針指針C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院 指針變量的聲明指針變量的聲明int a=5;int*pa=&a;cout*pa成員名成員名 等同于等同于 (*對象指針名對象指針名).成員名成員名 C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院例:使用指針來訪問例:使用指針來訪問PointPoint類的成員類的成員#includeusing
3、namespace std;class Pointpublic:Point(int xx,int yy) x=xx,y=yy;int getx()return x;int gety()return y;private: int x,y;void main() Point a(4,5); Point *p1; p1=&a; coutgetx()endl; cout(*p1).gety()endl;C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院 引用的概念引用的概念2. 引引 用用 引用是給變量取一個(gè)別名,它引入了變量的一個(gè)同意詞。引用是給變量取一個(gè)別名,它引入了變量的一個(gè)同意詞。 格式
4、:格式: type & 含義是含義是“type類型的引用類型的引用” 此引用與此引用與type類型變量的地址相聯(lián)系。類型變量的地址相聯(lián)系。 如:如:int i;int &j=i;創(chuàng)建一個(gè)整型引用創(chuàng)建一個(gè)整型引用j, j是是i的地址的別名。的地址的別名。 j和和i的地址相同,表示同一個(gè)變量。的地址相同,表示同一個(gè)變量。 int i=5; int &j=i; i=i+1;/i,j都為都為6注意:注意: 在聲明引用時(shí),馬上就要對它進(jìn)行初始化,不能在聲明完后重賦值。在聲明引用時(shí),馬上就要對它進(jìn)行初始化,不能在聲明完后重賦值。 故故 int i; int &j; j=i; 是錯(cuò)誤是錯(cuò)誤 引用運(yùn)算符只在聲
5、明時(shí)使用,任何其他引用運(yùn)算符只在聲明時(shí)使用,任何其他“&”的使用都是地址操作的使用都是地址操作符。符。5i6i, j5i, jC+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院#includeusing namespace std; void main()int i; int &j=i; i=5;i+;cout&i &jendl;couti jendl;0 x0012FF7C 0 x0012FF7C6 6C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院#includeusing namespace std; class Pointprivate: int x,y;public:
6、Point(int vx,int vy)x=vx;y=vy; void print()coutx=x y=yendl; 對類對象定義引用與指針舉例對類對象定義引用與指針舉例 C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院void main()Point p1(10,10);Point &pref=p1; /引用引用coutp1 addr:&p1 pref addr:&prefendl;p1.print(); pref.print();Point p2(20,20),*pt;pt=&p2; /指針指針coutp2 addr:&p2 pt addr:ptprint();p1 addr:0
7、 x0012FF78 pref addr:0 x0012FF78x=10 y=10 x=10 y=10p2 addr:0 x0012FF6C pt addr:0 x0012FF6Cx=20 y=20 x=20 y=20C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院 類的引用作為傳遞的參數(shù)類的引用作為傳遞的參數(shù)#includeusing namespace std;class Aprivate: int x;public:A(int vx) coutConstructor called! vxendl; x=vx; A() coutDeconstructor called! xendl
8、;void print()coutx=xendl;void f1(A &voo) cout&voo=&vooendl; voo.print();void main() A obj(10); obj.print(); cout&obj=&objendl; f1(obj); Constructor called! 10 x=10&obj=0 x0012FF70&voo=0 x0012FF70 x=10Deconstructor called! 10C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院#includeusing namespace std;char s80=Hello World
9、;char &replace(int k)return sk;char *rep(int k) return &sk;void main() replace(11)=!;coutsendl;coutreplace(11)endl;*rep(5)=+;coutrep(0)endl;cout*rep(0)endl;coutreplace(0)endl;coutrep(6)endl;cout*rep(6)endl;coutreplace(6)endl;Hello World!Hello+World!HHWorld!WW 引用作為返回值引用作為返回值 若一個(gè)函數(shù)返回了引用,那么該函數(shù)的調(diào)用也可以被賦值
10、。如:若一個(gè)函數(shù)返回了引用,那么該函數(shù)的調(diào)用也可以被賦值。如:C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院3. 動(dòng)態(tài)內(nèi)存分配動(dòng)態(tài)內(nèi)存分配 所謂動(dòng)態(tài)內(nèi)存分配是指在程序運(yùn)行期間根據(jù)實(shí)際需要隨時(shí)申請內(nèi)存,并在所謂動(dòng)態(tài)內(nèi)存分配是指在程序運(yùn)行期間根據(jù)實(shí)際需要隨時(shí)申請內(nèi)存,并在不需要時(shí)釋放。不需要時(shí)釋放。 new運(yùn)算符與運(yùn)算符與delete運(yùn)算符一起使用,就可以直接進(jìn)行動(dòng)態(tài)內(nèi)存的申請和運(yùn)算符一起使用,就可以直接進(jìn)行動(dòng)態(tài)內(nèi)存的申請和釋放釋放 new運(yùn)算符運(yùn)算符 格式:格式: =new (); 功能:動(dòng)態(tài)地分配存儲空間。功能:動(dòng)態(tài)地分配存儲空間。new能自動(dòng)計(jì)算要分配的類型的大小并能返能自動(dòng)計(jì)算要
11、分配的類型的大小并能返 回正確的指針類型。若返回值為回正確的指針類型。若返回值為0 (NULL),則分配存儲空間未成功。,則分配存儲空間未成功。 delete運(yùn)算符運(yùn)算符格式:格式: delete ; 如如delete s; delete ; 如如delete s;s為任意維數(shù)數(shù)組,為任意維數(shù)數(shù)組,功能:指針名指將被釋放的存儲區(qū)的起始地址,該存儲區(qū)必須是功能:指針名指將被釋放的存儲區(qū)的起始地址,該存儲區(qū)必須是new分分配的。配的。 C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院q int *p =new int(200)則同時(shí)給變量賦上了初值則同時(shí)給變量賦上了初值200。q 若分配失
12、敗,若分配失敗,new將返回一個(gè)空指針:將返回一個(gè)空指針:p=NULL。q 用用new創(chuàng)建一維整型數(shù)組,有創(chuàng)建一維整型數(shù)組,有2個(gè)元素個(gè)元素 int *S=new int2;200& p& SNULL pq Point *p =new Point(10,20) q 用用new創(chuàng)建一維點(diǎn)類型數(shù)組,有創(chuàng)建一維點(diǎn)類型數(shù)組,有2個(gè)元素個(gè)元素 Point *S=new Point2;10& p20& S隨機(jī)隨機(jī)& pp指向垃圾內(nèi)存指向垃圾內(nèi)存q delete p;q 注意:內(nèi)存被釋放,并不表示指針會(huì)消亡或者成了注意:內(nèi)存被釋放,并不表示指針會(huì)消亡或者成了NULL指針。指針。 一般寫作:一般寫作:dele
13、te p; p=NULL;C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院/為對象動(dòng)態(tài)分配為對象動(dòng)態(tài)分配#includeusing namespace std;class Pointprivate: int x,y;public:Point(int vx=0,int vy=0)coutConstructor is called!endl;x=vx ; y=vy;void print() cout x yendl; Point()coutDecostructor is called!endl; ; C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院void main() cout為
14、對象動(dòng)態(tài)分配內(nèi)存為對象動(dòng)態(tài)分配內(nèi)存print();delete p; p=NULL ; 該對象是使用該對象是使用new運(yùn)算符動(dòng)態(tài)創(chuàng)建的,在使用運(yùn)算符動(dòng)態(tài)創(chuàng)建的,在使用delete運(yùn)算符釋放它時(shí),運(yùn)算符釋放它時(shí),delete將會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)將會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)為對象動(dòng)態(tài)分配內(nèi)存為對象動(dòng)態(tài)分配內(nèi)存Constructor is called!12 12Decostructor is called!C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院/動(dòng)態(tài)創(chuàng)建對象數(shù)組動(dòng)態(tài)創(chuàng)建對象數(shù)組class Pointprivate: int x,y;public:Point(int vx=10,int v
15、y=10)x=vx ; y=vy;void print() cout x yendl; ;void main() int i; cout動(dòng)態(tài)創(chuàng)建對象數(shù)組動(dòng)態(tài)創(chuàng)建對象數(shù)組endl;Point *p=new Point3;if (p=NULL) /p=NULL表示申請失敗表示申請失敗exit(0);for( i=0;i3;i+) pi.print();delete p; p=NULL ; 動(dòng)態(tài)創(chuàng)建對象數(shù)組動(dòng)態(tài)創(chuàng)建對象數(shù)組10 1010 1010 10C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院q 拷貝初始化構(gòu)造函數(shù)是一種特殊的成員函數(shù)??截惓跏蓟瘶?gòu)造函數(shù)是一種特殊的成員函數(shù)。q 功能:
16、用一個(gè)已知的對象來初始化一個(gè)被創(chuàng)建的同類的對象。功能:用一個(gè)已知的對象來初始化一個(gè)被創(chuàng)建的同類的對象??截惓跏蓟瘶?gòu)造函數(shù)實(shí)際上也是構(gòu)造函數(shù)。拷貝初始化構(gòu)造函數(shù)實(shí)際上也是構(gòu)造函數(shù)。q 特點(diǎn):特點(diǎn): 1、函數(shù)名與類同名,該函數(shù)沒有返回類型;、函數(shù)名與類同名,該函數(shù)沒有返回類型; 2、函數(shù)只有一個(gè)參數(shù),且是對類對象的引用;、函數(shù)只有一個(gè)參數(shù),且是對類對象的引用; 3、每個(gè)類都必須有一個(gè)拷貝構(gòu)造函數(shù)。、每個(gè)類都必須有一個(gè)拷貝構(gòu)造函數(shù)。q 格式:格式: :(const&) 其中,其中,const是一個(gè)類型修飾符,被它修飾的對象是一個(gè)不是一個(gè)類型修飾符,被它修飾的對象是一個(gè)不能被更新的常量。能被更新的常量
17、。q 如果類中沒有說明拷貝構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)如果類中沒有說明拷貝構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)具有上術(shù)形式的缺省拷貝構(gòu)造函數(shù)。作為該類的公有成員。具有上術(shù)形式的缺省拷貝構(gòu)造函數(shù)。作為該類的公有成員。4. 拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院#includeusing namespace std;class Person char* pName;public:Person(char* pN)cout Constructing pN endl;pName=new charstrlen(pN)+1;if(pName!=0)strcpy(pN
18、ame,pN);Person()coutDestructing pName endl;if(pName) delete pName;pName=NULL;void main()Person p1(Tom);Person p2(p1);堆內(nèi)存未拷貝堆內(nèi)存未拷貝Constructing TomDestructing TomDestructing葺葺葺葺葺葺葺葺葺葺導(dǎo)致執(zhí)行錯(cuò)誤導(dǎo)致執(zhí)行錯(cuò)誤淺拷貝淺拷貝拷貝后拷貝后拷貝前拷貝前&堆堆1p2&堆堆1Tomp1堆堆1&堆堆1Tomp1堆堆1C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院#includeusing namespace std;cla
19、ss Person char* pName;public:Person(char* pN);Person(const Person& p);Person();Person:Person(char* pN)coutConstructing pN endl;pName=new charstrlen(pN)+1;if(pName!=0) strcpy(pName,pN);Person:Person(const Person& p)coutCopying p.pName n;pName=new charstrlen(p.pName)+1;if(pName!=0) strcpy(pName,p.pNam
20、e);Person:Person() coutDestructing pName endl; if(pName) delete pName; pName=NULL;void main() Person p1(Tom); Person p2(p1); Constructing TomCopying TomDestructing TomDestructing Tom拷貝后拷貝后拷貝前拷貝前&堆堆1p2深拷貝深拷貝&堆堆1Tomp1堆堆1&堆堆1Tomp1堆堆1Tom堆堆2&堆堆2C+程序設(shè)計(jì) 第五章 堆與拷貝構(gòu)造函數(shù) 沈陽航空工業(yè)學(xué)院調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(gòu)造函數(shù) class Personpub
21、lic:Person(char* pN);Person(const Person& p);Person();protected: char* pName;Person:Person(char* pN)pName=new charstrlen(pN)+1;if(pName!=0) strcpy(pName,pN);coutthis Constructing pNameendl;Person:Person(const Person& p)pName=new charstrlen(p.pName)+1;if(pName!=0) strcpy(pName,p.pName);coutthis Copyi
22、ng p.pName n;Person:Person() coutthis Destructing pName endl; if(pName) delete pName; pName=NULL;Person fun(Person Q) coutfun.n; return Q;void main()coutmain.n;Person p1(Tom); Person p2=p1;fun(p2);main.0012F55C Constructing Tom0012F560 Copying Tom0012F564 Copying Tomfun.0012F568 Copying Tom0012F564 Destructing Tom0012F568 Destructing Tom0012F560 Destructing Tom0012F55C Destructing TomC+程序設(shè)計(jì)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度消防安全應(yīng)急預(yù)案修訂與培訓(xùn)合同3篇
- 二零二五年度展覽展示道具設(shè)計(jì)與制作合同3篇
- 二零二五年度智能農(nóng)業(yè)設(shè)備研發(fā)個(gè)人合伙退出合同3篇
- 二零二五年度房屋買賣合同附加物業(yè)管理合同3篇
- 二零二五年度委托加工生產(chǎn)產(chǎn)品合同3篇
- 二零二五年度房產(chǎn)購買貸款按揭合同范本(含車位)3篇
- 二零二五年度建筑工地磚渣資源化利用合作協(xié)議3篇
- 二零二五年度公益扶貧項(xiàng)目幫扶協(xié)議
- 二零二五年度新能源汽車充電車位租賃優(yōu)惠政策合同3篇
- 二零二五年度施工現(xiàn)場安全風(fēng)險(xiǎn)評估與整改合同3篇
- 2025年四川長寧縣城投公司招聘筆試參考題庫含答案解析
- 2024年06月上海廣發(fā)銀行上海分行社會(huì)招考(622)筆試歷年參考題庫附帶答案詳解
- TSG 51-2023 起重機(jī)械安全技術(shù)規(guī)程 含2024年第1號修改單
- 計(jì)算機(jī)科學(xué)導(dǎo)論
- 浙江省杭州市錢塘區(qū)2023-2024學(xué)年四年級上學(xué)期英語期末試卷
- 《工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)》(2002年修訂本)
- 2024年一級消防工程師《消防安全技術(shù)綜合能力》考試真題及答案解析
- 2024-2025學(xué)年六上科學(xué)期末綜合檢測卷(含答案)
- 安徽省森林撫育技術(shù)導(dǎo)則
- 2023七年級英語下冊 Unit 3 How do you get to school Section A 第1課時(shí)(1a-2e)教案 (新版)人教新目標(biāo)版
- 泌尿科主任述職報(bào)告
評論
0/150
提交評論