程序設(shè)計(jì)類(lèi)與對(duì)象(1)_第1頁(yè)
程序設(shè)計(jì)類(lèi)與對(duì)象(1)_第2頁(yè)
程序設(shè)計(jì)類(lèi)與對(duì)象(1)_第3頁(yè)
程序設(shè)計(jì)類(lèi)與對(duì)象(1)_第4頁(yè)
程序設(shè)計(jì)類(lèi)與對(duì)象(1)_第5頁(yè)
已閱讀5頁(yè),還剩101頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.C/C+程序設(shè)計(jì)教程2022-3-6.2第第1章章 類(lèi)和對(duì)象類(lèi)和對(duì)象 應(yīng)該重點(diǎn)掌握以下內(nèi)容:應(yīng)該重點(diǎn)掌握以下內(nèi)容:n 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)n 類(lèi)和對(duì)象的定義和使用類(lèi)和對(duì)象的定義和使用n 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)n 拷貝構(gòu)造函數(shù)和堆對(duì)象、對(duì)象數(shù)組拷貝構(gòu)造函數(shù)和堆對(duì)象、對(duì)象數(shù)組n 友元函數(shù)和友元類(lèi)友元函數(shù)和友元類(lèi)2022-3-6.3第第1 1章章 類(lèi)和對(duì)象類(lèi)和對(duì)象n1.1 1.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向?qū)ο蟪绦蛟O(shè)計(jì)概述 n1.2 1.2 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念n1.3 1.3 類(lèi)和對(duì)象的定義類(lèi)和對(duì)象的定義 n1.4 1.

2、4 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù) n1.5 1.5 類(lèi)和對(duì)象的進(jìn)一步應(yīng)用類(lèi)和對(duì)象的進(jìn)一步應(yīng)用 n1.6 1.6 靜態(tài)成員靜態(tài)成員n1.7 1.7 友元函數(shù)和友元類(lèi)友元函數(shù)和友元類(lèi)n1.8 string1.8 string類(lèi)類(lèi)n1.9 1.9 綜合應(yīng)用實(shí)例綜合應(yīng)用實(shí)例2022-3-6.41.1 1.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向?qū)ο蟪绦蛟O(shè)計(jì)概述一、什么是面向?qū)ο蟪绦蛟O(shè)計(jì)一、什么是面向?qū)ο蟪绦蛟O(shè)計(jì) 面向?qū)ο蟪绦蛟O(shè)計(jì)(面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming-Object Oriented Programming-簡(jiǎn)稱(chēng)簡(jiǎn)稱(chēng)OOPOOP)是軟件系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)的新方

3、法,這種新方法即吸取了結(jié)構(gòu)化程序設(shè)計(jì)是軟件系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)的新方法,這種新方法即吸取了結(jié)構(gòu)化程序設(shè)計(jì)的全部?jī)?yōu)點(diǎn),又考慮了現(xiàn)實(shí)世界與面向?qū)ο罂臻g的映射關(guān)系,所追求的的全部?jī)?yōu)點(diǎn),又考慮了現(xiàn)實(shí)世界與面向?qū)ο罂臻g的映射關(guān)系,所追求的目標(biāo)是將現(xiàn)實(shí)世界的問(wèn)題求解盡可能的簡(jiǎn)單化。目標(biāo)是將現(xiàn)實(shí)世界的問(wèn)題求解盡可能的簡(jiǎn)單化。二、面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思路二、面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思路 例如:生產(chǎn)一臺(tái)電腦例如:生產(chǎn)一臺(tái)電腦2022-3-6.51.2 1.2 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念 1.2.1 1.2.1 類(lèi)類(lèi) 1.2.2 1.2.2 對(duì)象對(duì)象1.2.3 1.2.3 封裝(封裝(enca

4、psulationencapsulation)與數(shù)據(jù)隱藏)與數(shù)據(jù)隱藏1.2.4 1.2.4 繼承(繼承(inheritanceinheritance) 1.2.5 1.2.5 多態(tài)性(多態(tài)性(polymorphismpolymorphism) 1.2.6 1.2.6 消息消息2022-3-6.61.2.1 1.2.1 類(lèi)類(lèi) 一、現(xiàn)實(shí)世界與面向?qū)ο笙到y(tǒng)對(duì)應(yīng)關(guān)系一、現(xiàn)實(shí)世界與面向?qū)ο笙到y(tǒng)對(duì)應(yīng)關(guān)系 二、什么是類(lèi)二、什么是類(lèi)1. 1. 類(lèi)是一種復(fù)雜的數(shù)據(jù)類(lèi)型,它將不同類(lèi)型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的類(lèi)是一種復(fù)雜的數(shù)據(jù)類(lèi)型,它將不同類(lèi)型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的操作封裝在一起。類(lèi)是對(duì)現(xiàn)實(shí)世界客觀(guān)事物的抽象。操

5、作封裝在一起。類(lèi)是對(duì)現(xiàn)實(shí)世界客觀(guān)事物的抽象。2. 2. 兩方面的要素:兩方面的要素: 屬性(屬性(atrributeatrribute)-數(shù)據(jù)數(shù)據(jù) 行為行為(behavior)(behavior) - -數(shù)據(jù)的操作數(shù)據(jù)的操作 (函數(shù))(函數(shù))2022-3-6.71.2.2 1.2.2 對(duì)象對(duì)象一、什么是對(duì)象一、什么是對(duì)象 對(duì)象是類(lèi)的一個(gè)實(shí)體,又稱(chēng)為實(shí)例對(duì)象是類(lèi)的一個(gè)實(shí)體,又稱(chēng)為實(shí)例 二、對(duì)象與類(lèi)的關(guān)系二、對(duì)象與類(lèi)的關(guān)系三、對(duì)象與對(duì)象之間消息傳遞三、對(duì)象與對(duì)象之間消息傳遞 對(duì)象對(duì)象1對(duì)象對(duì)象2對(duì)象對(duì)象3對(duì)象對(duì)象4消息消息消息消息人類(lèi)人類(lèi)姓名姓名年齡年齡 身高身高體重體重走路走路學(xué)習(xí)學(xué)習(xí)說(shuō)話(huà)說(shuō)話(huà)開(kāi)

6、車(chē)開(kāi)車(chē)數(shù)據(jù)抽象數(shù)據(jù)抽象小小王王小小李李小小張張人類(lèi)人類(lèi)的對(duì)象的對(duì)象2022-3-6.81.2.3 1.2.3 封裝與數(shù)據(jù)隱藏封裝與數(shù)據(jù)隱藏 一、什么是封裝一、什么是封裝n封裝是指將對(duì)象的數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操封裝是指將對(duì)象的數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作放在一起。作放在一起。n各個(gè)對(duì)象之間相互獨(dú)立,互不干擾。各個(gè)對(duì)象之間相互獨(dú)立,互不干擾。n對(duì)象只留少量的接口,以便與外部聯(lián)系。從外對(duì)象只留少量的接口,以便與外部聯(lián)系。從外部看對(duì)象就像一個(gè)部看對(duì)象就像一個(gè)“黑匣子黑匣子”,數(shù)據(jù)和方法是,數(shù)據(jù)和方法是隱蔽的、看不見(jiàn)的。隱蔽的、看不見(jiàn)的。n當(dāng)用戶(hù)使用對(duì)象時(shí),不必知道對(duì)象的具體實(shí)現(xiàn)當(dāng)用戶(hù)使用對(duì)象時(shí),不必知

7、道對(duì)象的具體實(shí)現(xiàn)細(xì)節(jié),只需要根據(jù)對(duì)象提供的外部接口訪(fǎng)問(wèn)對(duì)細(xì)節(jié),只需要根據(jù)對(duì)象提供的外部接口訪(fǎng)問(wèn)對(duì)象即可。象即可。二、封裝應(yīng)具有以下幾個(gè)特點(diǎn)二、封裝應(yīng)具有以下幾個(gè)特點(diǎn)n具有一個(gè)清楚的邊界,私有成員封裝在內(nèi)部,具有一個(gè)清楚的邊界,私有成員封裝在內(nèi)部,外部不可以訪(fǎng)問(wèn)外部不可以訪(fǎng)問(wèn)n提供必要的接口提供必要的接口n對(duì)象內(nèi)部的數(shù)據(jù)和方法是受封裝外殼保護(hù)的,對(duì)象內(nèi)部的數(shù)據(jù)和方法是受封裝外殼保護(hù)的,其它對(duì)象不能直接使用。其它對(duì)象不能直接使用。主機(jī)主機(jī)主板主板顯卡顯卡聲卡聲卡內(nèi)存內(nèi)存數(shù)據(jù)傳輸線(xiàn)數(shù)據(jù)傳輸線(xiàn)電源線(xiàn)電源線(xiàn)USB接口接口串行接口串行接口電源開(kāi)關(guān)電源開(kāi)關(guān) 內(nèi)內(nèi)部部私私有有成成員員與與外外部部接接口口202

8、2-3-6.91.2.4 1.2.4 繼承繼承 一、繼承概念的提出一、繼承概念的提出例如:已定義電視機(jī)類(lèi),現(xiàn)需要定義彩色電視機(jī)類(lèi)例如:已定義電視機(jī)類(lèi),現(xiàn)需要定義彩色電視機(jī)類(lèi)解決方法:解決方法: 1. 1.重新設(shè)計(jì)重新設(shè)計(jì) 2. 2.繼承:繼承原來(lái)電視機(jī)的屬性和方法,再添加彩色電視機(jī)自己特繼承:繼承原來(lái)電視機(jī)的屬性和方法,再添加彩色電視機(jī)自己特有的新的屬性和行為有的新的屬性和行為 二、繼承的概念二、繼承的概念 C+ C+提供的繼承機(jī)制提供了類(lèi)之間相互關(guān)系的解決方案,使某個(gè)類(lèi)可提供的繼承機(jī)制提供了類(lèi)之間相互關(guān)系的解決方案,使某個(gè)類(lèi)可以繼承另外一個(gè)類(lèi)的特征和能力。以繼承另外一個(gè)類(lèi)的特征和能力。 使用

9、繼承符合人們對(duì)事物的認(rèn)識(shí)和敘述,大大簡(jiǎn)化了對(duì)問(wèn)題的描述,使用繼承符合人們對(duì)事物的認(rèn)識(shí)和敘述,大大簡(jiǎn)化了對(duì)問(wèn)題的描述,提高了程序的可重用性,從而提高了程序設(shè)計(jì)、修改、擴(kuò)充的效率,實(shí)提高了程序的可重用性,從而提高了程序設(shè)計(jì)、修改、擴(kuò)充的效率,實(shí)現(xiàn)現(xiàn)軟件重用軟件重用(software reusabilitysoftware reusability)。)。2022-3-6.101.2.5 多態(tài)性(多態(tài)性(polymorphism) 一、多態(tài)性的概念一、多態(tài)性的概念 多態(tài)性:多態(tài)性:描述的是同一個(gè)消息可以根據(jù)發(fā)送消息對(duì)象的不同采用不同的描述的是同一個(gè)消息可以根據(jù)發(fā)送消息對(duì)象的不同采用不同的行為方式。行為

10、方式。 例如:例如: 學(xué)校的上課鈴響,不同班級(jí)的學(xué)生進(jìn)入不同的教室學(xué)習(xí),不同的老學(xué)校的上課鈴響,不同班級(jí)的學(xué)生進(jìn)入不同的教室學(xué)習(xí),不同的老師進(jìn)入不同教室開(kāi)始講課,不同的對(duì)象會(huì)作出不同的響應(yīng)??梢钥吹綄W(xué)師進(jìn)入不同教室開(kāi)始講課,不同的對(duì)象會(huì)作出不同的響應(yīng)??梢钥吹綄W(xué)生和教師在接受到同一消息(上課鈴聲)時(shí),執(zhí)行不同的操作,這就是生和教師在接受到同一消息(上課鈴聲)時(shí),執(zhí)行不同的操作,這就是多態(tài)的表現(xiàn)。多態(tài)的表現(xiàn)。二、二、C+C+支持多態(tài)支持多態(tài) 靜態(tài)多態(tài)性靜態(tài)多態(tài)性 動(dòng)態(tài)多態(tài)性動(dòng)態(tài)多態(tài)性 2022-3-6.111.2.6 1.2.6 消息消息 面向?qū)ο蠹夹g(shù)的封裝使得對(duì)象相互獨(dú)立,各個(gè)對(duì)象要相互協(xié)作面

11、向?qū)ο蠹夹g(shù)的封裝使得對(duì)象相互獨(dú)立,各個(gè)對(duì)象要相互協(xié)作實(shí)現(xiàn)系統(tǒng)的功能則需要對(duì)象之間的消息傳遞機(jī)制。消息是一個(gè)對(duì)象實(shí)現(xiàn)系統(tǒng)的功能則需要對(duì)象之間的消息傳遞機(jī)制。消息是一個(gè)對(duì)象向另一個(gè)對(duì)象發(fā)出的服務(wù)請(qǐng)求,進(jìn)行對(duì)象之間的通信。也可以說(shuō)是向另一個(gè)對(duì)象發(fā)出的服務(wù)請(qǐng)求,進(jìn)行對(duì)象之間的通信。也可以說(shuō)是一 個(gè) 對(duì) 象 調(diào) 用 另 一 個(gè) 對(duì) 象 的 方 法 (一 個(gè) 對(duì) 象 調(diào) 用 另 一 個(gè) 對(duì) 象 的 方 法 ( M e t h o dM e t h o d ) 或 稱(chēng) 為 函 數(shù)) 或 稱(chēng) 為 函 數(shù)(FunctionFunction)。)。2022-3-6.12面向過(guò)程與面向?qū)ο蟪绦蛟O(shè)計(jì)方法的比較一、面向

12、過(guò)程程序設(shè)計(jì)方法一、面向過(guò)程程序設(shè)計(jì)方法 程序程序 = = 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)+ +算法算法二、面向?qū)ο蟪绦蛟O(shè)計(jì)方法的規(guī)律是:二、面向?qū)ο蟪绦蛟O(shè)計(jì)方法的規(guī)律是: 對(duì)象對(duì)象 = = (數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)結(jié)構(gòu)+ + 算法)算法) 程序程序 = = 對(duì)象對(duì)象 + + 對(duì)象對(duì)象 + + 對(duì)象對(duì)象 + + + + 對(duì)象對(duì)象2022-3-6.131.3 類(lèi)和對(duì)象的定義類(lèi)和對(duì)象的定義 一、類(lèi)定義組成一、類(lèi)定義組成 數(shù)據(jù)成員:數(shù)據(jù)成員:說(shuō)明類(lèi)的屬性說(shuō)明類(lèi)的屬性 成員函數(shù)(又稱(chēng)函數(shù)成員):成員函數(shù)(又稱(chēng)函數(shù)成員):對(duì)類(lèi)數(shù)據(jù)成員操作的類(lèi)內(nèi)函數(shù),又稱(chēng)為對(duì)類(lèi)數(shù)據(jù)成員操作的類(lèi)內(nèi)函數(shù),又稱(chēng)為方法。方法。二、類(lèi)定義的一般格式為二

13、、類(lèi)定義的一般格式為 class class 類(lèi)名類(lèi)名 public : public : 數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn)數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn) protected:protected: 數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn)數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn) private:private: 數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn)數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn) ;2022-3-6.141.3.1 類(lèi)的定義類(lèi)的定義說(shuō)明:說(shuō)明:(1 1)定義一個(gè)類(lèi)時(shí),使用關(guān)鍵字)定義一個(gè)類(lèi)時(shí),使用關(guān)鍵字classclass;類(lèi)名必須是一個(gè)合法的變;類(lèi)名必須是一個(gè)合法的變量名,量名,C+C+中習(xí)慣用中習(xí)慣用C C或或T T開(kāi)頭,例如開(kāi)頭,例如CStudentCStuden

14、t;(2 2)一個(gè)類(lèi)包括類(lèi)頭和類(lèi)體兩部分。)一個(gè)類(lèi)包括類(lèi)頭和類(lèi)體兩部分。class class ,稱(chēng)為類(lèi)頭(,稱(chēng)為類(lèi)頭(class headclass head););(3 3)大括號(hào)中定義的是類(lèi)的數(shù)據(jù)成員和成員函數(shù),稱(chēng)為類(lèi)體()大括號(hào)中定義的是類(lèi)的數(shù)據(jù)成員和成員函數(shù),稱(chēng)為類(lèi)體(class bodyclass body)。類(lèi)定義結(jié)束要用)。類(lèi)定義結(jié)束要用“;”結(jié)束;結(jié)束;(4 4)關(guān)鍵字)關(guān)鍵字publicpublic(公有)、(公有)、 protectedprotected(保護(hù))(保護(hù)) 和和privateprivate(私(私有)稱(chēng)為成員訪(fǎng)問(wèn)限定符(有)稱(chēng)為成員訪(fǎng)問(wèn)限定符(mumber

15、access specifiermumber access specifier)。用訪(fǎng))。用訪(fǎng)問(wèn)限定符聲明了各個(gè)數(shù)據(jù)成員和成員函數(shù)的訪(fǎng)問(wèn)權(quán)限。問(wèn)限定符聲明了各個(gè)數(shù)據(jù)成員和成員函數(shù)的訪(fǎng)問(wèn)權(quán)限。2022-3-6.151.3.1 類(lèi)的定義類(lèi)的定義三、訪(fǎng)問(wèn)限定符三、訪(fǎng)問(wèn)限定符 n公有(公有(publicpublic):):提供了與外界的接口功能。公有成員可以被本類(lèi)中的提供了與外界的接口功能。公有成員可以被本類(lèi)中的成員使用和訪(fǎng)問(wèn),還可以被類(lèi)作用域內(nèi)的其他外在其他函數(shù)使用。成員使用和訪(fǎng)問(wèn),還可以被類(lèi)作用域內(nèi)的其他外在其他函數(shù)使用。n私有(私有(privateprivate):):封裝在類(lèi)內(nèi)部的,只能被該類(lèi)

16、的成員和該類(lèi)友元函數(shù)封裝在類(lèi)內(nèi)部的,只能被該類(lèi)的成員和該類(lèi)友元函數(shù)或友元類(lèi)訪(fǎng)問(wèn),任何類(lèi)以外的函數(shù)對(duì)私有成員的訪(fǎng)問(wèn)都是非法的?;蛴言?lèi)訪(fǎng)問(wèn),任何類(lèi)以外的函數(shù)對(duì)私有成員的訪(fǎng)問(wèn)都是非法的。n保護(hù)(保護(hù)(protectedprotected:訪(fǎng)問(wèn)權(quán)限介于私有和公有中間,類(lèi)的成員可以訪(fǎng)問(wèn),:訪(fǎng)問(wèn)權(quán)限介于私有和公有中間,類(lèi)的成員可以訪(fǎng)問(wèn),類(lèi)以外的其他函數(shù)不能訪(fǎng)問(wèn)保護(hù)成員。類(lèi)以外的其他函數(shù)不能訪(fǎng)問(wèn)保護(hù)成員。 不同訪(fǎng)問(wèn)權(quán)限關(guān)系圖不同訪(fǎng)問(wèn)權(quán)限關(guān)系圖 類(lèi)類(lèi)Aclass外部外部私有成員私有成員private保護(hù)成員保護(hù)成員protected公有成員公有成員public繼承類(lèi)繼承類(lèi)友元友元class外部外部2022-

17、3-6.161.3.1 類(lèi)的定義類(lèi)的定義例:定義一個(gè)日期類(lèi)例:定義一個(gè)日期類(lèi)CdateCdateCdate-year : int-month :int-day : int+Setdate (y : int, m : int, d : int) : void+Isleapyear() : int+Print() : void 2022-3-6.17#include class Cdate /使用關(guān)鍵字使用關(guān)鍵字class聲明一個(gè)類(lèi),類(lèi)名為聲明一個(gè)類(lèi),類(lèi)名為Cdate public: /以下是公有成員函數(shù)以下是公有成員函數(shù) void Setdate (int y, int m,int d)/設(shè)置日

18、期設(shè)置日期 year=y; month=m; day=d;/以上以上3行是函數(shù)的實(shí)現(xiàn)行是函數(shù)的實(shí)現(xiàn)int Isleapyear()/判斷日期是不是閏年判斷日期是不是閏年 return (year%4=0&year%100!=0)|(year%400=0); void Print() /定義一個(gè)公有成員函數(shù)定義一個(gè)公有成員函數(shù)Print()輸出日期輸出日期 coutyear- month -dayendl;private:/以下是私有成員以下是私有成員 int year,month ,day;/定義定義3個(gè)整型變量,分別表示日期的年月日個(gè)整型變量,分別表示日期的年月日;2022-3-6.

19、181.3.2 成員函數(shù)的定義成員函數(shù)的定義n類(lèi)的成員函數(shù)也是函數(shù)的一種,它的與以前介紹的普通函數(shù)用類(lèi)的成員函數(shù)也是函數(shù)的一種,它的與以前介紹的普通函數(shù)用法基本一樣。法基本一樣。n成員函數(shù)由函數(shù)頭和函數(shù)體組成,函數(shù)頭包括函數(shù)名、函數(shù)的成員函數(shù)由函數(shù)頭和函數(shù)體組成,函數(shù)頭包括函數(shù)名、函數(shù)的參數(shù)及函數(shù)的類(lèi)型。函數(shù)體主要參數(shù)及函數(shù)的類(lèi)型。函數(shù)體主要說(shuō)明說(shuō)明函數(shù)實(shí)現(xiàn)的功能。函數(shù)實(shí)現(xiàn)的功能。n成員函數(shù)與一般函數(shù)的區(qū)別在于:成員函數(shù)與一般函數(shù)的區(qū)別在于:它屬于類(lèi)的成員,出現(xiàn)在類(lèi)它屬于類(lèi)的成員,出現(xiàn)在類(lèi)體中,是類(lèi)的一部分。使用類(lèi)的成員函數(shù)時(shí),要考慮類(lèi)成員函體中,是類(lèi)的一部分。使用類(lèi)的成員函數(shù)時(shí),要考慮類(lèi)成員

20、函數(shù)的訪(fǎng)問(wèn)權(quán)限。數(shù)的訪(fǎng)問(wèn)權(quán)限。n類(lèi)的成員函數(shù)可以在類(lèi)體中定義,也可以在類(lèi)體中聲明類(lèi)成員類(lèi)的成員函數(shù)可以在類(lèi)體中定義,也可以在類(lèi)體中聲明類(lèi)成員函數(shù),成員函數(shù)的實(shí)現(xiàn)在類(lèi)外定義。函數(shù),成員函數(shù)的實(shí)現(xiàn)在類(lèi)外定義。.2022-3-6191 在類(lèi)內(nèi)定義成員函數(shù)在類(lèi)內(nèi)定義成員函數(shù)#include class Cdate public: void Setdate (int y, int m,int d) /在類(lèi)內(nèi)定義成員函數(shù)在類(lèi)內(nèi)定義成員函數(shù) year=y; month=m; day=d; int Isleapyear()return (year%4=0&year%100!=0)|(year%400=

21、0); void Print()coutyear- month -dayendl;private: int year,month ,day; date1,date2,date3; ;說(shuō)明:說(shuō)明:在類(lèi)內(nèi)定義的成員函數(shù)默認(rèn)的是內(nèi)聯(lián)函數(shù)(在類(lèi)內(nèi)定義的成員函數(shù)默認(rèn)的是內(nèi)聯(lián)函數(shù)(inlineinline函數(shù))。一般把規(guī)模比較小的成員函數(shù)函數(shù))。一般把規(guī)模比較小的成員函數(shù)在類(lèi)內(nèi)定義。在類(lèi)內(nèi)定義。.2022-3-6202 在類(lèi)外定義成員函數(shù)在類(lèi)外定義成員函數(shù) 通常情況下通常情況下 C+C+程序員習(xí)慣在類(lèi)體中只定義數(shù)據(jù)成程序員習(xí)慣在類(lèi)體中只定義數(shù)據(jù)成員以及成員函數(shù)的聲明,而將成員函數(shù)的實(shí)現(xiàn)寫(xiě)在類(lèi)外。因員以及成

22、員函數(shù)的聲明,而將成員函數(shù)的實(shí)現(xiàn)寫(xiě)在類(lèi)外。因此類(lèi)的定義由兩部分組成:此類(lèi)的定義由兩部分組成:n聲明部分聲明部分 聲明類(lèi)的數(shù)據(jù)成員類(lèi)型和成員函數(shù)的參數(shù)類(lèi)型、個(gè)數(shù)以聲明類(lèi)的數(shù)據(jù)成員類(lèi)型和成員函數(shù)的參數(shù)類(lèi)型、個(gè)數(shù)以及返回值類(lèi)型。及返回值類(lèi)型。n實(shí)現(xiàn)部分實(shí)現(xiàn)部分 對(duì)說(shuō)明類(lèi)成員函數(shù)的具體實(shí)現(xiàn)對(duì)說(shuō)明類(lèi)成員函數(shù)的具體實(shí)現(xiàn).2022-3-6212 在類(lèi)外定義成員函數(shù)在類(lèi)外定義成員函數(shù)一、定義的格式一、定義的格式 /類(lèi)聲明部分類(lèi)聲明部分class class 類(lèi)名類(lèi)名 public: private: Protected:public: private: Protected: 數(shù)據(jù)成員類(lèi)型數(shù)據(jù)成員類(lèi)型 數(shù)據(jù)成員

23、名;數(shù)據(jù)成員名; 數(shù)據(jù)成員類(lèi)型數(shù)據(jù)成員類(lèi)型 數(shù)據(jù)成員名;數(shù)據(jù)成員名; 函數(shù)類(lèi)型函數(shù)類(lèi)型 成員函數(shù)名(參數(shù)表)成員函數(shù)名(參數(shù)表); ; 函數(shù)類(lèi)型函數(shù)類(lèi)型 成員函數(shù)名(參數(shù)表)成員函數(shù)名(參數(shù)表); ; ;/類(lèi)實(shí)現(xiàn)部分類(lèi)實(shí)現(xiàn)部分函數(shù)類(lèi)型函數(shù)類(lèi)型 類(lèi)名類(lèi)名 :成員函數(shù)名(參數(shù)表):成員函數(shù)名(參數(shù)表) / /實(shí)現(xiàn)實(shí)現(xiàn) .2022-3-6222 在類(lèi)外定義成員函數(shù)在類(lèi)外定義成員函數(shù)說(shuō)明:說(shuō)明:(1 1)在類(lèi)聲明部分,包括)在類(lèi)聲明部分,包括數(shù)據(jù)成員的定義和成員函數(shù)的聲明數(shù)據(jù)成員的定義和成員函數(shù)的聲明。(2 2)成員函數(shù)的聲明主要說(shuō)明函數(shù)的類(lèi)型,函數(shù)的參數(shù)個(gè)數(shù))成員函數(shù)的聲明主要說(shuō)明函數(shù)的類(lèi)型,函數(shù)的

24、參數(shù)個(gè)數(shù)及類(lèi)型,并用及類(lèi)型,并用“;”結(jié)束。結(jié)束。(3 3)函數(shù)實(shí)現(xiàn)部分是對(duì)在類(lèi)中定義的成員函數(shù)完成功能的實(shí))函數(shù)實(shí)現(xiàn)部分是對(duì)在類(lèi)中定義的成員函數(shù)完成功能的實(shí)現(xiàn),包括函數(shù)頭和函數(shù)體。在類(lèi)體中直接定義函數(shù)時(shí),不需要現(xiàn),包括函數(shù)頭和函數(shù)體。在類(lèi)體中直接定義函數(shù)時(shí),不需要在函數(shù)名前面加上類(lèi)名,因?yàn)楹瘮?shù)屬于哪一個(gè)類(lèi)是不言而喻的。在函數(shù)名前面加上類(lèi)名,因?yàn)楹瘮?shù)屬于哪一個(gè)類(lèi)是不言而喻的。但成員函數(shù)在類(lèi)外定義時(shí),必須在函數(shù)名前面加上類(lèi)名,給與但成員函數(shù)在類(lèi)外定義時(shí),必須在函數(shù)名前面加上類(lèi)名,給與限定限定(qualifed)(qualifed),“”是是作用域限定符作用域限定符(field qualifier

25、)(field qualifier)或稱(chēng)作用域運(yùn)算符,用它聲明函數(shù)是屬于哪個(gè)類(lèi)的。如果在作或稱(chēng)作用域運(yùn)算符,用它聲明函數(shù)是屬于哪個(gè)類(lèi)的。如果在作用域運(yùn)算符用域運(yùn)算符“”的前面沒(méi)有類(lèi)名,或者函數(shù)名前面既無(wú)類(lèi)名的前面沒(méi)有類(lèi)名,或者函數(shù)名前面既無(wú)類(lèi)名又無(wú)作用域運(yùn)算符又無(wú)作用域運(yùn)算符“”,則表示,則表示displaydisplay函數(shù)不屬于任何類(lèi),函數(shù)不屬于任何類(lèi),該函數(shù)不是成員函數(shù),而是全局函數(shù),即非成員函數(shù)的一般普該函數(shù)不是成員函數(shù),而是全局函數(shù),即非成員函數(shù)的一般普通函數(shù)。通函數(shù)。.2022-3-6232 在類(lèi)外定義成員函數(shù)在類(lèi)外定義成員函數(shù)例:例:CdateCdate類(lèi)定義類(lèi)定義/ Cdate

26、類(lèi)聲明部分類(lèi)聲明部分class Cdate public: /函數(shù)聲明函數(shù)聲明 void Setdate (int y, int m,int d); /或或void Setdate (int, int,int); int Isleapyear(); void Print();private: int year,month ,day;date1,date2,date3; / Cdate類(lèi)成員函數(shù)的實(shí)現(xiàn)類(lèi)成員函數(shù)的實(shí)現(xiàn)void Cdate: Setdate (int y, int m,int d) year=y; month=m; day=d; int Cdate:Isleapyear() ret

27、urn (year%4=0&year%100!=0)|(year%400=0);void Cdate:Print() coutyear- month -dayendl;2022-3-6.241.3.3 類(lèi)對(duì)象的定義類(lèi)對(duì)象的定義 1 1先聲明類(lèi)類(lèi)型,然后定義類(lèi)對(duì)象先聲明類(lèi)類(lèi)型,然后定義類(lèi)對(duì)象class class 類(lèi)名類(lèi)名 數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn)數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn); class class 類(lèi)名類(lèi)名 對(duì)象列表對(duì)象列表說(shuō)明:說(shuō)明:(1 1)class class 可選,可以寫(xiě),也可以省略可選,可以寫(xiě),也可以省略(2 2)類(lèi)名是定義好的類(lèi)。)類(lèi)名是定義好的類(lèi)。(3 3)對(duì)象列表的格式為:

28、對(duì)象名)對(duì)象列表的格式為:對(duì)象名 ,對(duì)象名,對(duì)象名,對(duì)象名,對(duì)象名 。定義多個(gè)對(duì)象。定義多個(gè)對(duì)象時(shí),各對(duì)象名中間用逗號(hào)隔開(kāi)。時(shí),各對(duì)象名中間用逗號(hào)隔開(kāi)。如:如: class Cdate date1,date2,date3; /Cdateclass Cdate date1,date2,date3; /Cdate是已經(jīng)聲明的類(lèi)類(lèi)型是已經(jīng)聲明的類(lèi)類(lèi)型 Cdate date1,date2,date3; /Cdate date1,date2,date3; /建議使用的方法。建議使用的方法。2022-3-6.252 2在聲明類(lèi)類(lèi)型的同時(shí)定義對(duì)象在聲明類(lèi)類(lèi)型的同時(shí)定義對(duì)象class class 類(lèi)名類(lèi)名 數(shù)

29、據(jù)成員和成員函數(shù)實(shí)現(xiàn)數(shù)據(jù)成員和成員函數(shù)實(shí)現(xiàn) 對(duì)象列表對(duì)象列表;例:例:#include class Cdate /使用關(guān)鍵字使用關(guān)鍵字class聲明一個(gè)類(lèi),類(lèi)名為聲明一個(gè)類(lèi),類(lèi)名為Cdate public: /以下是公有成員函數(shù)以下是公有成員函數(shù) void Setdate (int y, int m,int d)/設(shè)置日期設(shè)置日期 year=y; month=m; day=d; /以上以上3行是函數(shù)的實(shí)現(xiàn)行是函數(shù)的實(shí)現(xiàn) int Isleapyear()/判斷日期是不是閏年判斷日期是不是閏年 return (year%4=0&year%100!=0)|(year%400=0); void

30、 Print() /定義一個(gè)公有成員函數(shù)定義一個(gè)公有成員函數(shù)Print()輸出日期輸出日期 coutyear- month -day - 數(shù)據(jù)成員名數(shù)據(jù)成員名 / / “-”是指向運(yùn)算符是指向運(yùn)算符 對(duì)象指針名對(duì)象指針名 - - 成員函數(shù)名成員函數(shù)名 例如:例如: Cdate d,Cdate d,* *p; /p; /定義對(duì)象定義對(duì)象d d和對(duì)象指針變量和對(duì)象指針變量p p p=&d; / p=&d; /初始化對(duì)象指針初始化對(duì)象指針p p p- Print();/ p- Print();/通過(guò)指向?qū)ο蟮闹羔樅椭赶蜻\(yùn)算符訪(fǎng)問(wèn)對(duì)象中的成員通過(guò)指向?qū)ο蟮闹羔樅椭赶蜻\(yùn)算符訪(fǎng)問(wèn)對(duì)象中的成

31、員.2022-3-6281.3.4 對(duì)象成員的訪(fǎng)問(wèn)對(duì)象成員的訪(fǎng)問(wèn)(3 3)通過(guò)對(duì)象的引用變量訪(fǎng)問(wèn)對(duì)象中的成員)通過(guò)對(duì)象的引用變量訪(fǎng)問(wèn)對(duì)象中的成員 如果為一個(gè)對(duì)象定義了一個(gè)引用變量,它們是共占同一如果為一個(gè)對(duì)象定義了一個(gè)引用變量,它們是共占同一段存儲(chǔ)單元的,實(shí)際上它們是同一個(gè)對(duì)象,只是用不同的名字表段存儲(chǔ)單元的,實(shí)際上它們是同一個(gè)對(duì)象,只是用不同的名字表示而已。因此完全可以通過(guò)引用變量來(lái)訪(fǎng)問(wèn)該對(duì)象中的成員。通示而已。因此完全可以通過(guò)引用變量來(lái)訪(fǎng)問(wèn)該對(duì)象中的成員。通過(guò)對(duì)象的引用變量訪(fǎng)問(wèn)該對(duì)象中的成員的格式與通過(guò)對(duì)象名訪(fǎng)問(wèn)過(guò)對(duì)象的引用變量訪(fǎng)問(wèn)該對(duì)象中的成員的格式與通過(guò)對(duì)象名訪(fǎng)問(wèn)對(duì)象中的成員的形式一樣

32、。對(duì)象中的成員的形式一樣。 例如:例如: Cdate d1; /Cdate d1; /定義對(duì)象定義對(duì)象d1d1 Cdate & d2=d1; / Cdate & d2=d1; /定義引用變量定義引用變量d2d2,并初始化之為,并初始化之為d1d1 d2. Print(); / d2. Print(); /引用變量訪(fǎng)問(wèn)對(duì)象中的成員,輸出日期引用變量訪(fǎng)問(wèn)對(duì)象中的成員,輸出日期.2022-3-629/ Cdate.h 在頭文件中聲明日期類(lèi)在頭文件中聲明日期類(lèi)class Cdate public: void Setdate (int y, int m,int d); int Islea

33、pyear(); void Print();private: int year,month ,day; /Cdate.cpp 在與類(lèi)定義頭文件同名的在與類(lèi)定義頭文件同名的cpp文件中定義成員函文件中定義成員函數(shù)實(shí)現(xiàn)部分?jǐn)?shù)實(shí)現(xiàn)部分#include #include Cdate.h /包含類(lèi)定義的頭文件,否則出錯(cuò)包含類(lèi)定義的頭文件,否則出錯(cuò)void Cdate: Setdate (int y, int m,int d) year=y; month=m; day=d; int Cdate:Isleapyear() return (year%4=0&year%100!=0)|(year%400

34、=0);void Cdate:Print() coutyear- month -day Setdate(2000,4,2); /通過(guò)指針訪(fǎng)問(wèn)成員通過(guò)指針訪(fǎng)問(wèn)成員 d4. Setdate(2006,12,1); /通過(guò)引用訪(fǎng)問(wèn)成員通過(guò)引用訪(fǎng)問(wèn)成員 d1.Print(); p- Print(); d4.Print();【例例1.11.1】一個(gè)完整的一個(gè)完整的CdateCdate類(lèi)的應(yīng)用程序。類(lèi)的應(yīng)用程序。程序運(yùn)行結(jié)果:程序運(yùn)行結(jié)果:1999-12-302000-4-22006-12-1.2022-3-630d1.Setdate(1999,12,30) &d2yearmonth dayyea

35、r = 1999month =12day = 13yearmonth dayd1d2d4d3pp- Setdate(2000,4,2)yearmonth dayyear = 2000month =4day = 2year = 2006month =12day = 1d4.Setdate(2006,12,1). Setdate(2006,12,1);d1.Print()d4.Print()p- Print()屏幕輸出結(jié)果:1999-12-302000-4-22006-12-1定義變量并為定義變量并為變量分配空間變量分配空間調(diào)用類(lèi)成員函數(shù)調(diào)用類(lèi)成員函數(shù)Setdate()初始()初始化類(lèi)的數(shù)據(jù)成員化

36、類(lèi)的數(shù)據(jù)成員調(diào)用類(lèi)成員函數(shù)調(diào)用類(lèi)成員函數(shù)Print()輸出()輸出日期日期 例例1.11.1程序執(zhí)行過(guò)程程序執(zhí)行過(guò)程 .2022-3-631【例例1.21.2】封裝一個(gè)學(xué)生類(lèi),學(xué)生的信息包括學(xué)生的姓名、學(xué)號(hào)、性別、年齡和封裝一個(gè)學(xué)生類(lèi),學(xué)生的信息包括學(xué)生的姓名、學(xué)號(hào)、性別、年齡和3 3門(mén)的成績(jī)??梢栽O(shè)置學(xué)生的各類(lèi)信息,統(tǒng)計(jì)該學(xué)生的平均成績(jī)并輸出學(xué)生信息。門(mén)的成績(jī)??梢栽O(shè)置學(xué)生的各類(lèi)信息,統(tǒng)計(jì)該學(xué)生的平均成績(jī)并輸出學(xué)生信息。 CStudent-name20 : char-id : int -sex : char-age : int-grad3 : float+setinfo(na : char

37、*,i : int ,s : char, a : int) : void+void setgrad(a : float , b : float , c : float) : void+avg() : float+display() : voidCstudentCstudent的類(lèi)圖的類(lèi)圖 .2022-3-632/CStudent.h 這是頭文件,在此文件中進(jìn)行類(lèi)的這是頭文件,在此文件中進(jìn)行類(lèi)的聲明聲明class CStudent /類(lèi)聲明類(lèi)聲明 public:void setinfo(char *,int ,char,int);void setgrad(float , float , floa

38、t);float avg();void display(); private:char name20;int id ;char sex;int age;float grad3; ;/CStudent.cpp在此文件中進(jìn)行函數(shù)的定義在此文件中進(jìn)行函數(shù)的定義#include #include #include CStudent.h/漏寫(xiě)此行編譯通不過(guò)漏寫(xiě)此行編譯通不過(guò)void CStudent:setinfo(char *na,int i ,char s ,int a) strcpy(name,na);id=i;sex=s;age=a;void CStudent:setgrad(float a,

39、float b, float c)grad0=a;grad1=b;grad2=c;float CStudent:avg()return (grad0+ grad1 +grad2)/3;void CStudent:display( ) coutid:idendl; coutname:nameendl; coutsex:sexendl; coutage:ageendl; /main.cpp 主函數(shù)模塊主函數(shù)模塊#include #include CStudent.h/將類(lèi)聲明頭文件包含進(jìn)來(lái)將類(lèi)聲明頭文件包含進(jìn)來(lái)int main( )CStudent stud1;/定義對(duì)象定義對(duì)象stud1. se

40、tinfo(張三張三,2006102,m,18);stud1.setgrad(79,98,87);stud1.display();cout 平均成績(jī):平均成績(jī):stud1.avg();return 0;運(yùn)行結(jié)果:運(yùn)行結(jié)果:id:name:張三:張三sex:mage:18平均成績(jī):平均成績(jī):882022-3-6.331.3.5 類(lèi)對(duì)象的內(nèi)存分配類(lèi)對(duì)象的內(nèi)存分配 C+ C+中用同一內(nèi)存空間來(lái)存放這個(gè)同種類(lèi)對(duì)象的成員函中用同一內(nèi)存空間來(lái)存放這個(gè)同種類(lèi)對(duì)象的成員函數(shù)代碼,當(dāng)去調(diào)用某個(gè)對(duì)象的成員函數(shù)時(shí),都去調(diào)用這個(gè)公用數(shù)代碼,當(dāng)去調(diào)用某個(gè)對(duì)象的成員函數(shù)時(shí),都去調(diào)用這個(gè)公用的函數(shù)代碼。的函數(shù)代碼。C+C+

41、中用中用thisthis指針指針來(lái)區(qū)分是哪個(gè)對(duì)象的成員函數(shù)。來(lái)區(qū)分是哪個(gè)對(duì)象的成員函數(shù)。 數(shù)據(jù)成員數(shù)據(jù)成員對(duì)象對(duì)象1數(shù)據(jù)成員數(shù)據(jù)成員對(duì)象對(duì)象2數(shù)據(jù)成員數(shù)據(jù)成員對(duì)象對(duì)象n公用成員函數(shù)代碼公用成員函數(shù)代碼.2022-3-6341.3.6 this指針 一、問(wèn)題的提出一、問(wèn)題的提出 每個(gè)對(duì)象中的數(shù)據(jù)成員都分別占有存儲(chǔ)空間,而成員函數(shù)都是同每個(gè)對(duì)象中的數(shù)據(jù)成員都分別占有存儲(chǔ)空間,而成員函數(shù)都是同一代碼段。如果對(duì)同一個(gè)類(lèi)定義了一代碼段。如果對(duì)同一個(gè)類(lèi)定義了n n個(gè)對(duì)象,那么,當(dāng)不同對(duì)象的成員函個(gè)對(duì)象,那么,當(dāng)不同對(duì)象的成員函數(shù)引用數(shù)據(jù)成員時(shí),怎么能保證引用的數(shù)據(jù)成員是屬于哪個(gè)對(duì)象呢?數(shù)引用數(shù)據(jù)成員時(shí),怎

42、么能保證引用的數(shù)據(jù)成員是屬于哪個(gè)對(duì)象呢? 二、二、thisthis指針指針nC+C+除了接受原有的參數(shù)外,還隱含的接受了一個(gè)特殊的指針參數(shù),這個(gè)除了接受原有的參數(shù)外,還隱含的接受了一個(gè)特殊的指針參數(shù),這個(gè)指針?lè)Q為指針?lè)Q為thisthis指針指針。n它是指向本類(lèi)對(duì)象的指針,它的值是當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象的它是指向本類(lèi)對(duì)象的指針,它的值是當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象的起始地址,既起始地址,既thisthis指針指向當(dāng)前對(duì)象。指針指向當(dāng)前對(duì)象。.2022-3-635【例例1.13】設(shè)計(jì)矩形類(lèi)設(shè)計(jì)矩形類(lèi)CRect,說(shuō)明,說(shuō)明this指針的用法。指針的用法。分析:矩形類(lèi)數(shù)據(jù)成員包括左上角坐標(biāo)(

43、分析:矩形類(lèi)數(shù)據(jù)成員包括左上角坐標(biāo)(left和和top)和矩形的長(zhǎng)()和矩形的長(zhǎng)(length)和)和寬(寬(width),定義成員函數(shù)),定義成員函數(shù)set()設(shè)置矩形,成員函數(shù)設(shè)置矩形,成員函數(shù)area()計(jì)算矩形的面積。計(jì)算矩形的面積。#include class CRectpublic: CRect( ); void set( double t, double, double len, double wid); double area();private: double left; double top; double length; double width; CRect:CRect

44、() top = 0; /相當(dāng)與相當(dāng)與this-top=0 left = 0; length = 0; width = 0; .2022-3-636void CRect:set(double t, double lef, double len, double wid )top = t; left = lef;length = len;width = wid; double CRect:area()return length* width; void main()CRect r1,r2; r1.set ( 10,10,10,10); r2.set ( 200,200,15,25); cout第一

45、矩形的面積是第一矩形的面積是:r1.area()endl;cout第二矩形的面積是第二矩形的面積是:r2.area()top=t; left = lef;/等價(jià)與等價(jià)與this- left = lef; length = len;/等價(jià)與等價(jià)與this- length = len; width = wid;/等價(jià)與等價(jià)與this- width = wid; 2022-3-6.371.5 類(lèi)和類(lèi)和對(duì)象的進(jìn)一步引用對(duì)象的進(jìn)一步引用 在程序中經(jīng)常需要訪(fǎng)問(wèn)對(duì)象中的成員,訪(fǎng)問(wèn)對(duì)象中在程序中經(jīng)常需要訪(fǎng)問(wèn)對(duì)象中的成員,訪(fǎng)問(wèn)對(duì)象中的成員可以有的成員可以有3 3種方法:種方法:n 通過(guò)通過(guò)對(duì)象名和成員運(yùn)算符對(duì)象

46、名和成員運(yùn)算符訪(fǎng)問(wèn)對(duì)象中的成員;訪(fǎng)問(wèn)對(duì)象中的成員;n 通過(guò)通過(guò)指向?qū)ο蟮闹羔樅椭羔樳\(yùn)算符指向?qū)ο蟮闹羔樅椭羔樳\(yùn)算符訪(fǎng)問(wèn)對(duì)象中的成員;訪(fǎng)問(wèn)對(duì)象中的成員;n 通過(guò)通過(guò)對(duì)象的引用變量對(duì)象的引用變量訪(fǎng)問(wèn)對(duì)象中的成員。訪(fǎng)問(wèn)對(duì)象中的成員。2022-3-6.381.4 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)的作用構(gòu)造函數(shù)和析構(gòu)函數(shù)的作用1. 1. 構(gòu)造(構(gòu)造(constructorconstructor)函數(shù))函數(shù) 在創(chuàng)建對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用它來(lái)初始化數(shù)據(jù)成員;在創(chuàng)建對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用它來(lái)初始化數(shù)據(jù)成員;2. 2. 析構(gòu)(析構(gòu)(destructordestructor)函數(shù))函數(shù) 在對(duì)象生

47、存期結(jié)束的時(shí)候,自動(dòng)調(diào)用來(lái)釋放該對(duì)象。在對(duì)象生存期結(jié)束的時(shí)候,自動(dòng)調(diào)用來(lái)釋放該對(duì)象。2022-3-6.391.4.1 構(gòu)造函數(shù)的定義一、構(gòu)造函數(shù)的定義格式:一、構(gòu)造函數(shù)的定義格式:class class 類(lèi)名類(lèi)名 publicpublic: 構(gòu)造函數(shù)函數(shù)名(參數(shù)表);構(gòu)造函數(shù)函數(shù)名(參數(shù)表); ;2022-3-6.401.4.1 構(gòu)造函數(shù)的定義二、構(gòu)造函數(shù)的特點(diǎn)二、構(gòu)造函數(shù)的特點(diǎn)(1 1)構(gòu)造函數(shù)是類(lèi)的一個(gè)特殊的成員函數(shù),構(gòu)造函數(shù)是類(lèi)的一個(gè)特殊的成員函數(shù),函數(shù)名與類(lèi)名相同函數(shù)名與類(lèi)名相同;(2 2)構(gòu)造函數(shù)的訪(fǎng)問(wèn)屬性應(yīng)該是)構(gòu)造函數(shù)的訪(fǎng)問(wèn)屬性應(yīng)該是公有(公有(publicpublic)訪(fǎng)問(wèn)屬性

48、;訪(fǎng)問(wèn)屬性;(3 3)構(gòu)造函數(shù)的功能是對(duì)對(duì)象進(jìn)行初始化,因此在構(gòu)造函數(shù)中)構(gòu)造函數(shù)的功能是對(duì)對(duì)象進(jìn)行初始化,因此在構(gòu)造函數(shù)中只能對(duì)數(shù)據(jù)只能對(duì)數(shù)據(jù)成員做初始化成員做初始化,這些數(shù)據(jù)成員一般為私有成員,在構(gòu)造函數(shù)中一般不做,這些數(shù)據(jù)成員一般為私有成員,在構(gòu)造函數(shù)中一般不做初始化以外的事情;初始化以外的事情;(4 4)構(gòu)造函數(shù)可以在類(lèi)內(nèi)定義也可以在類(lèi)外定義;)構(gòu)造函數(shù)可以在類(lèi)內(nèi)定義也可以在類(lèi)外定義;(5 5)構(gòu)造函數(shù))構(gòu)造函數(shù)無(wú)函數(shù)返回類(lèi)型無(wú)函數(shù)返回類(lèi)型。注意:是什么也不寫(xiě),也不可寫(xiě)。注意:是什么也不寫(xiě),也不可寫(xiě)voidvoid;(6 6)在程序運(yùn)行時(shí),當(dāng)新的對(duì)象被建立,該對(duì)象所屬的類(lèi)的構(gòu)造函數(shù)自動(dòng)

49、)在程序運(yùn)行時(shí),當(dāng)新的對(duì)象被建立,該對(duì)象所屬的類(lèi)的構(gòu)造函數(shù)自動(dòng)被調(diào)用,在該對(duì)象生存期中也被調(diào)用,在該對(duì)象生存期中也只調(diào)用這一次只調(diào)用這一次。(7 7)構(gòu)造函數(shù)可以重載構(gòu)造函數(shù)可以重載。類(lèi)中可以有多個(gè)構(gòu)造函數(shù),它們由不同的參數(shù)表。類(lèi)中可以有多個(gè)構(gòu)造函數(shù),它們由不同的參數(shù)表區(qū)分,系統(tǒng)在自動(dòng)調(diào)用時(shí)按一般函數(shù)重載的規(guī)則選一個(gè)執(zhí)行。區(qū)分,系統(tǒng)在自動(dòng)調(diào)用時(shí)按一般函數(shù)重載的規(guī)則選一個(gè)執(zhí)行。2022-3-6.41【例例1.31.3】定義定義CdateCdate一個(gè)不帶參數(shù)的構(gòu)造函數(shù)。一個(gè)不帶參數(shù)的構(gòu)造函數(shù)。#include class Cdate /定義定義一個(gè)一個(gè)日期類(lèi)日期類(lèi) public:/公有數(shù)據(jù)成員公

50、有數(shù)據(jù)成員 Cdate() /定義構(gòu)造函數(shù)定義構(gòu)造函數(shù) year=2000;/初始化數(shù)據(jù)成員初始化數(shù)據(jù)成員 month=1; day=1; void Print()/一般成員函數(shù)一般成員函數(shù) coutyear- month -dayendl; private: int year,month ,day; int main() Cdate d1; /自動(dòng)調(diào)用構(gòu)造函數(shù),初始化數(shù)據(jù)成員自動(dòng)調(diào)用構(gòu)造函數(shù),初始化數(shù)據(jù)成員 d1.Print(); return 0;程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:2000-1-1 2022-3-6.42【例例1.41.4】CdateCdate類(lèi)帶參數(shù)的構(gòu)造函數(shù)類(lèi)帶參數(shù)的構(gòu)造

51、函數(shù) #include class Cdatepublic: Cdate(int y, int m,int d); void Print();private: int year,month ,day;Cdate:Cdate(int y, int m,int d) year=y; month=m; day=d;void Cdate:Print() coutyear- month -dayendl;int main() Cdate d1(1999,12,30),d2(2001,4,1); d1.Print(); d2.Print(); return 0;程序運(yùn)行結(jié)果:1999-12-302001-

52、4-12022-3-6.43三、使用初始化表來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的初始化三、使用初始化表來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的初始化初始化表的一般格式:初始化表的一般格式:類(lèi)名類(lèi)名:構(gòu)造函數(shù)名構(gòu)造函數(shù)名( (參數(shù)列表參數(shù)列表):):初始化表初始化表 構(gòu)造函數(shù)其他實(shí)現(xiàn)代碼構(gòu)造函數(shù)其他實(shí)現(xiàn)代碼 初始化表的格式:初始化表的格式: 對(duì)象成員對(duì)象成員1(1(參數(shù)名或常量參數(shù)名或常量) ),對(duì)象成員,對(duì)象成員2(2(參數(shù)名或常量參數(shù)名或常量) ),對(duì)象成對(duì)象成員員n(n(參數(shù)名或常量參數(shù)名或常量) )例如例例如例1.41.4定義的構(gòu)造函數(shù)可以改用以下形式:定義的構(gòu)造函數(shù)可以改用以下形式:Cdate: Cdate(int y, i

53、nt m,int d): year(y), month(m),day(d) Cdate: Cdate(int y, int m,int d): year(y), month(m),day(d) 注意:注意:這種寫(xiě)法方便、簡(jiǎn)潔。許多這種寫(xiě)法方便、簡(jiǎn)潔。許多C+C+程序員喜歡用這種方式初始化所有的數(shù)據(jù)成員。除了構(gòu)造函程序員喜歡用這種方式初始化所有的數(shù)據(jù)成員。除了構(gòu)造函數(shù)可以使用初始化表外,類(lèi)的其他成員函數(shù)也可以根據(jù)需要使用初始化表。數(shù)可以使用初始化表外,類(lèi)的其他成員函數(shù)也可以根據(jù)需要使用初始化表。2022-3-6.441.4.2 構(gòu)造函數(shù)的重載構(gòu)造函數(shù)的重載 程序中需要以不同的方式初始化類(lèi)對(duì)象時(shí),

54、可以在一個(gè)類(lèi)中程序中需要以不同的方式初始化類(lèi)對(duì)象時(shí),可以在一個(gè)類(lèi)中定義多個(gè)構(gòu)造函數(shù)。即可以重載構(gòu)造函數(shù)。定義多個(gè)構(gòu)造函數(shù)。即可以重載構(gòu)造函數(shù)。C+C+定義對(duì)象時(shí),根定義對(duì)象時(shí),根據(jù)聲明中的據(jù)聲明中的參數(shù)個(gè)數(shù)和類(lèi)型參數(shù)個(gè)數(shù)和類(lèi)型選擇相應(yīng)的構(gòu)造函數(shù)初始化對(duì)象選擇相應(yīng)的構(gòu)造函數(shù)初始化對(duì)象。2022-3-6.45【例例1.51.5】CdateCdate類(lèi)中的重載構(gòu)造函數(shù)類(lèi)中的重載構(gòu)造函數(shù) #include class Cdatepublic: Cdate(); /不帶參數(shù)的構(gòu)造函數(shù),又稱(chēng)默認(rèn)構(gòu)造函數(shù)不帶參數(shù)的構(gòu)造函數(shù),又稱(chēng)默認(rèn)構(gòu)造函數(shù) Cdate(int y);/帶帶1個(gè)參數(shù)的構(gòu)造函數(shù)個(gè)參數(shù)的構(gòu)造函數(shù)

55、 Cdate(int y, int m); /帶帶2個(gè)參數(shù)的構(gòu)造函數(shù)個(gè)參數(shù)的構(gòu)造函數(shù) Cdate(int y, int m,int d); /帶帶3個(gè)參數(shù)的構(gòu)造函數(shù)個(gè)參數(shù)的構(gòu)造函數(shù) void Print();private: int year,month ,day;Cdate: Cdate()/構(gòu)造函數(shù)的定義構(gòu)造函數(shù)的定義 year=2000; month=1; day=1;Cdate: Cdate(int y) year=y; month=1; day=1;Cdate: Cdate(int y, int m) year=y; month=m; day=1;Cdate: Cdate(int y

56、, int m,int d) year=y; month=m; day=d;void Cdate:Print() coutyear- month -dayendl;int main() Cdate day1; Cdate day2(2004); Cdate day3(2005,2); Cdate day4(2006,12,16); day1.Print(); day2.Print(); day3.Print(); day4.Print(); return 0;程序運(yùn)行結(jié)果:2000-1-12004-1-12005-2-12006-12-162022-3-6.461.4.2 構(gòu)造函數(shù)的重載構(gòu)造函

57、數(shù)的重載關(guān)于構(gòu)造函數(shù)關(guān)于構(gòu)造函數(shù)C+C+規(guī)定:規(guī)定:(1 1)每個(gè)類(lèi))每個(gè)類(lèi)必須有一個(gè)構(gòu)造函數(shù)必須有一個(gè)構(gòu)造函數(shù),如果沒(méi)有就不能創(chuàng)建任何對(duì)象;,如果沒(méi)有就不能創(chuàng)建任何對(duì)象;(2 2)若沒(méi)有定義任何一個(gè)構(gòu)造函數(shù),)若沒(méi)有定義任何一個(gè)構(gòu)造函數(shù),C+C+提供一個(gè)默認(rèn)的構(gòu)造函數(shù),提供一個(gè)默認(rèn)的構(gòu)造函數(shù),該構(gòu)造函數(shù)沒(méi)有參數(shù),不做任何工作,相當(dāng)一個(gè)空函數(shù),例如:該構(gòu)造函數(shù)沒(méi)有參數(shù),不做任何工作,相當(dāng)一個(gè)空函數(shù),例如: Cdate:CdateCdate:Cdate()() 所以在講構(gòu)造函數(shù)以前也可以定義一個(gè)對(duì)象,就所以在講構(gòu)造函數(shù)以前也可以定義一個(gè)對(duì)象,就是因?yàn)橄到y(tǒng)提供的默認(rèn)構(gòu)造函數(shù)。是因?yàn)橄到y(tǒng)提供的默認(rèn)構(gòu)

58、造函數(shù)。(3 3)只要)只要C+C+提供一個(gè)構(gòu)造函數(shù)(不一定是沒(méi)有參數(shù)的),提供一個(gè)構(gòu)造函數(shù)(不一定是沒(méi)有參數(shù)的),C+C+不再不再提供默認(rèn)的構(gòu)造函數(shù)。也就是說(shuō)為類(lèi)定義了一個(gè)帶參數(shù)的構(gòu)造提供默認(rèn)的構(gòu)造函數(shù)。也就是說(shuō)為類(lèi)定義了一個(gè)帶參數(shù)的構(gòu)造函數(shù),還想要?jiǎng)?chuàng)建無(wú)參的對(duì)象時(shí),則需要自己定義一個(gè)默認(rèn)構(gòu)函數(shù),還想要?jiǎng)?chuàng)建無(wú)參的對(duì)象時(shí),則需要自己定義一個(gè)默認(rèn)構(gòu)造函數(shù)造函數(shù) 2022-3-6.471.4.3 默認(rèn)參數(shù)的構(gòu)造函數(shù)默認(rèn)參數(shù)的構(gòu)造函數(shù)為什么使用默認(rèn)參數(shù)的構(gòu)造函數(shù):對(duì)象常有一些初始值。為什么使用默認(rèn)參數(shù)的構(gòu)造函數(shù):對(duì)象常有一些初始值?!纠?.61.6】設(shè)計(jì)設(shè)計(jì)CPointCPoint類(lèi),它帶有默認(rèn)參

59、數(shù)的構(gòu)造函數(shù)。類(lèi),它帶有默認(rèn)參數(shù)的構(gòu)造函數(shù)。分析:一個(gè)點(diǎn)包括橫坐標(biāo)(分析:一個(gè)點(diǎn)包括橫坐標(biāo)(x x)和縱坐標(biāo)()和縱坐標(biāo)(y y)兩個(gè)數(shù)據(jù)成員)兩個(gè)數(shù)據(jù)成員, , 默認(rèn)初始值為默認(rèn)初始值為(0,00,0)。也可以根據(jù)用戶(hù)需要,初始化點(diǎn)為其他坐標(biāo),因此需要定義一個(gè))。也可以根據(jù)用戶(hù)需要,初始化點(diǎn)為其他坐標(biāo),因此需要定義一個(gè)帶默認(rèn)參數(shù)的構(gòu)造函數(shù)。定義成員函數(shù)帶默認(rèn)參數(shù)的構(gòu)造函數(shù)。定義成員函數(shù)print()print()輸出該點(diǎn)。輸出該點(diǎn)。CPoint-x : double-y : double+CPoint(x1 : double =0,y1 : double =0)+print() : void

60、CPoint類(lèi)圖類(lèi)圖 2022-3-6.48#include class CPointpublic: CPoint (double x1=0,double y1=0)/帶默認(rèn)參數(shù)的構(gòu)造函數(shù)帶默認(rèn)參數(shù)的構(gòu)造函數(shù) x=x1; y=y1; void print () cout(x,y)endl;private: double x,y;main() CPoint point1; /自動(dòng)調(diào)用帶默認(rèn)參數(shù)的構(gòu)造函數(shù),(自動(dòng)調(diào)用帶默認(rèn)參數(shù)的構(gòu)造函數(shù),(0,0) CPoint point2(10);/自動(dòng)調(diào)用帶默認(rèn)參數(shù)的構(gòu)造函數(shù),(自動(dòng)調(diào)用帶默認(rèn)參數(shù)的構(gòu)造函數(shù),(10,0) CPoint point3(20,30);/自動(dòng)調(diào)用帶默認(rèn)參數(shù)的構(gòu)造函數(shù),(自動(dòng)調(diào)用帶默認(rèn)參數(shù)的構(gòu)造函數(shù),(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論