版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+程序設(shè)計(jì)教程(第二版)第九章 對象生滅 Chapter 9 Object Birth & Death 18:17:591第九章內(nèi)容構(gòu)造函數(shù)設(shè)計(jì) ( Constructor Design ) 構(gòu)造函數(shù)重載 ( Constructor Overload ) 類成員初始化 ( Class Member Initializations ) 構(gòu)造順序 ( Constructing Order )拷貝構(gòu)造函數(shù) ( Copy Constructors ) 析構(gòu)函數(shù) ( Destructors ) 轉(zhuǎn)型與賦值 ( Conversion & Assignment ) 18:17:5921. 構(gòu)造函數(shù)設(shè)計(jì) (
2、 Constructor Design ) 初始化要求:對象與變量的不同在于對象對應(yīng)于事物,要求從誕生之時(shí)起便有明確的意義.封裝性要求:初始化不是簡單的參數(shù)與成員對應(yīng),而是聯(lián)系參數(shù)到成員的過程.構(gòu)造函數(shù)名:該過程產(chǎn)生對象,而不是捆綁對象的成員函數(shù)調(diào)用,因而它是特殊的成員函數(shù)形式:與變量的定義形式保持一致.構(gòu)造函數(shù)原則上不能失敗,也沒有返回形式例外:一次性對象構(gòu)造,沒有對象名,與強(qiáng)制轉(zhuǎn)換的形式一致,因而它是一個(gè)特定類型的對象.18:17:5932. 構(gòu)造函數(shù)重載 ( Constructor Overload ) 構(gòu)造函數(shù)可以重載,也可以參數(shù)默認(rèn):class Datepublic: Date(co
3、nst string& s); Date(int y=2003, int m=12, int d=1); / .;int main() Date d(“2006-12-26”); Date e(2000, 12, 25); Date f(2001, 10); Date g(2002); Date h(); / .18:17:594若類中沒有定義構(gòu)造函數(shù),則系統(tǒng)會默認(rèn)定義一個(gè)無參空函數(shù):class Datepublic: / 相當(dāng)于定義了Date();int main() Date d; / ok / .18:17:595任何其他的構(gòu)造函數(shù)定義,都將阻止默認(rèn)無參空函數(shù)的產(chǎn)生:class Date
4、public: Date(int y, int m, int d) / .;int main() Date d; / error / .18:17:5963. 類成員初始化 ( Class Member Initializations ) class StudentID int a;public: StudentID() a = 1; cout“StudentId: an; ;class Student string name; StudentID id;public: Student(string n=noName) cout“Student: + n +n; name = n; ;int
5、main() Student s(Randy);數(shù)據(jù)成員的空間分配是在構(gòu)造函數(shù)被調(diào)用和其過程被執(zhí)行之間的剎那間完成,在類中有對象成員時(shí),那個(gè)剎那間便是調(diào)用對象所在類的構(gòu)造函數(shù),以創(chuàng)建對象空間的時(shí)機(jī),左邊的程序得到下列運(yùn)行結(jié)果:StudentId: 1Student: Randy說明先成員構(gòu)造,后自身構(gòu)造成員構(gòu)造不見顯式調(diào)用,而是悄悄調(diào)用無參構(gòu)造函數(shù)18:17:597class StudentID int a;public: StudentID(int id=0) a=id; cout“StudentId: a“n”; ;class Student string name; StudentID
6、id;public: Student(string n=noName, int ssID=0) :id(ssID),name(n) cout“Student: nDate e 對象創(chuàng)建的運(yùn)行順序?yàn)椋?Date e18:17:599同一工程不同代碼文件全局對象的創(chuàng)建沒有明確順序規(guī)定對策:不要讓不同文件的全局對象互為依賴因?yàn)橐蕾嚲哂邢群笮?,而其全局對象的?chuàng)建不能保證該依賴性發(fā)揮作用全局對象在main函數(shù)啟動之前生成,而調(diào)試則在main函數(shù)啟動之后對策:調(diào)試時(shí),應(yīng)先將全局對象作為局部對象來運(yùn)行觀察或者,在構(gòu)造函數(shù)中添加輸出語句來觀察運(yùn)行過程18:17:5910成員對象的構(gòu)造順序按類定義的出現(xiàn)順序,最
7、后執(zhí)行自身構(gòu)造函數(shù): class A B b; C c; D d; public: A() / . ; int main() A a; 則構(gòu)造順序?yàn)閎cd,然后執(zhí)行A的構(gòu)造函數(shù)的花括號體18:17:5911全局?jǐn)?shù)據(jù)區(qū):全局對象,靜態(tài)全局對象,靜態(tài)局部對象,常對象類的靜態(tài)數(shù)據(jù)成員也存放在該數(shù)據(jù)區(qū)棧區(qū):局部對象(根據(jù)不同編譯器的實(shí)現(xiàn)方法,臨時(shí)對象可能在棧區(qū),也可能在動態(tài)存儲區(qū),也可能一部分在棧區(qū),一部分在動態(tài)存儲區(qū))動態(tài)存儲區(qū)(也稱堆區(qū)):用new申請的對象除此之外,還可以指定特殊地址空間,存放對象構(gòu)造位置18:17:59125. 拷貝構(gòu)造函數(shù) ( Copy Constructors ) 對象本體
8、與對象實(shí)體:對象本體也是對象主體,對象實(shí)體則還包括屬于對象的衍生物,如,某個(gè)人體是人類對象的主體,然而某人還擁有父母,房產(chǎn)等屬于某人的世系或資產(chǎn),描述人的屬性不僅僅只是人體數(shù)據(jù)從形式上看,對象除了包括數(shù)據(jù)成員,還包括指向數(shù)據(jù)的指針18:17:5913拷貝構(gòu)造函數(shù):以本類對象為常量引用參數(shù)的構(gòu)造函數(shù):class Datepublic: Date(); Date(const Date& d); / . . .;Date x; /調(diào)用無參構(gòu)造函數(shù)Date y(x); /調(diào)用拷貝構(gòu)造函數(shù)18:17:5914默認(rèn)拷貝構(gòu)造函數(shù):若類中沒有定義拷貝構(gòu)造函數(shù),則系統(tǒng)會悄悄定義一個(gè)默認(rèn)空拷貝構(gòu)造函數(shù): Date
9、(const Date& d)默認(rèn)拷貝構(gòu)造函數(shù)體一定是空的空拷貝構(gòu)造函數(shù)負(fù)責(zé)將傳遞的對象到新創(chuàng)的對象做對象本體的位對位拷貝(甚至連指針值都相等,即與參數(shù)對象擁有共同的資源)拷貝構(gòu)造函數(shù)體的工作不負(fù)責(zé)位對位對象復(fù)制,一般來說,它負(fù)責(zé)資源分配和由此而來的指針修改18:17:5915拷貝構(gòu)造函數(shù)體的工作不負(fù)責(zé)位對位對象復(fù)制,一般來說,它負(fù)責(zé)資源分配和由此而來的指針修改class Person char* pName;public: Person(char* pN=noName) pName = new charstrlen(pN)+1; if(pName) strcpy(pName,pN); Per
10、son(const Person& s) pName = new charstrlen(s.pName)+1; if(pName) strcpy(pName, s.pName); Person() delete pName; ;18:17:59166. 析構(gòu)函數(shù) ( Destructors )對象結(jié)束其生命時(shí),會被系統(tǒng)悄悄地銷毀(析構(gòu)).即對象本體空間與名字脫離關(guān)系.對象結(jié)束生命時(shí),若對象本體與對象實(shí)體不同,則需要人為地進(jìn)行資源釋放,以保證對象本體失效之前,資源被收回18:17:5917定義析構(gòu)函數(shù)的目的:由于對象本體與實(shí)體不同,所以要進(jìn)行對象占有資源的釋放工作一般來說,一個(gè)類,若有人為定義的
11、拷貝構(gòu)造函數(shù),則也應(yīng)該定義析構(gòu)函數(shù)因?yàn)閷ο髣?chuàng)建中有資源要獲得分配,則對象失效前必應(yīng)先釋放資源18:17:59187. 轉(zhuǎn)型與賦值 ( Conversion & Assignment ) 對象轉(zhuǎn)型一個(gè)構(gòu)造函數(shù),含有一個(gè)其他數(shù)據(jù)類型的參數(shù),顯然其意義為,用該參數(shù)類型的值可以創(chuàng)建本對象.從另一方面看,參數(shù)類型的值可以轉(zhuǎn)換為本對象. class Student public: Student(const string& n); / . ; void fn(Student& s); int main() string t=“jenny”; fn(t); / 參數(shù)為string,卻能匹配Student類型
12、 18:17:5919對象轉(zhuǎn)型的規(guī)則:只會嘗試含有一個(gè)參數(shù)的構(gòu)造函數(shù)如果有二義性,則會放棄嘗試推導(dǎo)是一次性的,不允許多步推導(dǎo) fn(“Jenny”)不能匹配 void fn(const Student& s); 因?yàn)椋骸盝enny” - string - Student 經(jīng)歷了兩步.18:17:5920對象賦值即對象拷貝:兩個(gè)已經(jīng)存在的對象之間的復(fù)制Person d, g;d = g; / 對象賦值對象賦值便是使用類中的賦值操作符如果類中沒有定義賦值操作符,則系統(tǒng)悄悄地定義一個(gè)默認(rèn)的賦值操作符: Person& operator=(const Person& p) memcpy(*this, *p, sizeof(p); 18:17:5921當(dāng)對象本體與對象實(shí)體不同時(shí),則對象賦值操作符與拷貝構(gòu)造函數(shù)一樣,必須自定義:class Person char* pName;public: Person(char* pN=noName); Person(const Person& s); Person& operator=(const Person& s) if(this=&s)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025買賣合同范本(宅基地)
- 科技賦能下的寵物托兒所財(cái)務(wù)風(fēng)險(xiǎn)識別與防范
- 課題申報(bào)參考:量子信息產(chǎn)業(yè)勞動力教育需求調(diào)查與教育資源開發(fā)
- 課題申報(bào)參考:勞動力流動、代際居住分離與農(nóng)村養(yǎng)老服務(wù)整合研究
- 知識經(jīng)濟(jì)時(shí)代的終身學(xué)習(xí)與發(fā)展
- 2025年華師大新版七年級生物下冊月考試卷含答案
- 2025年湘教新版九年級歷史下冊階段測試試卷含答案
- 2025年浙教版必修1歷史下冊月考試卷
- 2025年人教A新版七年級科學(xué)下冊階段測試試卷含答案
- 2025年蘇教新版九年級歷史下冊月考試卷
- 【語文】第23課《“蛟龍”探海》課件 2024-2025學(xué)年統(tǒng)編版語文七年級下冊
- 加強(qiáng)教師隊(duì)伍建設(shè)教師領(lǐng)域?qū)W習(xí)二十屆三中全會精神專題課
- 2024-2025學(xué)年人教版數(shù)學(xué)七年級上冊期末復(fù)習(xí)卷(含答案)
- 2024年決戰(zhàn)行測5000題言語理解與表達(dá)(培優(yōu)b卷)
- 四年級數(shù)學(xué)上冊人教版24秋《小學(xué)學(xué)霸單元期末標(biāo)準(zhǔn)卷》考前專項(xiàng)沖刺訓(xùn)練
- 2025年慢性阻塞性肺疾病全球創(chuàng)議GOLD指南修訂解讀課件
- (完整版)減數(shù)分裂課件
- 銀行辦公大樓物業(yè)服務(wù)投標(biāo)方案投標(biāo)文件(技術(shù)方案)
- 第01講 直線的方程(九大題型)(練習(xí))
- 微粒貸逾期還款協(xié)議書范本
- 人教版七年級上冊數(shù)學(xué)全冊課時(shí)練習(xí)帶答案
評論
0/150
提交評論