




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、面向?qū)ο蟮某绦蛟O(shè)計(面向?qū)ο蟮某绦蛟O(shè)計(Object Oriented Programming)是在結(jié)構(gòu)化程序設(shè)計的基礎(chǔ)上)是在結(jié)構(gòu)化程序設(shè)計的基礎(chǔ)上的進(jìn)一步發(fā)展,簡稱的進(jìn)一步發(fā)展,簡稱OOP。 是是OOP技術(shù)中的一個重要概念。對象技術(shù)中的一個重要概念。對象是對客觀世界的事物的描述,是是對客觀世界的事物的描述,是和對這些和對這些數(shù)據(jù)進(jìn)行操作的數(shù)據(jù)進(jìn)行操作的所構(gòu)成的實體。所構(gòu)成的實體。 POP(面向過程的程序設(shè)計面向過程的程序設(shè)計)采用以采用以功能功能為為中心的軟件設(shè)計方法,而中心的軟件設(shè)計方法,而OOP采用以采用以對象對象為中為中心的軟件設(shè)計方法。心的軟件設(shè)計方法。是對一組對象的抽象?;蛘哒f,
2、類是對是對一組對象的抽象?;蛘哒f,類是對一組對象的相同數(shù)據(jù)和方法的定義或描述。這一組對象的相同數(shù)據(jù)和方法的定義或描述。這樣對象就成為類的一個實例。樣對象就成為類的一個實例。根據(jù)類的這種概念,類實質(zhì)上是一種新的根據(jù)類的這種概念,類實質(zhì)上是一種新的數(shù)據(jù)類型,就象我們熟悉的浮點(diǎn)型、整型等數(shù)數(shù)據(jù)類型,就象我們熟悉的浮點(diǎn)型、整型等數(shù)據(jù)類型一樣。據(jù)類型一樣。一個類的所有對象都有相同的數(shù)據(jù)結(jié)構(gòu),一個類的所有對象都有相同的數(shù)據(jù)結(jié)構(gòu),并且共享相同的實現(xiàn)操作的代碼。并且共享相同的實現(xiàn)操作的代碼。類與對象的關(guān)系如同數(shù)據(jù)類型與變量之間類與對象的關(guān)系如同數(shù)據(jù)類型與變量之間的關(guān)系。的關(guān)系。面向?qū)ο蠹夹g(shù)是為了適應(yīng)開發(fā)和維護(hù)
3、面向?qū)ο蠹夹g(shù)是為了適應(yīng)開發(fā)和維護(hù)復(fù)雜應(yīng)用軟件的需要,為解決軟件危機(jī)而誕復(fù)雜應(yīng)用軟件的需要,為解決軟件危機(jī)而誕生的。生的。 在面向?qū)ο蟮某绦蛟O(shè)計中,通過對象來在面向?qū)ο蟮某绦蛟O(shè)計中,通過對象來表示事物,用對象與對象間消息的傳遞來表表示事物,用對象與對象間消息的傳遞來表現(xiàn)事物間的聯(lián)系;用對象的方法實現(xiàn)對對象現(xiàn)事物間的聯(lián)系;用對象的方法實現(xiàn)對對象的操作。的操作。 C+是一種面向?qū)ο蟮某绦蛟O(shè)計語言。是一種面向?qū)ο蟮某绦蛟O(shè)計語言。此外還有此外還有java 等。等。面向?qū)ο笈c面向過程程序設(shè)計的比較:面向?qū)ο笈c面向過程程序設(shè)計的比較: (1)傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計方法以)傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計方法以過程過程為中
4、心構(gòu)為中心構(gòu)造應(yīng)用程序,數(shù)據(jù)和處理數(shù)據(jù)的代碼是分離的、相造應(yīng)用程序,數(shù)據(jù)和處理數(shù)據(jù)的代碼是分離的、相互獨(dú)立的實體,程序可重用代碼少,且當(dāng)代碼量增互獨(dú)立的實體,程序可重用代碼少,且當(dāng)代碼量增加時維護(hù)數(shù)據(jù)和代碼的一致性困難。加時維護(hù)數(shù)據(jù)和代碼的一致性困難。 (2)面向?qū)ο蟪绦蛟O(shè)計方法中以為)面向?qū)ο蟪绦蛟O(shè)計方法中以為對象對象中心構(gòu)造中心構(gòu)造應(yīng)用程序,所具有的封裝性和繼承性使得代碼重用應(yīng)用程序,所具有的封裝性和繼承性使得代碼重用成為可能,并大大減少了程序出錯的可能性。成為可能,并大大減少了程序出錯的可能性。 (3)面向?qū)ο蠓椒ㄎ樟私Y(jié)構(gòu)化程序設(shè)計方法的)面向?qū)ο蠓椒ㄎ樟私Y(jié)構(gòu)化程序設(shè)計方法的優(yōu)點(diǎn),同
5、時引入了新概念、新機(jī)制。優(yōu)點(diǎn),同時引入了新概念、新機(jī)制。面向?qū)ο蠓椒ǖ幕咎攸c(diǎn)可歸納為四點(diǎn):面向?qū)ο蠓椒ǖ幕咎攸c(diǎn)可歸納為四點(diǎn):抽象性、封裝性,繼承性,多態(tài)性。抽象性、封裝性,繼承性,多態(tài)性。 1、抽象性、抽象性從具體的對象中舍棄個別的、非本質(zhì)的或從具體的對象中舍棄個別的、非本質(zhì)的或與研究主旨無關(guān)的次要特征,而抽取與研究工與研究主旨無關(guān)的次要特征,而抽取與研究工作有關(guān)的實質(zhì)性的內(nèi)容。作有關(guān)的實質(zhì)性的內(nèi)容。 2、封裝性、封裝性在面向?qū)ο蟮姆椒ㄖ校瑪?shù)據(jù)與操作數(shù)據(jù)的在面向?qū)ο蟮姆椒ㄖ?,?shù)據(jù)與操作數(shù)據(jù)的方法是結(jié)合在一起的。這種結(jié)合稱為封裝。方法是結(jié)合在一起的。這種結(jié)合稱為封裝。封裝還體現(xiàn)在對象中的數(shù)據(jù)
6、的對外不可訪封裝還體現(xiàn)在對象中的數(shù)據(jù)的對外不可訪問性,稱為問性,稱為數(shù)據(jù)隱藏數(shù)據(jù)隱藏。數(shù)據(jù)隱藏是對象與結(jié)構(gòu)。數(shù)據(jù)隱藏是對象與結(jié)構(gòu)體變量的主要區(qū)別。體變量的主要區(qū)別。3、繼承性、繼承性 繼承是面向?qū)ο蠓椒ǖ挠忠惶卣?。所謂繼繼承是面向?qū)ο蠓椒ǖ挠忠惶卣?。所謂繼承就是由一個類獲得另一個新類的過程,在這承就是由一個類獲得另一個新類的過程,在這個新類中包含個新類中包含(繼承繼承)了前一個類的某些特性了前一個類的某些特性(例例如:代碼如:代碼)。 繼承增強(qiáng)了軟件的可擴(kuò)充性,并為代碼重繼承增強(qiáng)了軟件的可擴(kuò)充性,并為代碼重用提供了強(qiáng)有力的手段。用提供了強(qiáng)有力的手段。 多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計中的又一重多態(tài)性是
7、面向?qū)ο蟪绦蛟O(shè)計中的又一重要特征。要特征。 多態(tài)性是指相同的函數(shù)調(diào)用被不同的對多態(tài)性是指相同的函數(shù)調(diào)用被不同的對象接收時,可以導(dǎo)致不同的行為稱為多態(tài)性。象接收時,可以導(dǎo)致不同的行為稱為多態(tài)性。 多態(tài)性的意義就在于,各類的對象各以不多態(tài)性的意義就在于,各類的對象各以不同的方式響應(yīng)同一消息,即所謂的同的方式響應(yīng)同一消息,即所謂的“同一接口同一接口,多種方式,多種方式”。正如。正如C語言中的語言中的/(除法除法)對整數(shù)對整數(shù)和實數(shù)的操作有區(qū)別一樣。和實數(shù)的操作有區(qū)別一樣。問題引入:問題引入:C語言中的結(jié)構(gòu)體語言中的結(jié)構(gòu)體#include struct date int year, month , d
8、ay; ;void main( )struct date d1;d1.year=1999; d1.month=12; d1.day=31;cout d1.year/d1.month/d1.dayendl;分析:分析:結(jié)構(gòu)體變量結(jié)構(gòu)體變量d1有三個成員,主函數(shù)有三個成員,主函數(shù)main可以直可以直接使用接使用d1的三個成員。即:結(jié)構(gòu)體類型沒有封裝功能。的三個成員。即:結(jié)構(gòu)體類型沒有封裝功能。 而面向?qū)ο蟮某绦蛟O(shè)計的一個重要特征就是封裝而面向?qū)ο蟮某绦蛟O(shè)計的一個重要特征就是封裝性,采用類可以實現(xiàn)數(shù)據(jù)的封裝。性,采用類可以實現(xiàn)數(shù)據(jù)的封裝。1、什么是類?、什么是類? 類是對具有相同數(shù)據(jù)和方法的一組對象
9、的定義或類是對具有相同數(shù)據(jù)和方法的一組對象的定義或描述。描述。(類的描述中包含數(shù)據(jù)與對數(shù)據(jù)操作方法的定義類的描述中包含數(shù)據(jù)與對數(shù)據(jù)操作方法的定義) 一個類的所有對象都有相同的數(shù)據(jù)結(jié)構(gòu),并且一個類的所有對象都有相同的數(shù)據(jù)結(jié)構(gòu),并且共共享享實現(xiàn)操作的代碼。實現(xiàn)操作的代碼。2、什么是對象?、什么是對象? 對象是類的一個實例,因此在定義了類之后,利對象是類的一個實例,因此在定義了類之后,利用類來創(chuàng)建該類的對象。用類來創(chuàng)建該類的對象。 3、類和對象的關(guān)系、類和對象的關(guān)系 類是一種新的數(shù)據(jù)類型,對象是這種類型的變量。類是一種新的數(shù)據(jù)類型,對象是這種類型的變量。1、類的聲明格式、類的聲明格式class pr
10、ivate: ; protected: ; public: ;;; 考慮:如何定義一個表示考慮:如何定義一個表示日期日期的類的類#include class TDate private : int year, month, day; public :void SetDate(int y, int m, int d); void Print () /輸出日期函數(shù)輸出日期函數(shù) cout year / month / day endl; ; void TDate:SetDate(int y, int m, int d) year=y; month=m; day=d; /設(shè)置日期函數(shù)設(shè)置日期函數(shù)說明:
11、函數(shù)說明:函數(shù)SetDate的實現(xiàn)放在外面,而函數(shù)的實現(xiàn)放在外面,而函數(shù)Print的實現(xiàn)放的實現(xiàn)放在類的定義中間。在類的定義中間。2、在每個類的定義中:、在每個類的定義中: class是定義類的關(guān)鍵字。是定義類的關(guān)鍵字。 是一個標(biāo)識符,用于標(biāo)識一個類是一個標(biāo)識符,用于標(biāo)識一個類 大括號內(nèi)是類的說明部分,說明該類的成員。大括號內(nèi)是類的說明部分,說明該類的成員。從內(nèi)容上來看:從內(nèi)容上來看: 類的成員分?jǐn)?shù)據(jù)成員和成員函數(shù)兩種。類的成員分?jǐn)?shù)據(jù)成員和成員函數(shù)兩種。從訪問性來看:從訪問性來看: 類的成員分為私有成員類的成員分為私有成員(private)、公有成員、公有成員(public)和保護(hù)成員和保護(hù)成
12、員(protected)三種。三種。 public、private和和protected的出現(xiàn)次數(shù)與次序的出現(xiàn)次數(shù)與次序可以任意,如果沒有指定,訪問性隱含為可以任意,如果沒有指定,訪問性隱含為private 。 用關(guān)鍵字用關(guān)鍵字private定義的成員構(gòu)成類的內(nèi)部狀態(tài),定義的成員構(gòu)成類的內(nèi)部狀態(tài),public的成員則構(gòu)成與外界通信的接口,通過的成員則構(gòu)成與外界通信的接口,通過public的成員函數(shù)來使用的成員函數(shù)來使用private的數(shù)據(jù)成員,從而在的數(shù)據(jù)成員,從而在C+中中實現(xiàn)了實現(xiàn)了隱藏隱藏。3、注意(補(bǔ)充)、注意(補(bǔ)充) 在類的定義中不允許對其數(shù)據(jù)成員初始化。例如在類的定義中不允許對其數(shù)
13、據(jù)成員初始化。例如下面的類的定義中存在錯誤下面的類的定義中存在錯誤 。 #include class TDate private : int year=1990, month=1, day=1; /不能初始化不能初始化 public :void Print () cout year / month / day endl; ; 將函數(shù)的實現(xiàn)類定義的大括號內(nèi),該成員函數(shù)隱將函數(shù)的實現(xiàn)類定義的大括號內(nèi),該成員函數(shù)隱含為內(nèi)聯(lián)含為內(nèi)聯(lián)(內(nèi)嵌內(nèi)嵌)函數(shù);如果將內(nèi)聯(lián)函數(shù)的實現(xiàn)寫在大括函數(shù);如果將內(nèi)聯(lián)函數(shù)的實現(xiàn)寫在大括號外面,則應(yīng)在函數(shù)名前加上號外面,則應(yīng)在函數(shù)名前加上inline。例如:。例如:#inclu
14、de class TDate private : int year, month, day; public :void Print ( ); ; inline void TDate :Print ( ) cout year / month / day 成員名成員名(*指向?qū)ο蟮闹羔樏赶驅(qū)ο蟮闹羔樏?.成員名成員名 參考下面的程序:參考下面的程序:#include class testprivate:int x;public:int y;int getx();int test:getx()return x; int f()return x; /錯誤錯誤void main()test t;cou
15、tt.xendl; /錯誤錯誤coutt.yendl; 修改下面程序中的錯誤:修改下面程序中的錯誤:#include class TDate private : int year, month, day; public :void SetDate(int y, int m, int d)year=y; month=m; day=d; ;void main()TDate d1;d1.SetDate(2004,10,8); cout d1.year /d1.month / d1.day endl; /使用了類的私有成員使用了類的私有成員year、month、day將程序改為:將程序改為:#incl
16、ude class TDate private : int year, month, day; public :int yy() return year; int mm() return month; int dd() return day; void SetDate(int y, int m, int d)year=y; month=m; day=d; ;void main()TDate d1;d1.SetDate(2004,10,8); cout d1.yy() /d1.mm() / d1.dd() endl; /調(diào)用成員函數(shù)調(diào)用成員函數(shù)/修改的原因:修改的原因: year、month和和
17、day都是類的私有成員,所以不都是類的私有成員,所以不能在能在main函數(shù)中使用函數(shù)中使用;在類中定義的公有成員函數(shù)在類中定義的公有成員函數(shù)yy( )、mm( )和和dd( )后,就可以在后,就可以在main函數(shù)中訪問它的私有函數(shù)中訪問它的私有成員了。成員了。1、問題:、問題:將將數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)中的順序棧定義成類的形式,中的順序棧定義成類的形式,通過棧來實現(xiàn)進(jìn)制轉(zhuǎn)換。通過棧來實現(xiàn)進(jìn)制轉(zhuǎn)換。2、類的定義、類的定義 數(shù)據(jù)成員:數(shù)據(jù)成員:存放元素的數(shù)組(例如存放元素的數(shù)組(例如: x) 棧頂標(biāo)志(例如棧頂標(biāo)志(例如: top) 成員函數(shù):成員函數(shù):棧的初始化(例如棧的初始化(例如: init) 入
18、棧(例如入棧(例如: push) 出棧(例如出棧(例如: pop) 判斷??眨ɡ缗袛鄺?眨ɡ? isempty)3、對象定義:、對象定義:定義一個棧對象,利用該對象中的數(shù)據(jù)定義一個棧對象,利用該對象中的數(shù)據(jù)成員來存放進(jìn)制轉(zhuǎn)換過程中的各個數(shù)字;利用棧的成成員來存放進(jìn)制轉(zhuǎn)換過程中的各個數(shù)字;利用棧的成員函數(shù)來實現(xiàn)相應(yīng)的操作。員函數(shù)來實現(xiàn)相應(yīng)的操作。 4、主函數(shù)、主函數(shù) 從鍵盤輸入一個十進(jìn)制數(shù),輸出對應(yīng)的八進(jìn)制。從鍵盤輸入一個十進(jìn)制數(shù),輸出對應(yīng)的八進(jìn)制。5、程序說明、程序說明為了簡化問題,只考慮將十進(jìn)制轉(zhuǎn)換為八進(jìn)制,為了簡化問題,只考慮將十進(jìn)制轉(zhuǎn)換為八進(jìn)制,棧類中沒有考慮棧滿的情況棧類中沒有考慮
19、棧滿的情況6、程序組織、程序組織 (P200)方法方法1:將所有語句寫到一個文件中。將所有語句寫到一個文件中。 方法方法2:文件文件stack.h是棧的定義,文件是棧的定義,文件stack.cpp是是棧的成員函數(shù)實現(xiàn),文件棧的成員函數(shù)實現(xiàn),文件stack2.cpp使用棧進(jìn)行數(shù)制使用棧進(jìn)行數(shù)制轉(zhuǎn)換。轉(zhuǎn)換。方法方法3:將棧的定義和棧的成員函數(shù)實現(xiàn)存入將棧的定義和棧的成員函數(shù)實現(xiàn)存入C+頭頭文件文件stack.h中,程序文件中,程序文件stack2.cpp使用棧進(jìn)行數(shù)使用棧進(jìn)行數(shù)制轉(zhuǎn)換。制轉(zhuǎn)換。7、源程序文件:、源程序文件:下面是按下面是按方法二方法二來組織的三個文件:來組織的三個文件:/文件文件s
20、tack.hclass stackprivate:int x10;int top;public:void init() ;void push(int);int pop();int is_empty();/文件文件stack.cpp#include stack.hvoid stack:init( ) /初始化堆棧初始化堆棧 top=0; int stack:is_empty( ) /判斷堆棧是否空,空判斷堆棧是否空,空=1if (top=0) return 1; else return 0; void stack:push(int n) /將將n壓入堆棧壓入堆棧xtop=n;top+; int
21、stack:pop( ) /彈出棧頂元素彈出棧頂元素top-; return xtop; /文件文件stack2.cpp#include #include stack.hvoid main()int n; stack s; /定義棧對象變量定義棧對象變量coutn;s.init(); /初始化堆棧初始化堆棧while (n)s.push(n%8); /將當(dāng)前的末位數(shù)字入棧將當(dāng)前的末位數(shù)字入棧n=n/8;while ( !s.is_empty() ) /堆棧不空時堆棧不空時couts.pop(); /輸出棧頂元素輸出棧頂元素四、思考:按要求修改上面的程序四、思考:按要求修改上面的程序 1、如何實
22、現(xiàn)將十進(jìn)制轉(zhuǎn)換任意進(jìn)制?、如何實現(xiàn)將十進(jìn)制轉(zhuǎn)換任意進(jìn)制? 2、為了簡化問題,棧類中沒有考慮棧滿的情況,、為了簡化問題,棧類中沒有考慮棧滿的情況,如何編寫判斷棧滿的成員函數(shù)?如何修改主函數(shù)?如何編寫判斷棧滿的成員函數(shù)?如何修改主函數(shù)?五、上機(jī)作業(yè)(不寫實驗報告)五、上機(jī)作業(yè)(不寫實驗報告)1、實驗名稱:堆棧類的實現(xiàn)、實驗名稱:堆棧類的實現(xiàn)2、實驗?zāi)康模赫莆疹惗x、對象定義、實驗?zāi)康模赫莆疹惗x、對象定義 3、實驗內(nèi)容:、實驗內(nèi)容:定義堆棧類定義堆棧類利用堆棧類實現(xiàn)進(jìn)制轉(zhuǎn)換利用堆棧類實現(xiàn)進(jìn)制轉(zhuǎn)換1、基本概念、基本概念構(gòu)造函數(shù):構(gòu)造函數(shù):與類同名的特殊的成員函數(shù)。與類同名的特殊的成員函數(shù)。構(gòu)造函數(shù)的
23、作用構(gòu)造函數(shù)的作用(構(gòu)造對象構(gòu)造對象)l 當(dāng)定義該類的對象時,構(gòu)造函數(shù)將被自動調(diào)用以當(dāng)定義該類的對象時,構(gòu)造函數(shù)將被自動調(diào)用以實現(xiàn)對該對象的初始化。實現(xiàn)對該對象的初始化。構(gòu)造函數(shù)不能有返回值構(gòu)造函數(shù)不能有返回值因而不能指定包括因而不能指定包括void在內(nèi)的任何返回值類型在內(nèi)的任何返回值類型 構(gòu)造函數(shù)可以重載。構(gòu)造函數(shù)可以重載。l2、構(gòu)造函數(shù)的定義方法、構(gòu)造函數(shù)的定義方法構(gòu)造函數(shù)的定義體可與其它成員函數(shù)成員一樣,構(gòu)造函數(shù)的定義體可與其它成員函數(shù)成員一樣,放在類內(nèi)或類外都可。放在類內(nèi)或類外都可。在在C+中,在定義對象的同時,給該對象初始化中,在定義對象的同時,給該對象初始化的方法就是利用構(gòu)造函數(shù)。
24、的方法就是利用構(gòu)造函數(shù)。構(gòu)造函數(shù)可以重載,因此可編寫多個構(gòu)造函數(shù)實構(gòu)造函數(shù)可以重載,因此可編寫多個構(gòu)造函數(shù)實現(xiàn)不同的初始化?,F(xiàn)不同的初始化。如果類中沒有定義構(gòu)造函數(shù),則系統(tǒng)自動生成缺如果類中沒有定義構(gòu)造函數(shù),則系統(tǒng)自動生成缺省的無參構(gòu)造函數(shù)省的無參構(gòu)造函數(shù)(P159);在定義了構(gòu)造函數(shù)后,系統(tǒng)在定義了構(gòu)造函數(shù)后,系統(tǒng)將不會再生成缺省的構(gòu)造函數(shù)。將不會再生成缺省的構(gòu)造函數(shù)。 程序設(shè)計示例:程序設(shè)計示例:/定義日期類定義日期類#include class Date private : int year, month, day; public : Date(int y, int m, int d)
25、/構(gòu)造函數(shù)沒有返回值構(gòu)造函數(shù)沒有返回值 year=y; month=m; day=d; void print ( ) /輸出日期函數(shù)輸出日期函數(shù) cout year / month / day endl; ;/對應(yīng)的主函數(shù)如下:對應(yīng)的主函數(shù)如下:void main( )Date d1(2004,10,8); /定義對象變量并調(diào)用構(gòu)造函數(shù)初始化定義對象變量并調(diào)用構(gòu)造函數(shù)初始化 d1.print(); /調(diào)用成員函數(shù)顯示日期調(diào)用成員函數(shù)顯示日期問題:問題:此此main函數(shù)中不能象下面再這樣定義對象函數(shù)中不能象下面再這樣定義對象 TDate d2; 有兩種解決辦法:有兩種解決辦法:方法方法1:再定義
26、一個無參的構(gòu)造函數(shù):再定義一個無參的構(gòu)造函數(shù)方法方法2:將構(gòu)造函數(shù)定義成帶默認(rèn)參數(shù)值的函數(shù)。:將構(gòu)造函數(shù)定義成帶默認(rèn)參數(shù)值的函數(shù)。3、解決方法、解決方法方法方法1:再定義無參的構(gòu)造函數(shù):再定義無參的構(gòu)造函數(shù) Date( ) 將原來的構(gòu)造函數(shù)改為帶默認(rèn)值的函數(shù)將原來的構(gòu)造函數(shù)改為帶默認(rèn)值的函數(shù) Date(int y=2000, int m=1, int d=1) year=y; month=m; day=d; 4、思考、思考為什么不能增加一個帶默認(rèn)值的構(gòu)造函數(shù)而是修為什么不能增加一個帶默認(rèn)值的構(gòu)造函數(shù)而是修改為帶默認(rèn)值的函數(shù)。改為帶默認(rèn)值的函數(shù)。(提示:不滿足重載函數(shù)的要求提示:不滿足重載函數(shù)的
27、要求)5、構(gòu)造函數(shù)作類型轉(zhuǎn)換、構(gòu)造函數(shù)作類型轉(zhuǎn)換(補(bǔ)充補(bǔ)充) 一個對象可以作為操作數(shù)用在表達(dá)式中,在對一個對象可以作為操作數(shù)用在表達(dá)式中,在對表達(dá)式求值時,可能需要對操作數(shù)進(jìn)行類型轉(zhuǎn)換,表達(dá)式求值時,可能需要對操作數(shù)進(jìn)行類型轉(zhuǎn)換,這種轉(zhuǎn)換是否合法取決于類中定義的構(gòu)造函數(shù)這種轉(zhuǎn)換是否合法取決于類中定義的構(gòu)造函數(shù) 。#include class Apublic:int x;A(int val)x=val; void show( )coutxendl; ;void main( )A a1=5; a1.show( ); #include class Apublic:int x;A(int val) x
28、=val; cout111111endl;A( ) cout222222endl; A( ) cout999999endl; void show( ) coutxendl; ;void main( )A a1; / 222222a1=5; / 111111 /999999a1.show( ); /5 /999999 例:寫出下面程序的運(yùn)行結(jié)果例:寫出下面程序的運(yùn)行結(jié)果6、類型轉(zhuǎn)換函數(shù)、類型轉(zhuǎn)換函數(shù)(補(bǔ)充補(bǔ)充) 轉(zhuǎn)換函數(shù)又稱類型強(qiáng)制轉(zhuǎn)換函數(shù),它是類中的轉(zhuǎn)換函數(shù)又稱類型強(qiáng)制轉(zhuǎn)換函數(shù),它是類中的一個非靜態(tài)成員函數(shù),它的定義格式如下:一個非靜態(tài)成員函數(shù),它的定義格式如下:class public: o
29、perator ( ) ; 轉(zhuǎn)換函數(shù)定義了由轉(zhuǎn)換函數(shù)定義了由到到的轉(zhuǎn)換。的轉(zhuǎn)換。#include class Aint den,num; public:A(int d,int n) den=d; num=n;operator double( )return (double)den/(double)num; ;void main( )A a1(1,4); double d=1.5;d=d+a1;coutd=dendl; /1.75例:寫出下面程序的運(yùn)行結(jié)果例:寫出下面程序的運(yùn)行結(jié)果1、拷貝、拷貝(復(fù)制復(fù)制)構(gòu)造函數(shù)構(gòu)造函數(shù) 也叫復(fù)制初始化構(gòu)造函數(shù),也叫復(fù)制初始化構(gòu)造函數(shù), 是是C+中引入的一種中
30、引入的一種新的構(gòu)造函數(shù),函數(shù)的名稱與類的名稱相同,并且它新的構(gòu)造函數(shù),函數(shù)的名稱與類的名稱相同,并且它只有一個參數(shù),只有一個參數(shù),該參數(shù)就是對該類對象的引用該參數(shù)就是對該類對象的引用。一、基本知識一、基本知識 2、拷貝構(gòu)造函數(shù)的功能、拷貝構(gòu)造函數(shù)的功能 是用于實現(xiàn)對象值的復(fù)制,通過將一個同類對象是用于實現(xiàn)對象值的復(fù)制,通過將一個同類對象的值復(fù)制給一個新對象,來完成對新對象的初始化,的值復(fù)制給一個新對象,來完成對新對象的初始化,即用一個對象去構(gòu)造另外一個對象。即用一個對象去構(gòu)造另外一個對象。3、復(fù)制構(gòu)造函數(shù)的調(diào)用時機(jī)、復(fù)制構(gòu)造函數(shù)的調(diào)用時機(jī) 聲明并初始化變量時聲明并初始化變量時 對象作為函數(shù)參數(shù)
31、時對象作為函數(shù)參數(shù)時 對象作為函數(shù)值被返回時對象作為函數(shù)值被返回時 4、說明:、說明:如果類中沒有定義復(fù)制構(gòu)造函數(shù),則如果類中沒有定義復(fù)制構(gòu)造函數(shù),則系統(tǒng)自動生成缺省復(fù)制構(gòu)造函數(shù);在定義了構(gòu)造函數(shù)系統(tǒng)自動生成缺省復(fù)制構(gòu)造函數(shù);在定義了構(gòu)造函數(shù)后,系統(tǒng)將不會再生成缺省復(fù)制構(gòu)造函數(shù)。后,系統(tǒng)將不會再生成缺省復(fù)制構(gòu)造函數(shù)。二、對象之間的賦值(補(bǔ)充)二、對象之間的賦值(補(bǔ)充) C+允許在對象之間的進(jìn)行賦值,使用賦值運(yùn)允許在對象之間的進(jìn)行賦值,使用賦值運(yùn)算符算符=可以將一個對象賦給另一個同類的對象。這種可以將一個對象賦給另一個同類的對象。這種賦值是將一個對象中的成員一個一個地拷貝另一個賦值是將一個對象中
32、的成員一個一個地拷貝另一個對象的相同成員中。對象的相同成員中。語句格式:語句格式:對象對象1=對象對象2注意:注意:對象之間的賦值語句不執(zhí)行構(gòu)造函數(shù),因為它對象之間的賦值語句不執(zhí)行構(gòu)造函數(shù),因為它 并沒有創(chuàng)建對象。并沒有創(chuàng)建對象。請看下面的程序:請看下面的程序:#include class TDate private : int year, month, day; public :TDate( ) cout 調(diào)用無參的構(gòu)造函數(shù)調(diào)用無參的構(gòu)造函數(shù)n ; TDate(int y, int m, int d)year=y; month=m; day=d;cout 調(diào)用帶參的構(gòu)造函數(shù)調(diào)用帶參的構(gòu)造函數(shù)
33、n ; void Print () cout year / month / day endl; ;void main( )TDate d1(2004,10,8); /調(diào)用帶參的構(gòu)造函數(shù)調(diào)用帶參的構(gòu)造函數(shù) d1.Print(); TDate d2; /調(diào)用無參的構(gòu)造函數(shù)調(diào)用無參的構(gòu)造函數(shù)d2=d1; /將對象將對象d1賦值給賦值給d2,不調(diào)用構(gòu)造函數(shù),不調(diào)用構(gòu)造函數(shù) d2.Print();/請寫出上面程序的執(zhí)行結(jié)果請寫出上面程序的執(zhí)行結(jié)果三、復(fù)制構(gòu)造函數(shù)的定義三、復(fù)制構(gòu)造函數(shù)的定義(P165)類名(類名(const 類名類名 &形式參數(shù))形式參數(shù)) 函數(shù)體函數(shù)體 例如:例如:TDate(
34、const Tdate &dd) year=dd.year; month=dd.month ; day=dd.day ;cout 調(diào)用復(fù)制初始化構(gòu)造函數(shù)調(diào)用復(fù)制初始化構(gòu)造函數(shù)n ; 如何理解復(fù)制構(gòu)造函數(shù)的參數(shù)一定是一如何理解復(fù)制構(gòu)造函數(shù)的參數(shù)一定是一個該類對象的引用?個該類對象的引用?四、調(diào)用情況四、調(diào)用情況1:聲明對象時:聲明對象時#include class TDate private : int year, month, day; public :TDate( ) cout 調(diào)用無參的構(gòu)造函數(shù)調(diào)用無參的構(gòu)造函數(shù)n ; TDate(int y, int m, int d)year=
35、y; month=m; day=d;cout 調(diào)用帶參的構(gòu)造函數(shù)調(diào)用帶參的構(gòu)造函數(shù)n ; TDate(const TDate &dd)year=dd.year ; month=dd.month ; day=dd.day ;cout 調(diào)用復(fù)制初始化構(gòu)造函數(shù)調(diào)用復(fù)制初始化構(gòu)造函數(shù)n ;void Print () cout year / month / day endl; ;void main()TDate d1(2004,10,8); /調(diào)用帶參的構(gòu)造函數(shù)調(diào)用帶參的構(gòu)造函數(shù) d1.Print(); TDate d2; /調(diào)用無參的構(gòu)造函數(shù)調(diào)用無參的構(gòu)造函數(shù)d2=d1; /將對象將對象d1賦
36、值給賦值給d2,不調(diào)用構(gòu)造函數(shù),不調(diào)用構(gòu)造函數(shù) d2.Print();TDate d3=d1; /調(diào)用復(fù)制初始化構(gòu)造函數(shù)調(diào)用復(fù)制初始化構(gòu)造函數(shù)d3.Print(); 特別注意:特別注意:TDate d3=d1;也可寫成也可寫成TDate d3(d1); 語句語句TDate d2; d2=d1; 和和TDate d3=d1;的區(qū)別的區(qū)別五、調(diào)用情況五、調(diào)用情況2:對象作函數(shù)參數(shù)時:對象作函數(shù)參數(shù)時#include class TDate private : int year, month, day; public :int yy() return year; int mm() return mo
37、nth; int dd() return day; TDate(int y, int m, int d)year=y; month=m; day=d;cout 調(diào)用帶參的構(gòu)造函數(shù)調(diào)用帶參的構(gòu)造函數(shù)n ; TDate(const TDate &dd)cout 調(diào)用復(fù)制初始化構(gòu)造函數(shù)調(diào)用復(fù)制初始化構(gòu)造函數(shù)n ;void print(TDate dd)cout dd.yy()/dd.mm()/ dd.dd() endl;void main()TDate d1(2004,10,8); /調(diào)用帶參的構(gòu)造函數(shù)調(diào)用帶參的構(gòu)造函數(shù) print(d1); /調(diào)用復(fù)制初始化構(gòu)造函數(shù)調(diào)用復(fù)制初始化構(gòu)造函數(shù)思
38、考下面的問題:思考下面的問題:1、 print函數(shù)中使用函數(shù)中使用dd.yy()而不使用而不使用dd.year的原因。的原因。2、如果將如果將print函數(shù)的原型定義為函數(shù)的原型定義為void print(TDate &dd),程序的執(zhí)行結(jié)果?還會調(diào)用復(fù)制初始化構(gòu)造函數(shù)嗎?為什么?程序的執(zhí)行結(jié)果?還會調(diào)用復(fù)制初始化構(gòu)造函數(shù)嗎?為什么?六、調(diào)用情況六、調(diào)用情況3:對象作函數(shù)返回值時:對象作函數(shù)返回值時#include class TDate private : int year, month, day; public :int yy() return year; int mm() ret
39、urn month; int dd() return day; TDate() TDate(int y, int m, int d)year=y; month=m; day=d;cout 調(diào)用帶參的構(gòu)造函數(shù)調(diào)用帶參的構(gòu)造函數(shù)n ; TDate(const TDate &dd)year=dd.year;month=dd.month;day=dd.day ;cout 調(diào)用復(fù)制初始化構(gòu)造函數(shù)調(diào)用復(fù)制初始化構(gòu)造函數(shù)n ;void print( ) cout year/month/ day形參時,自動調(diào)用復(fù)制初始化構(gòu)造函數(shù)形參時,自動調(diào)用復(fù)制初始化構(gòu)造函數(shù)int y,m,d;y=date1.yy
40、(); m=date1.mm();d=date1.dd()+1;TDate date2(y,m,d); /調(diào)用帶參的構(gòu)造函數(shù)來創(chuàng)建新的對象調(diào)用帶參的構(gòu)造函數(shù)來創(chuàng)建新的對象date2return date2; /返回值為對象返回值為對象date2,自動調(diào)用復(fù)制初始化構(gòu)造函數(shù),自動調(diào)用復(fù)制初始化構(gòu)造函數(shù)void main()TDate d1(2004,10,8); /調(diào)用帶參的構(gòu)造函數(shù)調(diào)用帶參的構(gòu)造函數(shù) d1.print();TDate d2;d2=tomorrow(d1);d2.print(); /分析上面程序的執(zhí)行結(jié)果分析上面程序的執(zhí)行結(jié)果如果類中沒有定義復(fù)制構(gòu)造函數(shù),則系統(tǒng)自動生如果類中沒有
41、定義復(fù)制構(gòu)造函數(shù),則系統(tǒng)自動生成缺省復(fù)制構(gòu)造函數(shù);缺省復(fù)制構(gòu)造函數(shù)的復(fù)制策略:成缺省復(fù)制構(gòu)造函數(shù);缺省復(fù)制構(gòu)造函數(shù)的復(fù)制策略:一個成員一個成員的復(fù)制。一個成員一個成員的復(fù)制。參考程序如下:參考程序如下:#include class TDate private : int year, month, day; public :TDate(int y, int m, int d) year=y; month=m; day=d; void print() cout year/month/ dayendl; ;void main()TDate d1(2004,10,8); d1.print();TDat
42、e d2=d1; /調(diào)用缺省復(fù)制構(gòu)造函數(shù)調(diào)用缺省復(fù)制構(gòu)造函數(shù)/將將d1的各個成員復(fù)制給的各個成員復(fù)制給d2d2.print(); /與與d1.print();的結(jié)果一樣的結(jié)果一樣 注意注意:當(dāng)一個類中含有指針成員時,調(diào)用缺省復(fù)當(dāng)一個類中含有指針成員時,調(diào)用缺省復(fù)制構(gòu)造函數(shù)時只復(fù)制指針變量的值制構(gòu)造函數(shù)時只復(fù)制指針變量的值(因此叫因此叫淺拷貝淺拷貝),并未將指針變量所指的對象復(fù)制出來,導(dǎo)致了調(diào)用析并未將指針變量所指的對象復(fù)制出來,導(dǎo)致了調(diào)用析構(gòu)函數(shù)時出現(xiàn)錯誤。構(gòu)函數(shù)時出現(xiàn)錯誤。參考下面的程序:參考下面的程序:#include #include class personprivate:char *
43、name;public:person( char *s) /帶參數(shù)構(gòu)造函數(shù)帶參數(shù)構(gòu)造函數(shù)name=new char20;strcpy(name,s); void print()cout name endl; person()delete name;cout 調(diào)用析構(gòu)函數(shù)調(diào)用析構(gòu)函數(shù)endl; ;void main()person p1=張三張三;person p2=p1; /調(diào)用缺省的復(fù)制初始化函數(shù)調(diào)用缺省的復(fù)制初始化函數(shù)p1.print(); p2.print();程序在執(zhí)行時出現(xiàn)錯誤的原因:程序在執(zhí)行時出現(xiàn)錯誤的原因: 主函數(shù)創(chuàng)建對象主函數(shù)創(chuàng)建對象p2時調(diào)用缺省的復(fù)制初始化函數(shù),時調(diào)用缺省
44、的復(fù)制初始化函數(shù),將對象將對象p1的指針成員的指針成員name賦給賦給p2的成員的成員name,即,即= 并沒有給對象并沒有給對象p2的的name成員申請成員申請空間,空間, 和和指向同一段存貯空間。對指向同一段存貯空間。對象象p1在調(diào)用析構(gòu)函數(shù)時執(zhí)行在調(diào)用析構(gòu)函數(shù)時執(zhí)行delete將將所指空所指空間釋放后,對象間釋放后,對象p2在調(diào)用析構(gòu)函數(shù)時再釋放空間時導(dǎo)在調(diào)用析構(gòu)函數(shù)時再釋放空間時導(dǎo)致運(yùn)行出現(xiàn)錯誤。解決的辦法是使用致運(yùn)行出現(xiàn)錯誤。解決的辦法是使用深拷貝:深拷貝: 在在person類的定義中,可以增加如下的復(fù)制初類的定義
45、中,可以增加如下的復(fù)制初始化函數(shù)始化函數(shù)(深拷貝深拷貝):person(const person &pp)name=new char20; /申請空間申請空間strcpy(name,); / 賦值賦值 main函數(shù)創(chuàng)建對象函數(shù)創(chuàng)建對象p2時調(diào)用上面的復(fù)制初始化時調(diào)用上面的復(fù)制初始化函數(shù),給對象函數(shù),給對象p2的的name成員申請了空間,再將對象成員申請了空間,再將對象p1的指針成員的指針成員name所指內(nèi)容賦給所指內(nèi)容賦給p2的成員的成員name,和和指向不同的存貯空間。這樣就指向不同的存貯空間。這樣就不會出現(xiàn)前面的問題了。不會出現(xiàn)前面的問題了
46、。/寫出下面程序的執(zhí)行結(jié)果寫出下面程序的執(zhí)行結(jié)果/程序程序1:注意三種構(gòu)造函數(shù)的區(qū)別:注意三種構(gòu)造函數(shù)的區(qū)別#include class A private :int x; public :A() x=0; cout無參的構(gòu)造函數(shù)無參的構(gòu)造函數(shù)endl; A(int x1) x=x1; cout帶參的構(gòu)造函數(shù)帶參的構(gòu)造函數(shù)endl; A(const A &p) x=p.x; cout復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)endl; ; void main()A a1, a2(3);A a3(a1), a4=a2;A a5; a5=a1;/程序程序2:#include #include class P
47、ointprivate :int x,y;public :Point() x=0; y=0;Point(int x1,int y1) x=x1; y=y1; Point(const Point &p) x=p.x; y=p.y; int getx() return x; int gety() return y; ; void main()Point p1,p2(3,4),p3(p1),p4=p2;cout p1.getx() setw(10) p1.gety()endl; cout p2.getx() setw(10) p2.gety()endl; cout p3.getx() set
48、w(10) p3.gety()endl; cout p4.getx() setw(10) p4.gety()endl; 八、作業(yè)八、作業(yè) 教材教材(P180 )第第8-1題、第題、第8-2題、第題、第8-5題、第題、第8-8題題九、上機(jī)作業(yè)(不寫實驗報告)九、上機(jī)作業(yè)(不寫實驗報告)1、實驗名稱:構(gòu)造函數(shù)、實驗名稱:構(gòu)造函數(shù)2、實驗?zāi)康模赫莆諛?gòu)造函數(shù)定義與調(diào)用方法、實驗?zāi)康模赫莆諛?gòu)造函數(shù)定義與調(diào)用方法 3、實驗內(nèi)容:、實驗內(nèi)容:定義一個類,類中包含三種構(gòu)造函數(shù)(帶參數(shù)、定義一個類,類中包含三種構(gòu)造函數(shù)(帶參數(shù)、無參數(shù)和復(fù)制構(gòu)造函數(shù)),建立對象并調(diào)用之。無參數(shù)和復(fù)制構(gòu)造函數(shù)),建立對象并調(diào)用之。
49、1、基本概念、基本概念析構(gòu)函數(shù):析構(gòu)函數(shù):與類同名,之前冠以波浪號的特與類同名,之前冠以波浪號的特殊的成員函數(shù)。殊的成員函數(shù)。析構(gòu)函數(shù)的作用析構(gòu)函數(shù)的作用(撤消對象撤消對象):當(dāng)程序結(jié)束或當(dāng)程序結(jié)束或流程執(zhí)行結(jié)束對象的作用域時,析構(gòu)函數(shù)將被自動流程執(zhí)行結(jié)束對象的作用域時,析構(gòu)函數(shù)將被自動調(diào)用以撤消對象,釋放對象占用由構(gòu)造函數(shù)為該對調(diào)用以撤消對象,釋放對象占用由構(gòu)造函數(shù)為該對象分配相應(yīng)的資源。象分配相應(yīng)的資源。析構(gòu)函數(shù)與構(gòu)造函數(shù)一樣不能有返回值析構(gòu)函數(shù)與構(gòu)造函數(shù)一樣不能有返回值析構(gòu)函數(shù)不能重載析構(gòu)函數(shù)不能重載。即:。即:一個類中只能擁有一個類中只能擁有一個析構(gòu)函數(shù)。一個析構(gòu)函數(shù)。 析構(gòu)函數(shù)與構(gòu)造
50、函數(shù)的執(zhí)行順序剛好相反。析構(gòu)函數(shù)與構(gòu)造函數(shù)的執(zhí)行順序剛好相反。/程序程序1:#include class TDate private : int year, month, day; public :TDate() cout調(diào)用構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)endl; TDate() cout調(diào)用析構(gòu)函數(shù)調(diào)用析構(gòu)函數(shù)endl; ;void main()TDate d1; TDate d2; /程序程序2:#include class TDate private : int year, month, day; public :TDate() cout調(diào)用構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)endl; TDate() cou
51、t調(diào)用析構(gòu)函數(shù)調(diào)用析構(gòu)函數(shù)endl; ;void main( )TDate d15; 三、上機(jī)作業(yè):棧的實現(xiàn)三、上機(jī)作業(yè):棧的實現(xiàn)1、問題、問題將將數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)中的順序棧定義成類的形式,通中的順序棧定義成類的形式,通過棧來實現(xiàn)進(jìn)制轉(zhuǎn)換。過棧來實現(xiàn)進(jìn)制轉(zhuǎn)換。2、類的定義、類的定義 數(shù)據(jù)成員:數(shù)據(jù)成員: 存放元素的空間存放元素的空間(例如例如: buffer) 棧頂標(biāo)志(例如棧頂標(biāo)志(例如: top) 成員函數(shù):成員函數(shù): 棧的初始化(構(gòu)造函數(shù))棧的初始化(構(gòu)造函數(shù)) 入棧(例如入棧(例如: push) 出棧(例如出棧(例如: pop) 判斷棧空(例如判斷??眨ɡ? isempty)釋放空間
52、(析構(gòu)函數(shù))釋放空間(析構(gòu)函數(shù))/類的定義類的定義#include class stackprivate:int x10;int top;public:stack( ) /構(gòu)造函數(shù)構(gòu)造函數(shù),初始化堆棧初始化堆棧 top=0; stack( ) /析構(gòu)函數(shù)析構(gòu)函數(shù) void push( int );int pop( );int is_empty( );int stack:is_empty( ) /判斷堆棧是否空,空判斷堆棧是否空,空=1if (top=0) return 1; else return 0; void stack:push(int n) /將將n壓入堆棧壓入堆棧xtop=n;top
53、+; int stack:pop( ) /彈出棧頂元素彈出棧頂元素top-; return xtop; /主函數(shù)主函數(shù)void main( )int n;stack s; /定義時自動調(diào)用構(gòu)造函數(shù)初始化堆棧定義時自動調(diào)用構(gòu)造函數(shù)初始化堆棧coutn; while (n)s.push(n%8); n=n/8; while ( !s.is_empty() )couts.pop(); /輸出棧頂元素輸出棧頂元素coutendl;/程序程序1#include class Pointprivate :int x;public :Point(int x1) x=x1; int getx() return
54、x; ; void main()Point p(99);cout p.getx() endl; / 99/程序程序2#include class Example private:int x;public :Example()x=999;cout Calling constuctor . endl; Example()cout Calling destuctor . endl; void display() cout x endl; ;void main()Example e;/ Calling constuctor . e.display();/ 999/ Calling destuctor
55、./程序程序3#include class Examplepublic:Example()cout constuctor. endl;Example()cout destuctor. endl; ;void main( )Example e2;cout * endl;/程序程序4 4#include class Point private :int x;public :Point() x=0; Point(int x1) x=x1; int getx() return x; ; void main()Point p1,p2(100);cout p1.getx() endl; / 0cout p
56、2.getx() endl; / 100/程序程序5: 執(zhí)行時輸入執(zhí)行時輸入 abcdefghij 十個英文字母十個英文字母#include class Countprivate :int num;public :Count( ) num=0; void process( ) while (getchar()!=n)num+;printf( num=%dn , num) ; ;void main( )Count c1;cess( ); /程序程序6#include class Example private:int x,y;public :Example(int x1=3,int
57、y1=5)x=x1; y=y1; int getx( ) return x; int gety( ) return y; ;void main( ) Example e1,e2(10),e3(8,9);cout e1.getx()t e1.gety() endl ;/3 5cout e2.getx()t e2.gety() endl ;/10 5cout e3.getx()t e3.gety() endl ;/8 9/程序程序7#include class Pointprivate :int x;public :Point(int x1) x=x1; int getx() return x;
58、; void main( )Point p1,p2(100);cout p1.getx() endl; / Not Know cout p2.getx() endl; /程序程序8#include class Example private:int x,y;public :int getx() return x; Example() x=0; y=0;Example(int x1,int y1=3 ) x=x1; y=y1; Example(int x2=4,int y2=5) x=x2; y=y2; ;void main()Example e1,e2(10), e3(50,100);cout
59、 e1: e1.getx() endl ;cout e2: e2.getx() endl ;cout e3: e3.getx() endl ; 構(gòu)造函數(shù)和析構(gòu)函數(shù)是自動調(diào)用的,調(diào)用它們的順構(gòu)造函數(shù)和析構(gòu)函數(shù)是自動調(diào)用的,調(diào)用它們的順序取決于建立和撤銷對象的順序。一般地,調(diào)用構(gòu)造函序取決于建立和撤銷對象的順序。一般地,調(diào)用構(gòu)造函數(shù)的順序和調(diào)用析構(gòu)函數(shù)的順序相反。數(shù)的順序和調(diào)用析構(gòu)函數(shù)的順序相反。但是,對象的生但是,對象的生命期能夠改變調(diào)用析構(gòu)函數(shù)的順序。命期能夠改變調(diào)用析構(gòu)函數(shù)的順序。 對于聲明為具有全局作用域的對象來說,其構(gòu)造函對于聲明為具有全局作用域的對象來說,其構(gòu)造函數(shù)是在數(shù)是在程序設(shè)計開
60、始運(yùn)行的時候程序設(shè)計開始運(yùn)行的時候調(diào)用的,相應(yīng)的析構(gòu)函調(diào)用的,相應(yīng)的析構(gòu)函數(shù)。數(shù)。 對于聲明為自動類型的局部對象,其構(gòu)造函數(shù)是對于聲明為自動類型的局部對象,其構(gòu)造函數(shù)是在在聲明對象的時候聲明對象的時候調(diào)用的,相應(yīng)的析構(gòu)函數(shù)在調(diào)用的,相應(yīng)的析構(gòu)函數(shù)在退出該退出該對象的作用域的時候?qū)ο蟮淖饔糜虻臅r候被調(diào)用。被調(diào)用。 靜態(tài)局部對象的構(gòu)造函數(shù)只在靜態(tài)局部對象的構(gòu)造函數(shù)只在聲明對象的時候聲明對象的時候調(diào)調(diào)用一次,相應(yīng)的析構(gòu)函數(shù)在用一次,相應(yīng)的析構(gòu)函數(shù)在在程序終止的時候被調(diào)用在程序終止的時候被調(diào)用。/ 程序示例程序示例#include class testint x;public:test(int x1)x=x1;coutx 構(gòu)造函數(shù)構(gòu)造函數(shù)endl;test()cou
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微整顧客協(xié)議書
- 住宅裝修設(shè)計協(xié)議
- 文化創(chuàng)意產(chǎn)業(yè)內(nèi)容創(chuàng)新與市場推廣方案
- 商業(yè)房產(chǎn)交易居間合同范本
- 提升客戶滿意度服務(wù)質(zhì)量方案
- 提高客戶服務(wù)質(zhì)量與滿意度的實施方案
- 產(chǎn)品設(shè)計與生產(chǎn)制造委托協(xié)議
- 研發(fā)立項報告
- 農(nóng)業(yè)產(chǎn)業(yè)化項目成本控制作業(yè)指導(dǎo)書
- 中國醫(yī)療器械行業(yè)發(fā)展報告
- 【公開課】同一直線上二力的合成+課件+2024-2025學(xué)年+人教版(2024)初中物理八年級下冊+
- 2023年擬任縣處級領(lǐng)導(dǎo)干部任職資格考試測試題
- 歐盟ELV(汽車)指令課件
- 2023年無錫職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試筆試題庫及答案解析
- sp病種針推新針推頸椎病
- 消防水泵和穩(wěn)壓泵安裝檢驗批質(zhì)量驗收記錄
- 500kV變電站工程構(gòu)支架吊裝專項施工方案
- 2021年上海臨港外服人力資源有限公司招聘筆試試題及答案解析
- 生物安全柜及應(yīng)用課件
- 酒店游泳池系統(tǒng)維保合同
- 現(xiàn)代商業(yè)空間展示設(shè)計ppt
評論
0/150
提交評論