版權(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ì)2類和對(duì)象面向?qū)ο蟪绦蛟O(shè)計(jì)類與對(duì)象概述類類的聲明類的定義對(duì)象對(duì)象的聲明與成員訪問(wèn)實(shí)例化對(duì)象對(duì)象的存儲(chǔ)this指針*類和對(duì)象的簡(jiǎn)單應(yīng)用舉例提綱面向過(guò)程 VS. 面向?qū)ο蟪绦蛟O(shè)計(jì)面向過(guò)程程序設(shè)計(jì)研究過(guò)程是一種數(shù)學(xué)思維或計(jì)算機(jī)思維方法,與人們認(rèn)識(shí)世界的方法不同。主要是理解算法的處理思想和過(guò)程。面向?qū)ο蟪绦蛟O(shè)計(jì)研究對(duì)象是建立在認(rèn)識(shí)方法學(xué)基礎(chǔ)上的一項(xiàng)技術(shù)科學(xué),比較自然地模擬了人類認(rèn)識(shí)客觀世界的方式;主要是理解“構(gòu)件或組件”及其“組裝”的思想和過(guò)程。面向過(guò)程程序設(shè)計(jì)傳統(tǒng)的程序設(shè)計(jì)方法-面向過(guò)程程序設(shè)計(jì)的步驟為:對(duì)具體應(yīng)用問(wèn)題進(jìn)行詳細(xì)的功能分析,然后將問(wèn)題分解成若干個(gè)可實(shí)現(xiàn)的功能模塊;根據(jù)功能塊
2、的功能來(lái)設(shè)計(jì)一系列與功能相適宜的數(shù)據(jù),即設(shè)計(jì)“數(shù)據(jù)結(jié)構(gòu)”; 編寫(xiě)一些過(guò)程或函數(shù)實(shí)現(xiàn)對(duì)這些數(shù)據(jù)所進(jìn)行的操作; 最終的應(yīng)用程序就是由這些過(guò)程或函數(shù)以及數(shù)據(jù)結(jié)構(gòu)所組成。 下面,我們舉一個(gè)實(shí)例來(lái)進(jìn)一步討論面向過(guò)程的程序設(shè)計(jì)方法??紤]一個(gè)銀行系統(tǒng)。該系統(tǒng)允許顧客開(kāi)設(shè)不同類型的銀行賬戶,其中包括現(xiàn)金賬戶、支票賬戶和貸款賬戶,同時(shí)允許顧客存款、取款和轉(zhuǎn)賬。 根據(jù)面向過(guò)程的思想,首先將銀行系統(tǒng)進(jìn)行功能分析,然后分解成三個(gè)模塊分別負(fù)責(zé)存款、取款和轉(zhuǎn)賬三項(xiàng)工作。假設(shè)這三個(gè)過(guò)程是 MakeDeposit、WithDraw和Transfer。 第二步就是對(duì)客戶建立一個(gè)數(shù)據(jù)結(jié)構(gòu): struct account char
3、 name; /*姓名*/ unsigned long accounted; / *賬號(hào)* / float balance; / *余額* / float interestYTD; /*年利息* / char accountType; /*賬戶類型(現(xiàn)金、支票和貸款) * /; 第三步就是對(duì)所需要的操作進(jìn)行代碼編制。void MakeDeposit( float amount) float WithDraw(float amount) void Transfer(float amount , unsigned long BankAccount) 面向過(guò)程程序設(shè)計(jì)的特點(diǎn): 顯著特點(diǎn)是數(shù)據(jù)結(jié)構(gòu)和數(shù)
4、據(jù)處理過(guò)程處于分離狀態(tài),這會(huì)帶來(lái)很多弊?。阂?、和現(xiàn)實(shí)需求不吻合: 任何一個(gè)現(xiàn)實(shí)實(shí)體(對(duì)象)應(yīng)該都具有自己的職能,比如飛機(jī)可以飛行,銀行可以存款、取款;食堂應(yīng)該可以賣飯等,而這些功能與具體的客觀實(shí)體(對(duì)象)是密不可分的。 面向過(guò)程的程序設(shè)計(jì)方法就將對(duì)象分成了兩部分:一部分就是“數(shù)據(jù)”,表示了一個(gè)對(duì)象的屬性;另外一部分就是“過(guò)程或函數(shù)”,表示了對(duì)象具有的功能。這種分離顯然會(huì)帶來(lái)許多的弊病。比如:顧客與他們的銀行帳戶沒(méi)有一定的聯(lián)系。因?yàn)榇藭r(shí)顧客對(duì)計(jì)算機(jī)來(lái)說(shuō),只不過(guò)是一串字符或數(shù)字,它根本不知道那個(gè)數(shù)字代表銀行帳戶,更不用說(shuō)哪個(gè)帳戶是誰(shuí)的,帳戶的內(nèi)容是什么。這顯然和實(shí)際的情況不符合的。 這說(shuō)明面向過(guò)程
5、程序設(shè)計(jì)中,無(wú)論是飛機(jī)或銀行 在計(jì)算機(jī)中都是一些類似的數(shù)字,即一個(gè)對(duì)象進(jìn)入計(jì)算機(jī)后全部程序員無(wú)條件的分解成一堆數(shù)據(jù),然后通過(guò)程序員編制的一個(gè)叫“程序”的東西進(jìn)行重建恢復(fù)。另外考慮數(shù)據(jù)結(jié)構(gòu)發(fā)生改變會(huì)產(chǎn)生什么樣的結(jié)果: 比如Account_type數(shù)據(jù)項(xiàng),原來(lái)只有現(xiàn)金、支票和貸款三種取值,程序只能識(shí)別這三種取值。由于帳戶類型的不同,編寫(xiě)存款等過(guò)程時(shí),將以不同的操作代碼與之對(duì)應(yīng),即對(duì)于現(xiàn)金、支票和貸款這三種不同類型的帳戶,其取款過(guò)程都是不同的。 如果要增加一種帳戶類型“退休帳戶”,原來(lái)的程序肯定會(huì)出錯(cuò)。因?yàn)樵瓉?lái)的程序只考慮了以上三種帳戶的情況,也就是說(shuō)每增加一種類型的帳戶就必須修改重新修改程序代碼,
6、可見(jiàn)其維護(hù)成本是相當(dāng)大的。 以上簡(jiǎn)單地分析了面向過(guò)程在程序的直觀性和維護(hù)性方面的缺陷。 面向過(guò)程程序設(shè)計(jì)方法,把問(wèn)題被著作一系列將被完成的任務(wù),如讀、計(jì)算和打印等,許多函數(shù)用于完成這些任務(wù)。問(wèn)題的焦點(diǎn)集中于函數(shù)。下圖顯示了一個(gè)典型的面向過(guò)程的程序結(jié)構(gòu)。下圖顯示了一個(gè)典型的面向過(guò)程的程序結(jié)構(gòu)面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)方法的主要出發(fā)點(diǎn)是把數(shù)據(jù)看作程序開(kāi)發(fā)中的基本元素,并且不允許它在系統(tǒng)中自由流動(dòng),將數(shù)據(jù)和操作這些數(shù)據(jù)的函數(shù)緊緊結(jié)合在 一起。面向?qū)ο蟪绦蛟O(shè)計(jì)是將應(yīng)用問(wèn)題分解為一系列客觀實(shí)體(對(duì)象),然后圍繞這些對(duì)象建立數(shù)據(jù)和函數(shù),如圖所示。一個(gè)對(duì)象的數(shù)據(jù)不能訪問(wèn)其他對(duì)象的函數(shù),而一個(gè)對(duì)象的函數(shù)
7、可以訪問(wèn)其他對(duì)象的函數(shù)。面向?qū)ο蟪绦蛟O(shè)計(jì)的一些顯著特性包括以下幾個(gè)方面: 程序設(shè)許的重點(diǎn)在于數(shù)據(jù)而不是過(guò)程;程序被劃分為所謂的對(duì)象;數(shù)據(jù)結(jié)構(gòu)為表現(xiàn)對(duì)象的特性而設(shè)計(jì); 函數(shù)作為對(duì)某個(gè)對(duì)象數(shù)據(jù)的操作,與數(shù)據(jù)結(jié)構(gòu)緊密地結(jié)合在一起;數(shù)據(jù)被隱藏起來(lái),不能被外部函數(shù)訪問(wèn); 對(duì)象之間可以通過(guò)函數(shù)溝通。 (4)對(duì)象的行為會(huì)改變對(duì)象的狀態(tài)。 例如: 玩耍 疲勞=True 睡覺(jué) 疲勞=False 吃食 饑餓=False(5)對(duì)象的狀態(tài)會(huì)影響對(duì)象的行為。例如: if( 饑餓 = False) 吃食 return failure對(duì)象(1)對(duì)象就是我們周圍的各種各樣的事物。例如: 衣服、盤(pán)子、寵物、朋友、電腦等。(2)
8、每個(gè)對(duì)象都有一些狀態(tài)(屬性)。例如:衣服:顏色,長(zhǎng)度,面料。貓: 名字,情緒,饑餓,。(3)有些對(duì)象會(huì)作出一些行為。例如:貓: 情緒,疲勞,饑餓 發(fā)怒,玩耍,吃食,睡覺(jué)。 面向?qū)ο蟮某绦蛟O(shè)計(jì)與我們?nèi)祟愑^察客觀事物的模式相同: 用類表示客觀事物, 用類中的變量表示事物的屬性, 用函數(shù)表示事物的行為, 屬性與行為相互作用。1、關(guān)于“大學(xué)生”的有關(guān)說(shuō)明 (1)描述學(xué)生特征的信息(屬性): 姓名,學(xué)號(hào),專業(yè),年齡,性別 (2)描述行為的信息(函數(shù)): 一個(gè)學(xué)生主要是學(xué)習(xí),而學(xué)習(xí)主要的行為就是: 讀;寫(xiě) 對(duì)于讀,要指明讀的什么書(shū),讀書(shū)所獲得的內(nèi)容是什么?但這里不能用一具體的書(shū)名 對(duì)于寫(xiě),要指明做的什么作
9、業(yè),所完成的具體內(nèi)容是什么?但不能用具體的課程名稱. 通過(guò)以上兩方面,就較準(zhǔn)確的描述大學(xué)生的有關(guān)信息,可以說(shuō),這種描述使用于所有的大學(xué)生,實(shí)際上就是說(shuō)明了一類人員大學(xué)生。為此,我們可以給出“大學(xué)生類”的一個(gè)“規(guī)范”的描述形式: class students private: string XM; int XH; string ZY; int NL; string XB; public: string read(String SM); string write(String KCMC); students(String x,int y,String z,int a, String b); /用于
10、創(chuàng)建一個(gè)學(xué)生(構(gòu)造函數(shù)) (3)對(duì)于下面的兩個(gè)問(wèn)題如何來(lái)描述呢? 張三正在讀英語(yǔ); 李四正在做數(shù)學(xué)作業(yè);在這里,張三和李四必須是學(xué)生,我們用A代表張三,B代表李四(張三和李四的具體信息應(yīng)清楚:學(xué)號(hào),專業(yè)、年齡、性別是什么?),english代表英語(yǔ),maths代表數(shù)學(xué),那么:從邁向struct TComplex double real; double imag;void Init( double r, double i);void Tstorage_Init( TStorage *p );void Tstorage_Clear( Tstorage *p );例2.1 struct TCompl
11、ex double real; /復(fù)數(shù)的實(shí)部 double imag; /復(fù)數(shù)的虛部 void Init(double r,double i) /給real和imag賦初值 real=r; imag=i; double RealComplex( ) /求復(fù)數(shù)的實(shí)部值 return real; double ImagComplex() /求復(fù)數(shù)的虛部值 return imag; ;為了訪問(wèn)這些成員函數(shù),必須定義該結(jié)構(gòu)類型的變量,然后像訪問(wèn)結(jié)構(gòu)中的數(shù)據(jù)成員一樣進(jìn)行訪問(wèn)。#include #include Using namespace std;void main( ) Tcomplex A; A.
12、init (1.1,2.2); coutreal of complex A=A.realcomplex()endl; coutimag of complex A=A.imagcomplex()endl;“類”是對(duì)具有共同的屬性特征和行為特征的對(duì)象的概括和抽象因此類和對(duì)象的關(guān)系是抽象和具體的關(guān)系,類是由多個(gè)對(duì)象進(jìn)行綜合抽象的結(jié)果,對(duì)象又是類的個(gè)體實(shí)物。 從面向?qū)ο蟪绦蛟O(shè)計(jì)的觀點(diǎn)看,一個(gè)對(duì)象是由描述其屬性的數(shù)據(jù)和定義在其上面的一組操作組成的實(shí)體,是數(shù)據(jù)單元和函數(shù)單元的組合體;類是對(duì)一組對(duì)象的概括和抽象,這組對(duì)象具有相同的屬性結(jié)構(gòu)和操作行為,類的定義中一定要說(shuō)明這些屬性結(jié)構(gòu)和操作行為。 C+對(duì)C的改
13、進(jìn),最重要的就是增加了“類”這樣一種數(shù)據(jù)類型。類(class)不但是C+最重要的特征,也是C+的精華,它可以將一個(gè)數(shù)據(jù)結(jié)構(gòu)與一個(gè)操作緊密地結(jié)合起來(lái)。 C+中聲明一個(gè)“類”類型,其方法和聲明一個(gè)結(jié)構(gòu)體類型是相似的。2.2.1 結(jié)構(gòu)體與類 結(jié)構(gòu)體是C語(yǔ)言的一種自定義的數(shù)據(jù)類型,在結(jié)構(gòu)體中可以含有各種不同類型的成員。C+語(yǔ)言對(duì)結(jié)構(gòu)類型進(jìn)行了擴(kuò)充,它不僅可以含有不同類型的成員,而且還可以含有函數(shù)。例如下面聲明的的結(jié)構(gòu)體:在C+中,一個(gè)結(jié)構(gòu)的成員(包括數(shù)據(jù)和函數(shù))通常分為兩類:私有成員(private)和公有成員(public)。私有成員只能被該結(jié)構(gòu)中的其它成員訪問(wèn),公有成員既可被結(jié)構(gòu)內(nèi)其它成員訪問(wèn),也
14、可被結(jié)構(gòu)外的其它部分訪問(wèn)。1 類的定義格式:class 類名public : 成員數(shù)據(jù); 成員函數(shù); protected:成員數(shù)據(jù);成員函數(shù);private : 成員數(shù)據(jù); 成員函數(shù);;關(guān)鍵字類名私有公有保護(hù)class Student public : float average; void SetName(char *name); void SetMath(float math); float GetAverage(void); void SetChinese(float ch);private : char Name20; float Math; float Chinese;分號(hào)不能少類的
15、成員:成員函數(shù)、成員數(shù)據(jù)class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour, Minute, Second;成員數(shù)據(jù)成員函數(shù)成員函數(shù)外部實(shí)現(xiàn)void Clock:SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS;void Clock:ShowTime() coutHour:Minute: char szName5 如果szName 不是私有,需要修改全部
16、: strcpy( man1.szName, “Tom123” );如果將szName變?yōu)樗接? 所有對(duì)szName的訪問(wèn)都是通過(guò)成員函數(shù)來(lái)進(jìn)行, man1.SetName( “Tom123” );類成員訪問(wèn)控制表訪問(wèn)控制含義屬 性public公有成員類的外部接口protected保護(hù)成員僅允許本類成員函數(shù)及派生類成員函數(shù)訪問(wèn)private私有成員僅允許本類成員函數(shù)訪問(wèn)實(shí)際上,在C+中,類class和結(jié)構(gòu)struct是類似的,它們的主要區(qū)別是缺省值不同:在類中,缺省時(shí)成員是私有的;而在結(jié)構(gòu)中,缺省時(shí)成員是公有的。數(shù)據(jù)成員可以是任何數(shù)據(jù)類型,但是不能用自動(dòng)(auto)、寄存器(register)
17、或外部(extern)進(jìn)行說(shuō)明。不能在類的聲明中給數(shù)據(jù)成員賦初值。例如: class abc private: char a=q; int b=33; public: /錯(cuò)誤/錯(cuò)誤成員函數(shù)的實(shí)現(xiàn)兩種實(shí)現(xiàn)方式:成員函數(shù)的類外實(shí)現(xiàn)內(nèi)聯(lián)成員函數(shù)在類體外定義成員函數(shù)的格式:void A:Setxy(float a,float b) x=a; y=b; 函數(shù)類型類名函數(shù)名形參列表函數(shù)體返回值類型 類名:成員函數(shù)名(參數(shù)表) 函數(shù)體 class A private: float x, y; public: void Setxy(float a,float b); void Print(void);;/類定
18、義, Point.hclass Point public: void InitPoint(float PointA_x=0, float PointA_y=0); void Move(float New_x, float New_y); float GetPointx(); float GetPointy();private: float P1_x,P1_y;/成員函數(shù)的類外實(shí)現(xiàn),point.cpp void Point:InitPoint(float PointA_x, float PointA_y) P1_x=PointA_x; P1_y=PointA_y; void Point:Move
19、(float New_x, float New_y) P1_x+=New_x; P1_y+=New_y; float Point:GetPointx() return P1_x; float Point:GetPointy() return P1_y; 函數(shù)的實(shí)現(xiàn)函數(shù)聲明成員函數(shù)的類外實(shí)現(xiàn):內(nèi)聯(lián)函數(shù)為什么要內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)的定義形式內(nèi)聯(lián)函數(shù)注意事項(xiàng)內(nèi)聯(lián)函數(shù)-為什么要內(nèi)聯(lián)函數(shù)例:int min( int v1, int v2 ) return ( v1 v2 ? v1:v2 );使用這個(gè)函數(shù)有什么好處?使用這個(gè)函數(shù)有什么缺點(diǎn)??jī)?nèi)聯(lián)函數(shù)-為什么要內(nèi)聯(lián)函數(shù)C語(yǔ)言中的宏定義#define MIN(a,
20、 b) (a)=b ? 0 : 1if( FLOOR(a&0 x0f, 0 x07) ) /宏展開(kāi):if( a&0 x0f=0 x07?0:1 )宏在類內(nèi)class X int i; public:#define VAL(x:i) /Error內(nèi)聯(lián)函數(shù)的定義形式非類的函數(shù)inline int plusone( int x ) return +x; 類的成員函數(shù)在類體中,直接給出函數(shù)定義在類外時(shí),使用inline關(guān)鍵字內(nèi)聯(lián)函數(shù)舉例(一)class Point public: void Init(int initX,int initY) X=initX; Y=initY; int GetX() r
21、eturn X; int GetY() return Y; private: int X,Y;函數(shù)在聲明的同時(shí),給出實(shí)現(xiàn)內(nèi)聯(lián)成員函數(shù)舉例(二)class Point public: void Init(int initX,int initY); int GetX(); int GetY(); private: int X,Y;只聲明函數(shù)inline void Point: Init(int initX,int initY) X=initX; Y=initY;inline int Point:GetX() return X;inline int Point:GetY() return Y;50在
22、類外實(shí)現(xiàn),但需要添加關(guān)鍵字“inline”,表示是內(nèi)聯(lián)函數(shù)class Point public: void InitPoint(float PointA_x=0, float PointA_y=0) P1_x=PointA_x; P1_y=PointA_y; void Move(float New_x, float New_y) P1_x+=New_x; P1_y+=New_y; float GetPointx() return P1_x; float GetPointy() return P1_y; private: float P1_x,P1_y;函數(shù)在聲明的同時(shí),給出實(shí)現(xiàn)內(nèi)聯(lián)函數(shù)-注意事
23、項(xiàng)沒(méi)有在類體中定義的內(nèi)聯(lián)成員函數(shù)必須被定義在類定義出現(xiàn)的頭文件中。對(duì)于較簡(jiǎn)單的函數(shù)可以聲明為內(nèi)聯(lián)形式。內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語(yǔ)句和switch語(yǔ)句)。對(duì)象對(duì)象的定義聲明類的同時(shí),直接定義對(duì)象例如: class CPoint private: int x, y; public: void SetXY( int, int ); int GetX(); int GetY(); op1,op2;CPoint op1,op2; 類中成員的訪問(wèn)方式類中成員互訪直接使用成員名類外訪問(wèn): 訪問(wèn) public 屬性的成員,有3種方法通過(guò)對(duì)象名和成員運(yùn)算符(“.”)訪問(wèn)對(duì)象中的成員通過(guò)指向?qū)ο蟮闹羔樤L
24、問(wèn)對(duì)象中的成員通過(guò)對(duì)象的引用來(lái)訪問(wèn)對(duì)象中的成員 外部訪問(wèn) private 屬性的成員,有2種方法 1、通過(guò)公有成員函數(shù)為私有成員賦值 2、友元函數(shù)訪問(wèn) public 屬性的成員,有3種方法:通過(guò)對(duì)象名和成員運(yùn)算符(“.”)訪問(wèn)對(duì)象中的成員:A.x;通過(guò)指向?qū)ο蟮闹羔樤L問(wèn)對(duì)象中的成員: p-x;通過(guò)對(duì)象的引用來(lái)訪問(wèn)對(duì)象中的成員 B.x;回憶結(jié)構(gòu)體成員訪問(wèn)方式(1)通過(guò)對(duì)象名和成員運(yùn)算符訪問(wèn)對(duì)象中的成員void main() CPoint p1; p1. Init(8,100); coutp1. GetX()p1.GetY();圓點(diǎn)訪問(wèn)形式:對(duì)象名.公有成員class CPoint public:
25、 void Init(int a,int b) X=a; Y=b; int GetX() return X; int GetY() return Y; private: int X,Y;p1.GetX()實(shí)際上是一種縮寫(xiě)形式,它表達(dá)的意義是p1.Point:GetX(),這兩種表達(dá)式是等價(jià)的。用成員選擇運(yùn)算符“.”只能訪問(wèn)對(duì)象的公有成員,而不能訪問(wèn)對(duì)象的私有成員或保護(hù)成員。 若要訪問(wèn)對(duì)象的私有的數(shù)據(jù)成員,只能通過(guò)對(duì)象的公有成員函數(shù)來(lái)獲取。 class A float x,y;public: float m,n; void Setxy( float a, float b ) x=a; y=b;
26、void Print(void) coutxtyendl; ;void main(void) A a1,a2; a1.m=10; a1.n=20;/為公有成員數(shù)據(jù)賦值 a1.x=2; a1.y=5; a1.Setxy(2.0,5.0); a1.Print();必須通過(guò)類內(nèi)公有函數(shù)訪問(wèn)私有數(shù)據(jù)成員非法,私有成員不能在類外訪問(wèn)class Timepublic: int hour; int minute;void main() Time t,*p; p=&t; couthour;指針訪問(wèn)形式: 對(duì)象指針變量名-公有成員class A private: float x,y; public:float
27、Sum(void) return x+y; void Set(float a,float b) x=a;y=b; void Print(void) coutx=xty=ySet(2.0, 3.0); /通過(guò)指針引用對(duì)象的成員函數(shù) p-Print(); coutSum()endl; a2.Set(10.0, 20.0); a2.Print();Setxy()Getxy()Printxy()xy2.03.0pa1定義類的數(shù)組及數(shù)組中元素的引用void main(void)Stu stu3;/定義類的數(shù)組Stu *pstu;/定義類的指針pstu=stu;/為指針賦值int i;stu0.SetSt
28、udent (“A”,90,90); /通過(guò)數(shù)組元素的引用賦值stu1.SetStudent (B,80,80);stu2.SetStudent (C,70,70);for(i=0;iShow (); /指針變量指向數(shù)組元素pstu+; /指針變量加一,指向下一元素stupstupstu3 通過(guò)對(duì)象的引用來(lái)訪問(wèn)對(duì)象中的成員class Timepublic: int hour; int minute;void main() Time t1; Time &t2=t1; coutt2.hour;由于t1和t2公用一個(gè)空間,因此, t2.hour就是t1.hour引用就是變量的另外一個(gè)名字類的對(duì)象外部
29、如何引用私有數(shù)據(jù)成員1. 通過(guò)公有函數(shù)操作私有成員賦值2. 友元函數(shù)1、通過(guò)公有函數(shù)為私有成員賦值class Test int x , y; public: void Setxy(int a, int b)x=a;y=b; void Printxy(void) coutx=xty=yendl;void main(void) Test p1,p2; p1.Setxy(3, 5); p1.Printxy( );調(diào)用公有函數(shù)為私有對(duì)象賦值對(duì)象的存儲(chǔ)(cont.)對(duì)象1對(duì)象2對(duì)象10. 成員函數(shù)data1data2data10對(duì)象的存儲(chǔ)方式:實(shí)例化對(duì)象:對(duì)象的存儲(chǔ)(cont.)C+中怎么查看對(duì)象所占內(nèi)
30、存空間大???this指針class CPoint public: void Init(int a,int b) X=a; Y=b; int GetX() return X; int GetY() return Y; private: int X,Y;void main() CPoint p1, p2; p1.Init( 2, 3 ); coutp1.GetX()p1.GetY(); p2.Init( -2, -3); coutp2.GetX()p2.GetY();輸出是什么?這些成員函數(shù)是如何區(qū)分操作對(duì)象是p1 和 p2的?對(duì)比結(jié)構(gòu)體struct TPoint int X,Y;void Ini
31、t( TPoint &p, int x, int y ) p.X = x; p.Y = y;void main() TPoint p1, p2; Init( P1, 2, 3 ); coutp1.Xp1.Y; Init( p2, -2, -3); coutp2.XX=a; this-Y=b; int GetX() return this-X; int GetY() return this-Y; private: int X,Y;void main() CPoint p1, p2; p1.Init( 2, 3 ); coutp1.GetX()p1.GetY(); p2.Init( -2, -3)
32、; coutp2.GetX() X=a ; this-Y = b; 在main()函數(shù)中,成員函數(shù)Init(int a, int b)調(diào)用形式 p1.Init ( 2, 3 );this指針C+把類對(duì)象作為參數(shù)傳遞給函數(shù)(傳地址)。this指針this指針 成員函數(shù)所屬對(duì)象的指針。它指向類對(duì)象的地址。它隱含于每個(gè)類的成員函數(shù)中。也就是每個(gè)成員函數(shù)都有一個(gè)this指針。成員函數(shù)訪問(wèn)類中數(shù)據(jù)成員的格式可以寫(xiě)成: this-成員變量this指針舉例class CAint i;public: void Hello() cout“Hello”endl; void Show() coutiHello();
33、 p-Show();編譯會(huì)怎么樣?運(yùn)行會(huì)怎么樣?this 指針何時(shí)使用返回類對(duì)象本身CPoint & CPoint:Show() coutXY; return *this;在拷貝/賦值函數(shù)中,作為對(duì)象判斷void CPoint:copy( const CPoint & obj ) if ( this ! = &obj ) 類的定義應(yīng)用舉例2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(1)問(wèn)題:給出一個(gè)矩形類的定義。分析:通過(guò)抽象分析,找出描述該類的屬性和方法:(1)成員屬性:一提到矩形,首先想到矩形的長(zhǎng)和寬,因而其中成員屬性有:邊的長(zhǎng)度:(實(shí)型數(shù))邊的寬度:(實(shí)型數(shù))如果要關(guān)心矩形的位置,則需要抽象出舉
34、行左上角頂點(diǎn)的坐標(biāo)值,則需要增加下列成員屬性:x坐標(biāo)值: (實(shí)型數(shù))y坐標(biāo)值: (實(shí)型數(shù)) 2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(2)(2)成員方法: 對(duì)于矩形,說(shuō)道計(jì)算問(wèn)題,我們就會(huì)立即想到矩形的周長(zhǎng)、面積,因而成員方法有: 計(jì)算矩形的周長(zhǎng): (計(jì)算的結(jié)果(數(shù)值為實(shí)型),作為函數(shù)值返回)計(jì)算矩形的面積: (計(jì)算的結(jié)果(數(shù)值為實(shí)型),作為函數(shù)值返回)另外: 有時(shí)需要移動(dòng)矩形的位置,按水平和垂直方向移到新的位置; 有時(shí)需要改變矩形的長(zhǎng)度和改變矩形的寬度; 有時(shí)需要得到(獲?。┚匦蔚膶?shí)際長(zhǎng)度值和寬度值; 有時(shí)需要,在顯示器上顯示矩形的屬性值; 需要構(gòu)造方法來(lái)形成矩形(由頂點(diǎn)、長(zhǎng)度、寬度形成矩形)因而
35、需要再有的成員方法:移動(dòng)矩形的位置:(需要水平和垂直方向的移到量)改變矩形的長(zhǎng)度改變矩形的寬度獲取矩形的長(zhǎng)度獲取矩形的寬度顯示矩形的屬性值(4項(xiàng))構(gòu)造方法(需要4個(gè)參數(shù))2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(3)根據(jù)以上的抽象分析,可以給出矩形類定義:class rectangle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (d
36、ouble a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法(4個(gè)參數(shù))每個(gè)函數(shù)是如何實(shí)現(xiàn)的呢?2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(4)根據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectan
37、gle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩
38、形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法(4個(gè)參數(shù) double perimeter() double p; p=(L+W)*2; return p;2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(5)根據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectangle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public:
39、double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法(4個(gè)參數(shù)double
40、area() double s; s=L*W; return s;2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(6)根據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectangle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩
41、形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法(4個(gè)參數(shù) void move (double a,double b) X=X+a; Y=Y+b;2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(7)根據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectangle class rectan
42、gle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩
43、形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法(4個(gè)參數(shù) double getL() return L;2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(8)根據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectangle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周
44、長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法(4個(gè)參數(shù) double getW() return W;2、面向?qū)ο蟮母拍?/p>
45、類的定義應(yīng)用舉例(9)根據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectangle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(do
46、uble a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法(4個(gè)參數(shù) double setL(double a) L=a;2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(10)根據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectangle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, doubl
47、e Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,d
48、ouble d) /構(gòu)造方法(4個(gè)參數(shù)double setW(double a ) W=a;2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(11)根據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectangle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 doub
49、le getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法(4個(gè)參數(shù) void show() cout“矩形所在的位置頂點(diǎn):(“X“,”Y“)”endl; cout“矩形的長(zhǎng)度:”Lendl; cout“矩形的寬度:”wendl;2、面向?qū)ο蟮母拍铑惖亩x應(yīng)用舉例(12)根
50、據(jù)以上的抽象分析,可以給出矩形的JAVA類定義:class rectangle private: double L; /邊的長(zhǎng)度 double W; /邊的寬度 double X; /頂點(diǎn)的坐標(biāo), x坐標(biāo)值, double Y; /頂點(diǎn)的坐標(biāo), y坐標(biāo)值 public: double perimeter() /計(jì)算矩形的周長(zhǎng) double area() /計(jì)算矩形的面積 void move (double a ,double b) /移動(dòng)矩形到新位置 double getL() /獲取矩形的長(zhǎng)度 double getW() /獲取矩形的寬度 double setL(double a ) /改變
51、矩形的長(zhǎng)度為新值 double setW(double a ) /改變矩形的寬度為新值 void show() /顯示矩形的屬性值(4項(xiàng)) rectangle (double a,double b, double c,double d) /構(gòu)造方法 rectangle (double a,double b, double c,double d) X=a; Y=b; L=c; W=d;給出類定義的演示程序:面向?qū)ο蟮母拍?對(duì)象的創(chuàng)建和使用(舉例)例1:類的使用例題(矩形類的應(yīng)用) 利用已定義的”矩形類”,實(shí)現(xiàn)有關(guān)矩形的運(yùn)算求值: (1)定義一個(gè)矩形實(shí)例a,并計(jì)算面積周長(zhǎng); (2)改變?cè)摼匦蔚拈L(zhǎng)度
52、是原來(lái)的2倍,再計(jì)算面積、周長(zhǎng),并顯示有關(guān)信息(包括矩形的長(zhǎng)、寬); (3)移動(dòng)矩形位置,并顯示新位置的坐標(biāo)。 (給出演示過(guò)程)#include” rectangle.h”void main() double A,B; rectangle a(0,0, 10,20); A=a.perimeter(); B=a.area(); cout矩形a的有關(guān)信息如下:“endl; a.show(); cout矩形a的面積:“Bendl; cout矩形a的周長(zhǎng):“Aendl; double C; C=a.getL(); C=2*C; a.setL(C); cout改變后的矩形a的有關(guān)信息如下:“endl;
53、A=a.perimeter(); B=a.area(); cout矩形a的有關(guān)信息如下:“endl; a.show(); cout矩形a的面積:“Bendl; cout矩形a的周長(zhǎng):“Aendl; a.move(20,20); double d,e; d=a.getX(); e=a.getY(); cout矩形a的新坐標(biāo):“endl; cout(“d+,“e)“endl; 類定義練習(xí)題3、面向?qū)ο蟮母拍铑惖亩x應(yīng)用(練習(xí)6-1) 按照上面例題的分析設(shè)計(jì)思想,給出下列兩題的類的設(shè)計(jì): 要求: 先給出抽象分析,找出類的屬性和函數(shù),對(duì)于函數(shù)要注意返回值,參數(shù)等問(wèn)題: (1)給出關(guān)于坐標(biāo)系中的“點(diǎn)”的
54、類定義;1 定義一個(gè)日期類,其中日期由年月日組成,該類支持以下操作(1)判斷是否是閏年 (年被400整除或者被4整除同時(shí)不被100整除)(2)顯示日期 (3 )獲取年月日的值2 定義一個(gè)平面上的圓類(圓心和半徑),該類支持以下操作:(1)獲得圓心和半徑(2)分別計(jì)算圓的周長(zhǎng)、面積(3 )設(shè)置圓心和半徑 (4)輸出圓的有關(guān)信息;再設(shè)計(jì)主函數(shù),定義對(duì)象,完成有關(guān)的輸入計(jì)算輸出3 定義一個(gè)平面上矩形類(矩形的兩個(gè)頂點(diǎn)),該類支持以下操作(1)計(jì)算矩形的周長(zhǎng)和面積(2)讀取、設(shè)置矩形的信息4 定義一個(gè)學(xué)生類,該類封裝以下信息和操作(1)學(xué)生的姓名、學(xué)號(hào)、班級(jí)、籍貫(2)顯示學(xué)生的信息(3 )獲取學(xué)生的各項(xiàng)信息5 定義直線類,該類封裝以下操作: 計(jì)算直線的斜率3、面向?qū)ο蟮母拍铑惖亩x應(yīng)用(練習(xí)6-2)6 定義課程類,該類封裝以下信息(1)課程號(hào),課程名,課程學(xué)分,開(kāi)課學(xué)期(2)讀取、設(shè)置各項(xiàng)信息7 定義三角形類,該類支持以下操作(1)讀取、設(shè)置三角形的
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)新教育空間的色彩創(chuàng)意設(shè)計(jì)
- 企業(yè)內(nèi)部服務(wù)流程優(yōu)化與客戶體驗(yàn)提升
- 企業(yè)辦公效率提升的智能生產(chǎn)策略
- 2025年臨滄考貨運(yùn)資格證考試內(nèi)容
- 企業(yè)團(tuán)隊(duì)建設(shè)中的飲食與健康管理
- 流行病學(xué)題庫(kù)
- 辦公實(shí)驗(yàn)中的團(tuán)隊(duì)協(xié)作與安全規(guī)范
- 創(chuàng)新實(shí)踐教學(xué)在小學(xué)數(shù)學(xué)課堂的應(yīng)用
- 創(chuàng)新型產(chǎn)品在教育市場(chǎng)的成功經(jīng)驗(yàn)
- 利用科技手段提升學(xué)校衛(wèi)生間衛(wèi)生水平有效預(yù)防和控制幽門(mén)螺旋桿菌的傳播
- 部編版歷史九年級(jí)上冊(cè)第六單元 第17課君主立憲制的英國(guó)【課件】y
- 2024年《建筑設(shè)備安裝》復(fù)習(xí)考試題庫(kù)及答案(含各題型)
- 2024政府采購(gòu)評(píng)審專家考試題庫(kù)附含答案
- 2022年內(nèi)蒙古導(dǎo)游資格考試(含各科)題庫(kù)(含答案和必背題)
- 道路清掃環(huán)衛(wèi)報(bào)價(jià)方案
- 第24課《穿井得一人》公開(kāi)課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì) 統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)
- 廣告創(chuàng)意與品牌宣傳考核試卷
- 提高吸入劑使用正確率品管圈成果匯報(bào)
- 《2025年日歷》電子版模板年歷月歷工作學(xué)習(xí)計(jì)劃?rùn)M版 日歷計(jì)劃
- 保安保潔保障人員院感培訓(xùn)
- 會(huì)議接待擺臺(tái)培訓(xùn)
評(píng)論
0/150
提交評(píng)論