C++程序設(shè)計類與對象_第1頁
C++程序設(shè)計類與對象_第2頁
C++程序設(shè)計類與對象_第3頁
C++程序設(shè)計類與對象_第4頁
C++程序設(shè)計類與對象_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++程序設(shè)計類與對象面向?qū)ο蟪绦蛟O(shè)計概述

面向?qū)ο蟮某绦蛟O(shè)計方法,簡稱為OOP,其根本要求是將描述某一類事物的數(shù)據(jù)與處理這些數(shù)據(jù)的函數(shù)都封裝成一個整體,從而到達數(shù)據(jù)隱藏〔保護〕的目的。應(yīng)用程序只有通過這一整體中的函數(shù)才能修改這一整體中的數(shù)據(jù),同樣,數(shù)據(jù)結(jié)構(gòu)的變化,僅影響封裝在一起的函數(shù)。這種將數(shù)據(jù)與處理這些數(shù)據(jù)的函數(shù)封裝成一個整體,就構(gòu)成一個類。類的封裝性是指:使類中的數(shù)據(jù)在類的外部是不可見的,外部只能通過公共接口〔類中的函數(shù)〕與類中數(shù)據(jù)發(fā)生聯(lián)系。類的派生性是指:一個類可以派生出它的子類,子類可以從它的父類中局部或全部地繼承各種函數(shù)和數(shù)據(jù),并增加新的函數(shù)和數(shù)據(jù)。對象是類的一個實例,類是用戶定義的一種類型,具有為類類型的變量稱為對象,也稱為實例。對象是動態(tài)產(chǎn)生和動態(tài)消亡的。一個對象占用計算機內(nèi)存中的一個獨立區(qū)域,用于存放對象的數(shù)據(jù)和函數(shù),這個區(qū)域相對獨立,只有局部于對象中的函數(shù)才可以訪問存放在該對象中的數(shù)據(jù)。

類是對某一事物的抽象描述,它既可包含描述事物的數(shù)據(jù),又可包含處理這些數(shù)據(jù)的函數(shù)。在C++中,我們可以通過類的定義,把描述矩形的結(jié)構(gòu)和處理這個矩形的函數(shù)組合到一個完整的類定義中:classCRectangle{ intleft; inttop; intright; intbottom; voidDrawRectangle(void);};left,top,right,bottom稱為成員變量,而函數(shù)稱為類的成員函數(shù)。由此可見,類中不僅包含了描述構(gòu)造類型的成員變量,而且可以包含用于處理這些成員變量的操作。4.4.1類的定義C++中完整的類定義形式如下:class類名{ private:

私有類成員;

public:

公有類成員;

protected:

保護類成員;};private:限定為類的私有成員,只允許該類中的成員函數(shù)存取私有的成員數(shù)據(jù),對于私有的成員函數(shù),只能被該類中的成員函數(shù)調(diào)用;public:限定為類的公有成員,它不僅允許該類中的成員函數(shù)調(diào)用公有成員數(shù)據(jù),而且允許該類之外的函數(shù)也調(diào)用公有成員數(shù)據(jù),公有成員函數(shù)不僅能被該類的成員函數(shù)調(diào)用,而且能被其他函數(shù)調(diào)用。protected:限定為類的保護成員,允許該類及其派生類的成員函數(shù)調(diào)用成員數(shù)據(jù)或成員函數(shù)。但其他函數(shù)不能存取該類的保護成員數(shù)據(jù),也不能調(diào)用該類的保護成員函數(shù)。例4.1定義描述一個人的類。classperson{ private: charname[12]; intage; charsex[4]; public: voidRegisterPerson(char*,int,char*); voidGetName(char*); intGetAge(void); voidGetSex(char*);};在類person中,把成員數(shù)據(jù)name、age、sex定義為私有成員;四個函數(shù)定義為公有成員:RegisterPerson():用來登錄一個人的姓名、性別和年齡;GetName():用來獲取一個人的姓名;GetAge()和GetSex()獲取人的年齡和性別。

在類體定義中,當省略關(guān)鍵字private時,系統(tǒng)默認為所定義的成員數(shù)據(jù)為私有成員,所以類person還可以有另外的等同寫法。在以上的類定義中,person類中的成員函數(shù)僅給出了函數(shù)原型,并沒有給出成員函數(shù)的定義,在使用這些成員函數(shù)前,必須先給出函數(shù)的定義。在C++中定義成員函數(shù)的一般格式為:函數(shù)類型類名::函數(shù)名〔參數(shù)表〕{……..}其中,運算符“::”稱為作用域分辨符,它指出“函數(shù)名”是屬于“類名”的成員函數(shù)。voidPerson::RegisterPerson(char*newname,intnewage,char*newsex){ strcpy(name,newname); age=newage; strcpy(sex,newsex);}VoidPerson::GetName(char*newname){ strcpy(name,newname); }IntPerson::GetAge(void){ return(age); }VoidPerson::GetSex(char*newsex){ strcpy(sex,newsex); }例4.2定義類person的四個成員函數(shù)類具有封裝性,并且類只是定義了一種結(jié)構(gòu)-模板,所以類中的任何成員數(shù)據(jù)均不能使用關(guān)鍵字extern、auto、register限定其存儲類型。成員函數(shù)可以直接使用類中的任一成員,包括數(shù)據(jù)成員和函數(shù)成員。在定義類時,只是定義了一種導(dǎo)出的數(shù)據(jù)類型,并不為類分配存儲空間,所以在定義類中的數(shù)據(jù)成員時,不能對其初始化。如: classtest{ inttx=5,y=6; externfloatx; …}(4)在定義一個類時,對其成員指定訪問權(quán)限的原那么是:假設(shè)定義的成員限于該類的成員函數(shù)使用時,應(yīng)指定其為私有成員;假設(shè)允許類外使用該成員時,應(yīng)將其訪問權(quán)限定義為公有的。在定義一個類時,須注意以下幾點:

在定義一個類時,其成員函數(shù)的函數(shù)體定義也可以在定義類的類體中直接定義,即在類中直接定義成員函數(shù)—稱為內(nèi)聯(lián)函數(shù)。

定義內(nèi)聯(lián)成員函數(shù)的另一種方法是,在類體中只是給出成員函數(shù)的原型說明,在類體外定義成員函數(shù)時,與定義一般的內(nèi)聯(lián)函數(shù)一樣,在成員函數(shù)的定義前面加上關(guān)鍵定inline。內(nèi)聯(lián)(inline)成員函數(shù)

內(nèi)聯(lián)函數(shù)與一般函數(shù)的區(qū)別是,編譯器在生成目標代碼時,在調(diào)用這個函數(shù)的位置裝上這個函數(shù)的實際代碼,而不是處理成一個函數(shù)調(diào)用。因此可以加快程序的運行速度,缺點是占用內(nèi)存空間。所以在C++中如果定義的函數(shù)是一個小函數(shù),在整個代碼調(diào)用它地方又相對少,就應(yīng)該用inline定義為內(nèi)聯(lián)函數(shù)。classperson{ private: charName[12]; intAge; charSex[4]; public: voidRegisterPerson(char*name,intage,char*sex) { strcpy(Name,name); Age=age; strcpy(Sex,sex); } voidGetName(char*); intGetAge(void); voidGetSex(char*);};inlinevoidPerson::GetName(char*name){ strcpy(name,Name); }…….例4.3在類體中直接定義成員函數(shù)的函數(shù)體存儲類型類名對象列表;如:personP1,P2;說明了兩個對象P1和P2,它們均是類person的對象。在程序執(zhí)行時,通過為對象分配存儲空間來創(chuàng)立對象,在創(chuàng)立對象時,被用作樣板。參見下表:4.1.3對象的創(chuàng)立與使用

對象是類的一個實例,對象必須先定義然后才能使用。說明對象的一般格式為:表4-1類person的兩個實例P1和P2對象P1對象P2P1.NameP2.NameP1.AgeP2.AgeP1.SexP2.SexP1.RegisterPerson()P2.RegisterPerson()P1.GetName()P2.GetName()P1.GetAge()P2.GetAge()P1.GetSex()P2.GetSex()

為了減少成員函數(shù)所占用的空間,在建立對象時,只為對象分配用于保存成員數(shù)據(jù)的內(nèi)存空間,而成員函數(shù)的代碼為該類的每一個對象所共享。類中定義的成員函數(shù)的代碼被放在計算機內(nèi)存的一個公用區(qū)中,并供該類的所有對象共享。但邏輯上,我們?nèi)詫⒚恳粋€對象理解為由獨立的成員數(shù)據(jù)和各自的成員函數(shù)代碼組成。有兩種方法可存儲對象。

數(shù)據(jù)區(qū)代碼區(qū)對象1數(shù)據(jù)區(qū)代碼區(qū)對象2數(shù)據(jù)區(qū)代碼區(qū)對象n......圖4.1各對象完全獨立地安排內(nèi)存的方案數(shù)據(jù)區(qū)對象1數(shù)據(jù)區(qū)對象2數(shù)據(jù)區(qū)對象n......圖4.2各對象的代碼區(qū)共用的方案公共代碼區(qū)圖4.1對應(yīng)的是在類說明中定義函數(shù),而圖4.2對應(yīng)的是在類說明外部定義函數(shù)。如果在類外定義函數(shù)并使用inline,那么系統(tǒng)也會采用內(nèi)聯(lián)擴展方式實現(xiàn),每個對象都有該函數(shù)的一份獨立的代碼。方法1:classA{public: intr,t;};Ax,y;方法2:classB{ intI,j;public: voidSetdata(inta,intb) { I=a;j=b;} voidprint(void) {cout<<I<<‘\t’<<j<<‘\n’;}}b1,b2;方法3:class{public: intc,d;}t1,t2={100,200}

類對象的初始化僅限于對類的公有成員數(shù)據(jù),如方法3。當類中的成員數(shù)據(jù)被指定為私有或保護類型時,定義對象時不允許對它的成員數(shù)據(jù)進行初始化操作,如:Bb3={500,600};是非法的。實際上私有成員只能由類的成員函數(shù)對其數(shù)據(jù)進行操作,而初始化顯然是一個外部過程,所以這樣的操作是非法的。另外,類對象中成員數(shù)據(jù)的初始化操作一般是由構(gòu)造函數(shù)或拷貝初始化構(gòu)造函數(shù)來實現(xiàn)。

在定義了類的對象以后,可以使用成員運算符“.”

來訪問類的成員。但對于公有成員、私有成員及保護成員,在使用上存在差異。#include<iostream.h>#include<math.h>ClassCRect{ private: intleft,top;//矩形的左上角坐標

public: intright,bottom;//矩形的右下角坐標

voidsetcoord(int,int,int,int); //設(shè)置坐標值的函數(shù)

voidgetcoord(int*L,int*R,int*T,int*B)//取坐標值的函數(shù)

{*L=left;*R=right;*T=top;*B=bottom; } voidPrint(void) {cout<<“area=“<<fabs(right-left)*fabs(bottom-top)<<‘\n’;}};例:描述一個矩形對象,設(shè)置矩形的坐標,并輸出其相應(yīng)的坐標值。voidCRect::setcoord(intL,intR,intT,intB){ left=L;right=R; top=T;bottom=B;}voidmain(void){ CRectr,rr; inta,b,c,d; r.setcoord(100,300,50,200); cout<<“right=”<<r.right<<‘\n’; cout<<“bottom=”<<r.bottom<<‘\n’; r.getcoord(&a,&b,&c,&d); cout<<“l(fā)eft=”<<a<<‘\n’; cout<<“top=”<<c<<‘\n’; r.Print(); rr=r; rr.Print();}結(jié)果為:right=300;bottom=200;left=100;top=50;area=30000;area=30000;幾點說明:在類的外部,只能訪問類的公有成員,而不能訪問類的私有成員或保護成員。例如:a=r.left;c=r.top;都是不允許的,因為成員left和top都是私有成員。假設(shè)要訪問類對象的私有成員,只能通過對象的公有成員函數(shù)來獲取。如例中的r.getcoord(&a,&b,&c,&d);2.同類型的對象之間可以整體賦值,例如:rr=r;將對象r的所有成員依次賦給對象rr的成員,這種賦值與對象的成員訪問權(quán)限無關(guān)。3.對象用作函數(shù)的參數(shù)時,屬于賦值調(diào)用;函數(shù)也可

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論