




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、Visual C+Visual C+程序設計程序設計第第 六六 章章類和對象類和對象Visual C+Visual C+程序設計程序設計6.1 面向?qū)ο蟪绦蛟O計概述面向?qū)ο蟪绦蛟O計概述6.2 類和對象類和對象6.3 構(gòu)造函數(shù)構(gòu)造函數(shù)6.4 析構(gòu)函數(shù)析構(gòu)函數(shù)1 1、面向?qū)ο蟪绦蛟O計面向?qū)ο蟪绦蛟O計 概念:概念:面向?qū)ο蟪绦蛟O計把數(shù)據(jù)及其操作作為一個整體對待,面向?qū)ο蟪绦蛟O計把數(shù)據(jù)及其操作作為一個整體對待,其程序一般由其程序一般由類的定義類的定義和和類的使用類的使用兩部分組成,通過向?qū)ο蟀l(fā)送兩部分組成,通過向?qū)ο蟀l(fā)送消息來完成相應的操作。消息來完成相應的操作。 特點:特點:封裝性封裝性(隱藏性隱藏
2、性):通過類將對象的屬性(數(shù)據(jù))和行為):通過類將對象的屬性(數(shù)據(jù))和行為(函數(shù))封裝為整體,通過接口與外界交互;(函數(shù))封裝為整體,通過接口與外界交互; 繼承性繼承性(派生性派生性):由基類產(chǎn)生派生類;):由基類產(chǎn)生派生類;多態(tài)性多態(tài)性:不同的對象,收到同一消息產(chǎn)生不同的結(jié)果:不同的對象,收到同一消息產(chǎn)生不同的結(jié)果 。類和對象的概念類和對象的概念類的定義類的定義成員函數(shù)成員函數(shù)對象的定義和使用對象的定義和使用類的作用域類的作用域1 1、類的概念、類的概念類是具有相同類型對象的抽象。類是具有相同類型對象的抽象。 從程序設計的角度看,從程序設計的角度看,是用戶定義的是用戶定義的數(shù)據(jù)類型數(shù)據(jù)類型,
3、就就是類類型(是類類型(classclasstypetype)的)的變量變量。 VC+VC+中,把類的成員分為兩個部分:中,把類的成員分為兩個部分:數(shù)據(jù)數(shù)據(jù)(相當于屬性)(相當于屬性)和對數(shù)據(jù)的操作(相當于行為,用和對數(shù)據(jù)的操作(相當于行為,用函數(shù)函數(shù)實現(xiàn))。實現(xiàn))。2 2、類和對象的關(guān)系、類和對象的關(guān)系對象的抽象對象的抽象是是類類,類的實例類的實例是是對象對象。其關(guān)系如圖其關(guān)系如圖7-1:類:學生類:學生 對象:陳紅對象:陳紅數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)特征:特征: 06400020 陳紅陳紅 計算機計算機 90數(shù)數(shù) 據(jù)據(jù) 值值實實 例例抽抽 象象屬性:屬性:學號學號姓名姓名 專業(yè)專業(yè)成績成績 圖圖7-
4、1 類與對象的關(guān)系類與對象的關(guān)系 VC+VC+中類定義的一般格式如下:中類定義的一般格式如下:class ClassName /類頭類頭 /類體開始類體開始 private: 數(shù)據(jù)成員數(shù)據(jù)成員 成員函數(shù)成員函數(shù) public: 數(shù)據(jù)成員數(shù)據(jù)成員 成員函數(shù)成員函數(shù) protected: 數(shù)據(jù)成員數(shù)據(jù)成員 成員函數(shù)成員函數(shù); /類體結(jié)束類體結(jié)束class是定義類的關(guān)鍵字,是定義類的關(guān)鍵字,ClassName是類名,為標識符。是類名,為標識符。類的成員放在類體中:類的成員放在類體中:數(shù)據(jù)成員是變量的說明語句;數(shù)據(jù)成員是變量的說明語句;成員函數(shù)是對數(shù)據(jù)成員的操作。成員函數(shù)是對數(shù)據(jù)成員的操作。類體從類體
5、從“”開始到開始到“”結(jié)束。結(jié)束。關(guān)鍵字關(guān)鍵字publicpublic(公有公有)、)、privateprivate(私有私有)和)和protectedprotected(保護保護)稱為訪問控制符,用于設置類成員的訪問權(quán)限。)稱為訪問控制符,用于設置類成員的訪問權(quán)限。publicpublic表示在其后聲明的所有成員在表示在其后聲明的所有成員在類內(nèi)類內(nèi)、類外類外均可以被均可以被訪問;訪問;privateprivate表示在其后聲明的所有成員只能在該表示在其后聲明的所有成員只能在該類內(nèi)類內(nèi)被訪問;被訪問;protectedprotected表示在其后的所有成員可以在該表示在其后的所有成員可以在該類
6、內(nèi)類內(nèi)或或派生類派生類內(nèi)被訪問。內(nèi)被訪問。三個關(guān)鍵字的使用次數(shù)、順序不限,有效范圍至出現(xiàn)下一三個關(guān)鍵字的使用次數(shù)、順序不限,有效范圍至出現(xiàn)下一個關(guān)鍵字或類定義結(jié)束止。個關(guān)鍵字或類定義結(jié)束止。類中類中缺省缺省訪問權(quán)限說明的成員聲明是訪問權(quán)限說明的成員聲明是privateprivate的。的。 class Point /定義類名為定義類名為Point的類的類private:/定義私有數(shù)據(jù)成員定義私有數(shù)據(jù)成員int x;/x表示橫坐標表示橫坐標int y;/ y表示縱坐標表示縱坐標public: /定義公有成員函數(shù)定義公有成員函數(shù)int GetX(); /取取x坐標坐標int GetY();/取取y
7、坐標坐標void SetXY(int, int); /置置x、y坐標坐標void printXY(); /打印打印x、y坐標坐標;學習與實踐:學習與實踐:通常類的通常類的數(shù)據(jù)成員數(shù)據(jù)成員是是私有私有的,而的,而成員函數(shù)成員函數(shù)是是公有公有的。的。該類定義能否省略關(guān)鍵字該類定義能否省略關(guān)鍵字private 或關(guān)鍵字或關(guān)鍵字public?成員成員x x、y y能否如下定義:能否如下定義:int x,y;例例6 6-1 -1 定義一個平面二維坐標類。定義一個平面二維坐標類。算法算法:二維坐標由橫坐標二維坐標由橫坐標x和縱坐標和縱坐標y組成,用數(shù)據(jù)成員組成,用數(shù)據(jù)成員x和和y表表示;行為包括取坐標、置
8、坐標、打印坐標,用相應的成員函數(shù)示;行為包括取坐標、置坐標、打印坐標,用相應的成員函數(shù)實現(xiàn)。實現(xiàn)。1 1、成員函數(shù)的定義。、成員函數(shù)的定義。類的成員函數(shù)既可以類的成員函數(shù)既可以在類中定義在類中定義,也可以,也可以在類中說明、在類中說明、類外定義類外定義。在類外定義時一定要先在類中說明,此時為函數(shù)原型說在類外定義時一定要先在類中說明,此時為函數(shù)原型說明語句;在類外定義的格式為:明語句;在類外定義的格式為:函數(shù)類型函數(shù)類型 類名類名:成員函數(shù)名成員函數(shù)名( (形參表形參表) ) 函數(shù)體函數(shù)體 類的成員函數(shù)無論是在類中定類的成員函數(shù)無論是在類中定義,還是在類外定義,都是類的義,還是在類外定義,都是類
9、的一部份,都可以直接訪問類中的一部份,都可以直接訪問類中的所有成員。所有成員。int Point: GetX() return x; int Point: GetY()return y; void Point:printXY() cout(x, y“)n”; void Point:SetXY(int a, int b) x=a; y= b; 學習與實踐學習與實踐: 能否將成員函數(shù)定義中的能否將成員函數(shù)定義中的Point:去掉?去掉?例例6 6-2 -2 例例6 6-1-1中中PointPoint類的成員函數(shù)定義。類的成員函數(shù)定義。學習與實踐學習與實踐:(1)能否去掉能否去掉A行?行?(2)能否
10、去掉能否去掉B行?行?下列類的定義是否正確下列類的定義是否正確? ?class Pointint x, y;public: int GetX()return x; int GetY();/A void SetXY(int a, int b) x=a;y= b; void printXY()cout(x, y“)n”; ;int Point: GetY()return y; /B2 2、成員函數(shù)的內(nèi)聯(lián)特性。、成員函數(shù)的內(nèi)聯(lián)特性。 在類中定義在類中定義的類的成員函數(shù),是內(nèi)聯(lián)函數(shù);的類的成員函數(shù),是內(nèi)聯(lián)函數(shù);類中說明、類中說明、類外定義類外定義的成員函數(shù)不具有內(nèi)聯(lián)特性,要使其成為內(nèi)聯(lián)函數(shù)的成員函數(shù)不
11、具有內(nèi)聯(lián)特性,要使其成為內(nèi)聯(lián)函數(shù),在類體外定義時,必須在函數(shù)類型前加關(guān)鍵字,在類體外定義時,必須在函數(shù)類型前加關(guān)鍵字inlineinline,其,其定義的格式為:定義的格式為:inline 函數(shù)類型函數(shù)類型 類名類名:成員函數(shù)名成員函數(shù)名(形參表形參表) 函數(shù)體函數(shù)體 3 3、成員函數(shù)的重載與缺省參數(shù)。、成員函數(shù)的重載與缺省參數(shù)。例例6-3 6-3 定義重載的成員函數(shù)及缺省參數(shù)的成員函數(shù)。定義重載的成員函數(shù)及缺省參數(shù)的成員函數(shù)。class Pointint x, y;public:void SetX(int a=0)x=a;void SetY(int); /Avoid SetXY(int=0)
12、;void SetXY(int,int);void Point:SetY(int b=1) y=b;void Point:SetXY(int b) x=0; y=b;void Point:SetXY(int a, int b) x=a; y=b; 學習與實踐學習與實踐: (1)缺省參數(shù)既可以在說明缺省參數(shù)既可以在說明時給出,也可以在定義時時給出,也可以在定義時給出,但不能在說明和定給出,但不能在說明和定義時同時給出。義時同時給出。(2)能否把能否把A行改為:行改為: void SetY(int=0);1 1、對象的定義、對象的定義定義了類以后,就可以定義對象定義了類以后,就可以定義對象 ( (
13、類型的變量類型的變量) ) 。(1 1)定義對象的基本格式)定義對象的基本格式類名類名 對象名對象名1 1,對象名,對象名2 2,對象名,對象名n;n;(2 2)定義對象的方法)定義對象的方法(3 3)關(guān)于對象定義的幾點說明:)關(guān)于對象定義的幾點說明:對象必須先定義后使用。對象也有作用域。對象必須先定義后使用。對象也有作用域??梢远x指針對象、對象數(shù)組、指針對象數(shù)組,引用對可以定義指針對象、對象數(shù)組、指針對象數(shù)組,引用對 象,指向一維數(shù)組的指針對象等。象,指向一維數(shù)組的指針對象等。對象也可以動態(tài)生成,即由對象也可以動態(tài)生成,即由newnew產(chǎn)生。產(chǎn)生。class Pointint x, y;p
14、ublic:int GetX()return x;int GetY()return y;void printXY() coutxtyn; P1,P2; /定義了定義了Point類型的對象類型的對象P1和和P2Point Q1,Q2;/定義了定義了Point類型的對象類型的對象Q1和和Q2class int x, y;public: int GetX()return x; int GetY()return y; void printXY() coutxt;couty-成員名成員名(4 4)通過指針使用成員函數(shù))通過指針使用成員函數(shù)指針對象指針對象-成員函數(shù)名成員函數(shù)名 ( (實參表實參表) )
15、void f1(Point t) t.x=3; t.y=4;void f2(Point &t)t.x=3; t.y=4;void f3(Point *t) coutxy;Point f4(Point t) t.x=5; t.y=6; return t;void main()Point p1=1,2,p2;p2=p1;f1(p1);f2(p1);f3(&p1);p2=f4(p1);#include class Pointint x, y; public: int GetX ()return x; int GetY ()return y; void SetXY (int,int);
16、 void printXY () coutxt;coutyn; ; void Point:SetXY (int a, int b)x=a; y=b; void main() Point S,*P=&S,R; /定義對象定義對象S及指針對象及指針對象PS.SetXY(2,3);coutS.GetX()tS.GetY()n; /AR=S; coutR.GetX ()tR.GetY () SetXY(5,9); P- printXY(); 程序程序運行運行結(jié)果:結(jié)果:232359程序解讀:程序解讀:A行能否改成:行能否改成:coutxtyn;或或couts.xts.yn;例例6-4 6-4
17、對象的使用。對象的使用。1 1、類作用域、類作用域 類作用域是指在類的聲明中用一對花括號括起來的部分。類作用域是指在類的聲明中用一對花括號括起來的部分。例例如:如:class Xpublic:void print()coutxy;int x;float y;int i=x;/A行,錯誤行,錯誤int y; /B行,正確行,正確程序解讀程序解讀:(1)A行的行的x具有類作用域,只能在類或?qū)哂蓄愖饔糜?,只能在類或?qū)ο笾惺褂孟笾惺褂?(2)B行說明的行說明的y與類與類X中的成員中的成員y屬于不同屬于不同的作用域。的作用域。(3)在程序中定義如下函數(shù)正確嗎?)在程序中定義如下函數(shù)正確嗎?void f
18、(X t)coutt.xt.y; 類的成員函數(shù)無論是內(nèi)聯(lián)的還是在類外單獨定義的,其函類的成員函數(shù)無論是內(nèi)聯(lián)的還是在類外單獨定義的,其函數(shù)名都具有類作用域。例如:數(shù)名都具有類作用域。例如:class Xpublic:int x;int fun(int);int x=3;int fun() /全局函數(shù)全局函數(shù)fun() return 1; int X:fun(int y)x=y*y; :x+; /全局變量全局變量xreturn x; /成員成員x 程序解讀:程序解讀:void main()X t;coutt.fun(5)n;coutxtfun()n;運行結(jié)果:運行結(jié)果:25412 2、類定義的作用
19、域、類定義的作用域(1 1)全局作用域,稱全局類。)全局作用域,稱全局類。(2 2)在另一個類的作用域中,稱嵌套類。)在另一個類的作用域中,稱嵌套類。(3 3)在一個塊的局部作用域中,稱局部類。如:)在一個塊的局部作用域中,稱局部類。如:void f() class AA /局部類,只能在函數(shù)局部類,只能在函數(shù)f中使用中使用 float s,t; public: void print() ; AA a; void main() 程序解讀程序解讀:局部類中不能說明靜態(tài)成員函數(shù),局部類中不能說明靜態(tài)成員函數(shù),并且所有成員函數(shù)都必須定義在類體內(nèi)。并且所有成員函數(shù)都必須定義在類體內(nèi)。局部類不能在其局部
20、作用域外訪問,如不局部類不能在其局部作用域外訪問,如不可以在主函數(shù)中出現(xiàn)定義類可以在主函數(shù)中出現(xiàn)定義類AA對象的語句。對象的語句。 class Rectangle /定義矩形類定義矩形類public: class Point /定義嵌套類定義嵌套類 private: int x, y; public: setXY (int, int); ;Point topLeft, botRight; /二維坐標類的二個對象二維坐標類的二個對象settangle (int, int, int, int);程序解讀程序解讀:(1)成員函數(shù))成員函數(shù)setXY (int, int)在在Rectangle類外應如
21、何實現(xiàn)?類外應如何實現(xiàn)?(2)在)在Rectangle類外類外Point類的對象應如何定義,成員又類的對象應如何定義,成員又應怎樣訪問?應怎樣訪問? int Rectangle:Point:setXY(int a,int b)Rectangle:Point p;初始化對象的方法初始化對象的方法構(gòu)造函數(shù)構(gòu)造函數(shù)類型轉(zhuǎn)換構(gòu)造函數(shù)類型轉(zhuǎn)換構(gòu)造函數(shù)復制構(gòu)造函數(shù)復制構(gòu)造函數(shù)This指針指針在在定義對象時,怎樣給對象的數(shù)據(jù)成員賦值呢?定義對象時,怎樣給對象的數(shù)據(jù)成員賦值呢?1 1、用數(shù)據(jù)列表初始化,如:、用數(shù)據(jù)列表初始化,如:class Pointpublic: int x, y; int GetX ()
22、return x; int GetY ()return y; void SetXY (int,int); void printXY () coutxt;coutyn; P=3,9; 這種方法實際上是在類體外訪問類的成員,所以只適用于這種方法實際上是在類體外訪問類的成員,所以只適用于數(shù)據(jù)成員全為數(shù)據(jù)成員全為公有公有的情況,當數(shù)據(jù)成員是私有或派生時不可使的情況,當數(shù)據(jù)成員是私有或派生時不可使用。用。 2 2、用成員函數(shù)給對象賦值,如:、用成員函數(shù)給對象賦值,如:class Aprivate:int i;public:void init( int a) i=a; void Print( ) cout
23、iendl; ;void main()A obj;obj.init(12);obj.Print( );這種方法主要有兩個缺點:這種方法主要有兩個缺點:(1 1)增加了程序的復雜程度;)增加了程序的復雜程度;(2 2)容易遺漏賦值操作,被遺漏的對象將毫)容易遺漏賦值操作,被遺漏的對象將毫無意義。無意義。 3 3、用構(gòu)造函數(shù)給對象初始化。、用構(gòu)造函數(shù)給對象初始化。(P143)(P143)構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)是一種特殊的成員函數(shù)成員函數(shù),實現(xiàn)數(shù)據(jù)成員的初始化。,實現(xiàn)數(shù)據(jù)成員的初始化。當對象被創(chuàng)建時,構(gòu)造函數(shù)當對象被創(chuàng)建時,構(gòu)造函數(shù)自動被調(diào)用自動被調(diào)用。構(gòu)造函數(shù)構(gòu)造函數(shù)與類同名與類同名,沒有函
24、數(shù)類型沒有函數(shù)類型,也不返回值。,也不返回值。根據(jù)構(gòu)造函數(shù)參數(shù)的類型,可以把構(gòu)造函數(shù)分成兩大類:根據(jù)構(gòu)造函數(shù)參數(shù)的類型,可以把構(gòu)造函數(shù)分成兩大類:一一般的構(gòu)造函數(shù)般的構(gòu)造函數(shù)和和拷貝功能的構(gòu)造函數(shù)拷貝功能的構(gòu)造函數(shù)。一個類可以有多個構(gòu)。一個類可以有多個構(gòu)造函數(shù),具體的實現(xiàn)方法可以有造函數(shù),具體的實現(xiàn)方法可以有多種形式多種形式。1 1、構(gòu)造函數(shù)的定義、構(gòu)造函數(shù)的定義像其他成員函數(shù)一樣,構(gòu)造函數(shù)既可以在類中直接定義,像其他成員函數(shù)一樣,構(gòu)造函數(shù)既可以在類中直接定義,也可以在類中說明、類外定義。也可以在類中說明、類外定義。類中定義的格式:類中定義的格式:類名類名( (形參表形參表)函數(shù)體函數(shù)體 類中
25、說明、類外定義的格式:類中說明、類外定義的格式:說明說明類名類名(形參表形參表);定義定義類名類名:類名類名(形參表形參表) 函數(shù)體函數(shù)體 class Point int x,y;public:Point(int a , int b )x=a;y=b; /構(gòu)造函數(shù)構(gòu)造函數(shù)定義定義void printXY () coutxtyn; ; void main()Point a(1,2),b(3,4);a.printXY();b.printXY();程序解讀:程序解讀:若在類中說明、類外定義構(gòu)造若在類中說明、類外定義構(gòu)造函數(shù),程序應怎樣修改?函數(shù),程序應怎樣修改?Point:Point(int a ,
26、 int b )x=a;y=b; /定義定義例例6-5 6-5 構(gòu)造函數(shù)定義舉例。構(gòu)造函數(shù)定義舉例。2 2、 缺省的構(gòu)造函數(shù)缺省的構(gòu)造函數(shù)(P144)(P144)任何一個類至少有任何一個類至少有兩個兩個構(gòu)造函數(shù)構(gòu)造函數(shù): :一般的構(gòu)造函數(shù)和拷貝功能構(gòu)造函數(shù)一般的構(gòu)造函數(shù)和拷貝功能構(gòu)造函數(shù)。當沒有定義構(gòu)造函數(shù)時,系統(tǒng)將自動產(chǎn)生如下缺省的構(gòu)造函數(shù):當沒有定義構(gòu)造函數(shù)時,系統(tǒng)將自動產(chǎn)生如下缺省的構(gòu)造函數(shù):類名類名:類名類名() () 當程序中定義了構(gòu)造函數(shù)時,系統(tǒng)將不再自動產(chǎn)生。當程序中定義了構(gòu)造函數(shù)時,系統(tǒng)將不再自動產(chǎn)生。用戶可以定義缺省的構(gòu)造函數(shù)。用戶可以定義缺省的構(gòu)造函數(shù)。缺省的構(gòu)造函數(shù)有以下
27、幾種形式:缺省的構(gòu)造函數(shù)有以下幾種形式:沒有定義構(gòu)造函數(shù)時,系統(tǒng)沒有定義構(gòu)造函數(shù)時,系統(tǒng)自動產(chǎn)生自動產(chǎn)生的構(gòu)造函數(shù);的構(gòu)造函數(shù);用戶定義的用戶定義的沒有參數(shù)沒有參數(shù)的構(gòu)造函數(shù);的構(gòu)造函數(shù);用戶定義的、用戶定義的、所有參數(shù)都有缺省值所有參數(shù)都有缺省值的構(gòu)造函數(shù)。的構(gòu)造函數(shù)。一個類一個類只能有一個只能有一個缺省的構(gòu)造函數(shù)。缺省的構(gòu)造函數(shù)。3 3、構(gòu)造函數(shù)的使用、構(gòu)造函數(shù)的使用定義對象的基本格式為:定義對象的基本格式為:類名類名 對象名對象名( (實參表實參表) );調(diào)用缺省構(gòu)造函數(shù)產(chǎn)生對象的格式為:調(diào)用缺省構(gòu)造函數(shù)產(chǎn)生對象的格式為:類名類名 對象名;對象名;class Point int x,y;
28、public:void printXY () coutxt yn; Point(int a=0, int b=0)x=a;y=b; ;void main()Point p1 (1, 2),p2; / 定義對象定義對象p1和和p2 ,p2無參無參 p1.printXY();p2.printXY(); 4 4、 構(gòu)造函數(shù)的重載構(gòu)造函數(shù)的重載一個類中可以有多個構(gòu)造函數(shù),用以接受不同的初始值,一個類中可以有多個構(gòu)造函數(shù),用以接受不同的初始值,但所有的構(gòu)造函數(shù)必須具有不同的參數(shù)表,即實現(xiàn)重載。但所有的構(gòu)造函數(shù)必須具有不同的參數(shù)表,即實現(xiàn)重載。class Point int x,y;public:Poin
29、t( )x=1;y=1; / 構(gòu)造函數(shù)構(gòu)造函數(shù)1Point(int a )x=a;y=2; / 構(gòu)造函數(shù)構(gòu)造函數(shù)2Point(int a , int b )x=a;y=b; / 構(gòu)造函數(shù)構(gòu)造函數(shù)3 void printXY () coutxtyn; ;void main()Point a , b(2) ,c(3,3); a.printXY();b.printXY(); c.printXY();程序解讀程序解讀:能否給構(gòu)造函數(shù)能否給構(gòu)造函數(shù)2加缺省參數(shù)?加缺省參數(shù)?5 5、 成員數(shù)據(jù)為數(shù)組的構(gòu)造函數(shù)成員數(shù)據(jù)為數(shù)組的構(gòu)造函數(shù)(1)成員數(shù)據(jù)為一維數(shù)組。)成員數(shù)據(jù)為一維數(shù)組。例例7-7 定義一個求一維
30、數(shù)組平均值的類定義一個求一維數(shù)組平均值的類Array,具體要求如下,具體要求如下:私有數(shù)據(jù)成員:私有數(shù)據(jù)成員:int a10;/存儲一維數(shù)組存儲一維數(shù)組float average;/一維數(shù)組的平均值一維數(shù)組的平均值公有函數(shù)成員:公有函數(shù)成員:構(gòu)造函數(shù)構(gòu)造函數(shù)Array(int t ,int n):初始化數(shù)據(jù)成員:初始化數(shù)據(jù)成員a;功能函數(shù)功能函數(shù)void f( ):求一維數(shù)組的平均值;:求一維數(shù)組的平均值;功能函數(shù)功能函數(shù)void print( ):輸出數(shù)據(jù)成員。:輸出數(shù)據(jù)成員。類的測試。在主函數(shù)中定義類類的測試。在主函數(shù)中定義類Array的對象的對象arr,并用數(shù)據(jù),并用數(shù)據(jù)1,2,3,4,
31、5,6,7,8,9,10對定義的類進行測試。對定義的類進行測試。編程實現(xiàn)(類的定義)編程實現(xiàn)(類的定義):class Arrayint a10;float average;public:Array(int t ,int n)for(int i=0;in;i+)ai=ti;void f()average=0;/Afor(int i=0;i10;i+)average+=ai; /Baverage/=10;void print()for(int i=0;i10;i+)coutait;cout“naverage=”averagen;程序解讀程序解讀:能否把構(gòu)造函數(shù)的函數(shù)體改為:能否把構(gòu)造函數(shù)的函數(shù)體改
32、為:a=t;能否去掉能否去掉A行或把行或把A行改為:行改為:int average=0;編程實現(xiàn)(主函數(shù),測試類)編程實現(xiàn)(主函數(shù),測試類):void main( )int b10= 1,2,3,4,5,6,7,8,9,10;Array arr(b,10); /Barr.f();/Carr.print(); /D程序解讀:程序解讀:(1)能否不定義數(shù)組)能否不定義數(shù)組b,而把,而把B行改為?行改為?Array arr(1,2,3,4,5,6,7,8,9,10,10);(2)能否直接調(diào)用成員函數(shù),即把)能否直接調(diào)用成員函數(shù),即把C行改為行改為“f();”?(3)能否把)能否把C行和行和D行的位置
33、互換?行的位置互換?(2)成員數(shù)據(jù)為二維數(shù)組。)成員數(shù)據(jù)為二維數(shù)組。二維數(shù)組作類的數(shù)據(jù)成員時,其構(gòu)造函數(shù)與一維數(shù)組相似,所不同的二維數(shù)組作類的數(shù)據(jù)成員時,其構(gòu)造函數(shù)與一維數(shù)組相似,所不同的是:要通過嵌套的循環(huán)初始化數(shù)據(jù)成員。是:要通過嵌套的循環(huán)初始化數(shù)據(jù)成員。(3)數(shù)據(jù)成員為字符數(shù)組。)數(shù)據(jù)成員為字符數(shù)組。字符數(shù)組作數(shù)據(jù)成員,與其他類型數(shù)組的主要區(qū)別表現(xiàn)在:字符數(shù)組作數(shù)據(jù)成員,與其他類型數(shù)組的主要區(qū)別表現(xiàn)在:構(gòu)造函數(shù)中,對數(shù)據(jù)成員的初始化是通過字符拷貝函數(shù)完成的,具體為:構(gòu)造函數(shù)中,對數(shù)據(jù)成員的初始化是通過字符拷貝函數(shù)完成的,具體為: strcpy strcpy(數(shù)據(jù)成員,形參)(數(shù)據(jù)成員,形
34、參);建立對象時,實參既可以是已定義的字符數(shù)組,也可以是一個字符串。建立對象時,實參既可以是已定義的字符數(shù)組,也可以是一個字符串。私有數(shù)據(jù)成員:私有數(shù)據(jù)成員:char s120;/存儲字符串存儲字符串1char s220; /存儲字符串存儲字符串1int result; /比較結(jié)果比較結(jié)果公有函數(shù)成員:公有函數(shù)成員:構(gòu)造函數(shù)構(gòu)造函數(shù)String(char*p1, char*p2):用:用p1初始化初始化s1,用用p2初始化初始化s2 ;功能函數(shù)功能函數(shù)int f( ):求比較結(jié)果;:求比較結(jié)果;功能函數(shù)功能函數(shù)void print( ):輸出字符串。:輸出字符串。類的測試。在主函數(shù)中定義類類的
35、測試。在主函數(shù)中定義類String的對象的對象str,用數(shù)據(jù),用數(shù)據(jù)“abcd”、“abc”對定義的類進行測試,并輸出比較結(jié)果。對定義的類進行測試,并輸出比較結(jié)果。例例6-6 6-6 定義一個比較字符串大小的類定義一個比較字符串大小的類StringString,具體要求如下,具體要求如下: :編程實現(xiàn)編程實現(xiàn):class Stringchar s120;char s220;int result;public:String (char*p1,char*p2)strcpy(s1,p1);strcpy(s2,p2);int f() result=strcmp(s1,s2); return resul
36、t;void print()couts1ns2n; ;void main( )char t = “abcd”;String str(t, “abc”);str.print();coutstr.f()n; (2)建立對象時,注意對象的參數(shù)(實)建立對象時,注意對象的參數(shù)(實參)應與構(gòu)造函數(shù)的參數(shù)(形參)保持一參)應與構(gòu)造函數(shù)的參數(shù)(形參)保持一致,否則不能產(chǎn)生對象;致,否則不能產(chǎn)生對象;(3)注意成員函數(shù)的調(diào)用方式。注意成員函數(shù)的調(diào)用方式。程序解讀:程序解讀:(1)構(gòu)造函數(shù)的參數(shù)能否改為?)構(gòu)造函數(shù)的參數(shù)能否改為? char p1 ,char p26 6、newnew運算符與構(gòu)造函數(shù)運算符與構(gòu)造
37、函數(shù)當類的數(shù)據(jù)成員為指針時當類的數(shù)據(jù)成員為指針時,在構(gòu)造函數(shù)中應先用,在構(gòu)造函數(shù)中應先用new動態(tài)分動態(tài)分配空間,然后再對指針所指空間(動態(tài)空間)賦值。設類配空間,然后再對指針所指空間(動態(tài)空間)賦值。設類A的的數(shù)據(jù)成員為數(shù)據(jù)成員為“int *p;”,以下構(gòu)造函數(shù)都錯誤的:,以下構(gòu)造函數(shù)都錯誤的:A(int *t)p=t;/p表示具有表示具有10個元素的數(shù)組個元素的數(shù)組A(int *t)*p=*t;A(int *t)for(int i=0;i10;i+)pi=ti;A(int *t)p=new int10; p=t; / *p=*t;正確的應為:正確的應為:A(int *t) p=new in
38、t10; for(int i=0;i10;i+)pi=ti; class Stringchar *str;public:String(char *p)if(p)str=new charstrlen(p)+1;strcpy(str,p);else str=0;void print() coutstrn;void main()String s(This is a book.);s.print();例例6-7 6-7 構(gòu)造函數(shù)中用構(gòu)造函數(shù)中用newnew為指針成員初始化。為指針成員初始化。class ARRAYfloat (*p)5;int row;public:ARRAY(float t 5,in
39、t n)row=n; p=new floatrow5;for(int i=0;irow;i+) /Afor(int j=0;j5;j+)pij=tij;void print() for(int i=0;irow;i+) /Bfor(int j=0;j5;j+)coutpijt;coutn;void main() float a45=1,2, ,20; ARRAY arr(a,4);a.print(); 程序解讀程序解讀:能否把能否把A行和行和B行的行的row改成改成n?例例6-8 6-8 指向一維數(shù)組的指針(二維數(shù)組)的初始化:指向一維數(shù)組的指針(二維數(shù)組)的初始化:7 7、對象數(shù)組與構(gòu)造函數(shù)
40、、對象數(shù)組與構(gòu)造函數(shù)當用當用newnew運算符動態(tài)創(chuàng)建對象數(shù)組時,自動多次調(diào)用構(gòu)造函數(shù)運算符動態(tài)創(chuàng)建對象數(shù)組時,自動多次調(diào)用構(gòu)造函數(shù)。如:。如:Point Point * *elemselems = new Point10; = new Point10; /A/A 調(diào)用調(diào)用1010次構(gòu)造函數(shù),產(chǎn)生次構(gòu)造函數(shù),產(chǎn)生1010個對象;個對象;類類PointPoint必須具有缺省的構(gòu)造函數(shù)。必須具有缺省的構(gòu)造函數(shù)。 在定義對象數(shù)組時,可在初始化列表中調(diào)用構(gòu)造函數(shù)對每個在定義對象數(shù)組時,可在初始化列表中調(diào)用構(gòu)造函數(shù)對每個元素進行初始化。元素進行初始化。程序解讀程序解讀:程序中一共產(chǎn)生了幾個對象,調(diào)用了幾
41、次構(gòu)造函數(shù)?程序中一共產(chǎn)生了幾個對象,調(diào)用了幾次構(gòu)造函數(shù)?要在主函數(shù)中,增加要在主函數(shù)中,增加A行的語句,程序應作怎樣的修改?行的語句,程序應作怎樣的修改?8 8、對象成員與構(gòu)造函數(shù)、對象成員與構(gòu)造函數(shù)設有類設有類AA和類和類BB定義如下:定義如下:class AAint x,y; class BBAA a1,a2;float z; 類類BB中含有類中含有類AA的對象的對象a1和和a2,a1和和a2稱為對象成員,含稱為對象成員,含對象成員的類對象成員的類BB的構(gòu)造函數(shù)定義格式為:的構(gòu)造函數(shù)定義格式為:BB:BB(形參表形參表):a1(實參表實參表),a2(實參表實參表)class A int
42、x,y;public:A(int a,int b) x=a;y=b;coutA;void Show()coutxtyn;class B int Length,Width;public: B(int a,int b)Length=a;Width=b;void Show()coutLengthtWidthn; ; class C int r,High;B b1; A a1; public:C(int a,int b,int c,int d,int e,int f):a1(e,f),b1(c,d)r=a; High=b; coutC;void Show()coutrtHighn;a1.Show();
43、 b1.Show(); ;void main(void)C c1(25,35,45,55,65,100); c1.Show(); 對象調(diào)用語句決定對象成員的值對象調(diào)用語句決定對象成員的值對象說明順序決定構(gòu)造函數(shù)調(diào)用順序?qū)ο笳f明順序決定構(gòu)造函數(shù)調(diào)用順序例例6-9 6-9 初始化對象成員。初始化對象成員。2022-5-29設有類設有類A A定義如下:定義如下: class A int x; public: A(int a) x=a; ;能否建立如下的對象?能否建立如下的對象?void main() A a1, a2 =5; 不能建立對象不能建立對象a1,因為類,因為類A中沒有缺省的構(gòu)造函數(shù);但能中
44、沒有缺省的構(gòu)造函數(shù);但能建立對象建立對象a2。產(chǎn)生。產(chǎn)生a2的語句等同于的語句等同于“A a2 (5); ”,即以參數(shù),即以參數(shù)5調(diào)調(diào)用構(gòu)造函數(shù)產(chǎn)生對象。此時,構(gòu)造函數(shù)的功能相當于把用構(gòu)造函數(shù)產(chǎn)生對象。此時,構(gòu)造函數(shù)的功能相當于把5轉(zhuǎn)換轉(zhuǎn)換成了對象,賦值給成了對象,賦值給a2。所以,又稱為。所以,又稱為類型轉(zhuǎn)換構(gòu)造函數(shù)類型轉(zhuǎn)換構(gòu)造函數(shù)。建立對象時,可以用一個同類型的對象對其初始化,這建立對象時,可以用一個同類型的對象對其初始化,這是通過拷貝功能的構(gòu)造函數(shù)來完成的。是通過拷貝功能的構(gòu)造函數(shù)來完成的。1 1、拷貝功能構(gòu)造函數(shù)的使用。其格式有兩種:、拷貝功能構(gòu)造函數(shù)的使用。其格式有兩種:類類類型類型
45、 新對象新對象= =已建立的對象;已建立的對象; 類類類型類型 新對象(已建立的對象);新對象(已建立的對象);2 2、拷貝功能構(gòu)造、拷貝功能構(gòu)造函數(shù)定義。定義函數(shù)定義。定義格式為:格式為:類名類名: :類名類名( (類名類名 & &對象名對象名) ) 函數(shù)體函數(shù)體 3 3、拷貝功能構(gòu)造函數(shù)通常不需要定義,但在以下情況下必須、拷貝功能構(gòu)造函數(shù)通常不需要定義,但在以下情況下必須重新定義:重新定義:(1 1)只把已建立對象的部分成員賦給新建對象;)只把已建立對象的部分成員賦給新建對象;(2 2)數(shù)據(jù)成員含有指針,并使用了動態(tài)內(nèi)存。)數(shù)據(jù)成員含有指針,并使用了動態(tài)內(nèi)存。class A
46、int size,*p;public:A(int n,int t ) size=n; p=new intsize;for(int k=0;ksize;k+)pk=tk; A(A &t) size=t.size; p=new intsize;for(int k=0;ksize;k+)pk=t.pk; void print() for(int k=0;ksize;k+)coutpkt; coutn;void main()int a10=1,2,10;A a1(10,a),a2(a1);a1.print(); a2.print();程序解讀程序解讀: (1)程序的執(zhí)行過程怎樣?)程序的執(zhí)行過
47、程怎樣?(2)若不定義完成拷貝功能的構(gòu))若不定義完成拷貝功能的構(gòu)造函數(shù),程序又怎執(zhí)行造函數(shù),程序又怎執(zhí)行? 寫出下列程序的運行結(jié)果。寫出下列程序的運行結(jié)果。class A public:A(int x=0)cout1t;A(A&t)cout2t;void main()A a1,a2(2),a3=3;coutn;A a4=A(4),a5=a1,a6(a1);coutn;a2=a1; a3=A(0);/Acoutn;運行結(jié)果運行結(jié)果: 11112221程序解讀程序解讀: (1)對象)對象a4是怎樣建立的?是怎樣建立的? 能否寫成:能否寫成: A a4(A(4);(2)程序執(zhí)行)程序執(zhí)行A行
48、的輸出結(jié)果是什么?行的輸出結(jié)果是什么?VC+VC+系統(tǒng)定義了一個系統(tǒng)定義了一個thisthis指針,它指向當前對象(正在使指針,它指向當前對象(正在使用的對象)。也就是說,在類的非靜態(tài)成員函數(shù)中,使用的成用的對象)。也就是說,在類的非靜態(tài)成員函數(shù)中,使用的成員是員是thisthis指針所指的成員。在后面介紹的靜態(tài)成員函數(shù)和非成指針所指的成員。在后面介紹的靜態(tài)成員函數(shù)和非成員函數(shù)沒有員函數(shù)沒有thisthis指針。指針。this指針通常是隱含使用的,即:指針通常是隱含使用的,即:void print()coutxtyn; 就是:就是: void print()coutxt yx=x; this-
49、y=y; 定義一個對象時,定義一個對象時,VC+VC+自動調(diào)用構(gòu)造函數(shù)建立自動調(diào)用構(gòu)造函數(shù)建立該對象并進行初始化,當一個對象的生命周期結(jié)束該對象并進行初始化,當一個對象的生命周期結(jié)束時,時,VC+VC+也會自動調(diào)用一個特殊的成員函數(shù)釋放該也會自動調(diào)用一個特殊的成員函數(shù)釋放該對象所占用的內(nèi)存空間,這個函數(shù)即為析構(gòu)函數(shù)。對象所占用的內(nèi)存空間,這個函數(shù)即為析構(gòu)函數(shù)。析構(gòu)函數(shù)的定義格式:析構(gòu)函數(shù)的定義格式: 類名類名:類名()類名() 函數(shù)體函數(shù)體 有關(guān)析構(gòu)函數(shù)定義的幾點說明:有關(guān)析構(gòu)函數(shù)定義的幾點說明:(1)析構(gòu)函數(shù)可在類內(nèi)定義,也可在類外定義。)析構(gòu)函數(shù)可在類內(nèi)定義,也可在類外定義。(2)析構(gòu)函數(shù)
50、名與類名相同,但在前面加上字符)析構(gòu)函數(shù)名與類名相同,但在前面加上字符,如:,如: Point() (3)析構(gòu)函數(shù)無函數(shù)類型,不帶任何參數(shù),且無返回值。)析構(gòu)函數(shù)無函數(shù)類型,不帶任何參數(shù),且無返回值。(4)析構(gòu)函數(shù)不可以重載,每個類只有一個析構(gòu)函數(shù)。)析構(gòu)函數(shù)不可以重載,每個類只有一個析構(gòu)函數(shù)。(5)不定義析構(gòu)函數(shù)時,系統(tǒng)自動產(chǎn)生一個缺省析構(gòu)函數(shù),)不定義析構(gòu)函數(shù)時,系統(tǒng)自動產(chǎn)生一個缺省析構(gòu)函數(shù), 如下所示:如下所示: 類名類名:類名()類名() 該析構(gòu)函數(shù)不完成任何的具體工作。該析構(gòu)函數(shù)不完成任何的具體工作。通常情況下,析構(gòu)函數(shù)無須定義,也無須調(diào)用,由系統(tǒng)自通常情況下,析構(gòu)函數(shù)無須定義,也無
51、須調(diào)用,由系統(tǒng)自動產(chǎn)生,自動調(diào)用。動產(chǎn)生,自動調(diào)用。但在構(gòu)造函數(shù)或程序的執(zhí)行過程中,用但在構(gòu)造函數(shù)或程序的執(zhí)行過程中,用newnew運算符為對象的運算符為對象的指針成員申請了空間動態(tài)時,由于動態(tài)空間是無法自動釋指針成員申請了空間動態(tài)時,由于動態(tài)空間是無法自動釋放的,在類中必須顯式定義析構(gòu)函數(shù),并在析構(gòu)函數(shù)中使放的,在類中必須顯式定義析構(gòu)函數(shù),并在析構(gòu)函數(shù)中使用用deletedelete運算符收回為指針成員所分配的存儲空間。運算符收回為指針成員所分配的存儲空間。 class Stringchar *str;public:String(char *p)if(p)str=(char *)new ch
52、arstrlen(p)+1;strcpy(str,p);else str=0;void print() coutstrn; String() if(str)delete str; /A;void main() String pp(“VC+程序設計程序設計”);pp.print();程序解讀程序解讀: 能否省略能否省略A行的行的“ ”? 例例6-10 6-10 在析構(gòu)函數(shù)中釋放動態(tài)空間。在析構(gòu)函數(shù)中釋放動態(tài)空間。 class Objint val;public:Obj()Obj(int i)val=i;coutvalt“構(gòu)造構(gòu)造1!n”;Obj()cout“析構(gòu)析構(gòu)1!n”;class Conint data; Obj one,two;public:Con(int i,int j,int k): one(k),two(i+j) data=i;coutdatat“構(gòu)造構(gòu)造2!n”;Con()cout“析構(gòu)析構(gòu)2!n;void main(void)Con c(100,200,400); 程序運行結(jié)果程序運行結(jié)果:400構(gòu)造構(gòu)造1!300構(gòu)造構(gòu)造1!100構(gòu)造構(gòu)造2!析構(gòu)析構(gòu)2!析構(gòu)析構(gòu)1!析構(gòu)析構(gòu)1!構(gòu)造構(gòu)造函數(shù)根據(jù)產(chǎn)生對象的順序依次調(diào)用,函數(shù)根據(jù)產(chǎn)生對象的順序依次調(diào)用,析構(gòu)函數(shù)的調(diào)用順序通常與析構(gòu)函數(shù)的調(diào)用順序通常與構(gòu)造構(gòu)造函數(shù)相反函數(shù)相反。例例6-11 6-11 構(gòu)造
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 抓鴨子美術(shù)課件
- NEWAPP系統(tǒng)應急處理與備份演練培訓10
- 第九章 勞動關(guān)系管理
- 農(nóng)商行貸前調(diào)查培訓
- 教培行業(yè)的痛點
- 統(tǒng)編版2024~2025學年度六年級語文第二學期期中測試卷(有答案)
- 幼兒園安全不推擠
- 第五單元小數(shù)的初步認識評估檢測題( A 卷)單元測試(無答案)三年級下冊數(shù)學西師大版
- 放假安全教育宣傳
- 凝血四項操作規(guī)程
- 思想道德與法治課件:第六章 第一節(jié) 社會主義法律的特征和運行
- 有限空間作業(yè)及應急物資清單
- 《個人信息保護法》解讀
- 廣西河池市隆友鋅銀鉛銻礦區(qū)
- 新疆高速公路建設工程季節(jié)性施工方案
- 新版(七步法案例)PFMEA
- 《水泵房巡查流程》word版
- 電力時間同步監(jiān)測系統(tǒng)V20
- 關(guān)于吳姓的歷史和現(xiàn)狀的研究報告
- 煙道廢氣監(jiān)測孔和操作平臺要求
- 個體工商戶誠信承諾書
評論
0/150
提交評論