




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C+程序設(shè)計(jì)教程(第二版)第九章 對(duì)象生滅 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 ) 初始化要求:對(duì)象與變量的不同在于對(duì)象對(duì)應(yīng)于事物,要求從誕生之時(shí)起便有明確的意義.封裝性要求:初始化不是簡(jiǎn)單的參數(shù)與成員對(duì)應(yīng),而是聯(lián)系參數(shù)到成員的過程.構(gòu)造函數(shù)名:該過程產(chǎn)生對(duì)象,而不是捆綁對(duì)象的成員函數(shù)調(diào)用,因而它是特殊的成員函數(shù)形式:與變量的定義形式保持一致.構(gòu)造函數(shù)原則上不能失敗,也沒有返回形式例外:一次性對(duì)象構(gòu)造,沒有對(duì)象名,與強(qiáng)制轉(zhuǎn)換的形式一致,因而它是一個(gè)特定類型的對(duì)象.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)會(huì)默認(rèn)定義一個(gè)無(wú)參空函數(shù):class Datepublic: / 相當(dāng)于定義了Date();int main() Date d; / ok / .18:17:595任何其他的構(gòu)造函數(shù)定義,都將阻止默認(rèn)無(wú)參空函數(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í)行之間的剎那間完成,在類中有對(duì)象成員時(shí),那個(gè)剎那間便是調(diào)用對(duì)象所在類的構(gòu)造函數(shù),以創(chuàng)建對(duì)象空間的時(shí)機(jī),左邊的程序得到下列運(yùn)行結(jié)果:StudentId: 1Student: Randy說(shuō)明先成員構(gòu)造,后自身構(gòu)造成員構(gòu)造不見顯式調(diào)用,而是悄悄調(diào)用無(wú)參構(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 對(duì)象創(chuàng)建的運(yùn)行順序?yàn)椋?Date e18:17:599同一工程不同代碼文件全局對(duì)象的創(chuàng)建沒有明確順序規(guī)定對(duì)策:不要讓不同文件的全局對(duì)象互為依賴因?yàn)橐蕾嚲哂邢群笮裕淙謱?duì)象的創(chuàng)建不能保證該依賴性發(fā)揮作用全局對(duì)象在main函數(shù)啟動(dòng)之前生成,而調(diào)試則在main函數(shù)啟動(dòng)之后對(duì)策:調(diào)試時(shí),應(yīng)先將全局對(duì)象作為局部對(duì)象來(lái)運(yùn)行觀察或者,在構(gòu)造函數(shù)中添加輸出語(yǔ)句來(lái)觀察運(yùn)行過程18:17:5910成員對(duì)象的構(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ù)的花括號(hào)體18:17:5911全局?jǐn)?shù)據(jù)區(qū):全局對(duì)象,靜態(tài)全局對(duì)象,靜態(tài)局部對(duì)象,常對(duì)象類的靜態(tài)數(shù)據(jù)成員也存放在該數(shù)據(jù)區(qū)棧區(qū):局部對(duì)象(根據(jù)不同編譯器的實(shí)現(xiàn)方法,臨時(shí)對(duì)象可能在棧區(qū),也可能在動(dòng)態(tài)存儲(chǔ)區(qū),也可能一部分在棧區(qū),一部分在動(dòng)態(tài)存儲(chǔ)區(qū))動(dòng)態(tài)存儲(chǔ)區(qū)(也稱堆區(qū)):用new申請(qǐng)的對(duì)象除此之外,還可以指定特殊地址空間,存放對(duì)象構(gòu)造位置18:17:59125. 拷貝構(gòu)造函數(shù) ( Copy Constructors ) 對(duì)象本體
8、與對(duì)象實(shí)體:對(duì)象本體也是對(duì)象主體,對(duì)象實(shí)體則還包括屬于對(duì)象的衍生物,如,某個(gè)人體是人類對(duì)象的主體,然而某人還擁有父母,房產(chǎn)等屬于某人的世系或資產(chǎn),描述人的屬性不僅僅只是人體數(shù)據(jù)從形式上看,對(duì)象除了包括數(shù)據(jù)成員,還包括指向數(shù)據(jù)的指針18:17:5913拷貝構(gòu)造函數(shù):以本類對(duì)象為常量引用參數(shù)的構(gòu)造函數(shù):class Datepublic: Date(); Date(const Date& d); / . . .;Date x; /調(diào)用無(wú)參構(gòu)造函數(shù)Date y(x); /調(diào)用拷貝構(gòu)造函數(shù)18:17:5914默認(rèn)拷貝構(gòu)造函數(shù):若類中沒有定義拷貝構(gòu)造函數(shù),則系統(tǒng)會(huì)悄悄定義一個(gè)默認(rèn)空拷貝構(gòu)造函數(shù): Date
9、(const Date& d)默認(rèn)拷貝構(gòu)造函數(shù)體一定是空的空拷貝構(gòu)造函數(shù)負(fù)責(zé)將傳遞的對(duì)象到新創(chuàng)的對(duì)象做對(duì)象本體的位對(duì)位拷貝(甚至連指針值都相等,即與參數(shù)對(duì)象擁有共同的資源)拷貝構(gòu)造函數(shù)體的工作不負(fù)責(zé)位對(duì)位對(duì)象復(fù)制,一般來(lái)說(shuō),它負(fù)責(zé)資源分配和由此而來(lái)的指針修改18:17:5915拷貝構(gòu)造函數(shù)體的工作不負(fù)責(zé)位對(duì)位對(duì)象復(fù)制,一般來(lái)說(shuō),它負(fù)責(zé)資源分配和由此而來(lái)的指針修改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 )對(duì)象結(jié)束其生命時(shí),會(huì)被系統(tǒng)悄悄地銷毀(析構(gòu)).即對(duì)象本體空間與名字脫離關(guān)系.對(duì)象結(jié)束生命時(shí),若對(duì)象本體與對(duì)象實(shí)體不同,則需要人為地進(jìn)行資源釋放,以保證對(duì)象本體失效之前,資源被收回18:17:5917定義析構(gòu)函數(shù)的目的:由于對(duì)象本體與實(shí)體不同,所以要進(jìn)行對(duì)象占有資源的釋放工作一般來(lái)說(shuō),一個(gè)類,若有人為定義的
11、拷貝構(gòu)造函數(shù),則也應(yīng)該定義析構(gòu)函數(shù)因?yàn)閷?duì)象創(chuàng)建中有資源要獲得分配,則對(duì)象失效前必應(yīng)先釋放資源18:17:59187. 轉(zhuǎn)型與賦值 ( Conversion & Assignment ) 對(duì)象轉(zhuǎn)型一個(gè)構(gòu)造函數(shù),含有一個(gè)其他數(shù)據(jù)類型的參數(shù),顯然其意義為,用該參數(shù)類型的值可以創(chuàng)建本對(duì)象.從另一方面看,參數(shù)類型的值可以轉(zhuǎn)換為本對(duì)象. 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對(duì)象轉(zhuǎn)型的規(guī)則:只會(huì)嘗試含有一個(gè)參數(shù)的構(gòu)造函數(shù)如果有二義性,則會(huì)放棄嘗試推導(dǎo)是一次性的,不允許多步推導(dǎo) fn(“Jenny”)不能匹配 void fn(const Student& s); 因?yàn)椋骸盝enny” - string - Student 經(jīng)歷了兩步.18:17:5920對(duì)象賦值即對(duì)象拷貝:兩個(gè)已經(jīng)存在的對(duì)象之間的復(fù)制Person d, g;d = g; / 對(duì)象賦值對(duì)象賦值便是使用類中的賦值操作符如果類中沒有定義賦值操作符,則系統(tǒng)悄悄地定義一個(gè)默認(rèn)的賦值操作符: Person& operator=(const Person& p) memcpy(*this, *p, sizeof(p); 18:17:5921當(dāng)對(duì)象本體與對(duì)象實(shí)體不同時(shí),則對(duì)象賦值操作符與拷貝構(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. 本站所有資源如無(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年保濕面膜巾行業(yè)深度研究分析報(bào)告
- 中國(guó)水稻插秧機(jī)行業(yè)市場(chǎng)全景監(jiān)測(cè)及投資前景展望報(bào)告
- 溫州環(huán)境監(jiān)測(cè)設(shè)備項(xiàng)目可行性研究報(bào)告
- 環(huán)保設(shè)施行業(yè)發(fā)展前景預(yù)測(cè)及投資戰(zhàn)略研究報(bào)告
- 2025年沖板式定量給料秤行業(yè)深度研究分析報(bào)告
- 螺旋形節(jié)能燈管項(xiàng)目可行性研究報(bào)告
- 2025年火災(zāi)報(bào)警控制系統(tǒng)行業(yè)深度研究分析報(bào)告
- 機(jī)器設(shè)備抵押貸款評(píng)估分析報(bào)告書
- 2025年中國(guó)復(fù)方丹參片行業(yè)市場(chǎng)深度分析及投資策略咨詢報(bào)告
- 2025年衛(wèi)生紙后設(shè)備行業(yè)深度研究分析報(bào)告
- 新教材青島版六三制四年級(jí)下冊(cè)科學(xué)全冊(cè)教案(教學(xué)設(shè)計(jì))
- DB11-T 825-2021綠色建筑評(píng)價(jià)標(biāo)準(zhǔn)
- 醫(yī)院招聘醫(yī)護(hù)人員報(bào)名登記表
- 完整解讀2022年《義務(wù)教育課程方案》2022年《義務(wù)教育課程方案(2022版)》新課標(biāo)PPT
- 央企最新版員工手冊(cè)vvv
- 新生兒科出科考試試卷試題
- 信息化教學(xué)設(shè)計(jì)教案大學(xué)語(yǔ)文
- 植物的營(yíng)養(yǎng)器官:根、莖、葉匯總
- 會(huì)議、匯報(bào)材料排版格式
- 華為公司產(chǎn)品線獎(jiǎng)金分配暫行辦法
- 兒童能力評(píng)估量表(PEDI拍迪)
評(píng)論
0/150
提交評(píng)論