第2章-C++類和對(duì)象_第1頁(yè)
第2章-C++類和對(duì)象_第2頁(yè)
第2章-C++類和對(duì)象_第3頁(yè)
第2章-C++類和對(duì)象_第4頁(yè)
第2章-C++類和對(duì)象_第5頁(yè)
已閱讀5頁(yè),還剩78頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第2章類和對(duì)象

面向?qū)ο蟮木幊趟枷腩惖膶?shí)現(xiàn)類的使用this指針static關(guān)鍵字1、結(jié)構(gòu)化的編程思想

在計(jì)算機(jī)發(fā)展的初期,編寫(xiě)軟件的主要目的是控制計(jì)算機(jī)以實(shí)現(xiàn)人們想要實(shí)現(xiàn)的功能。在這一階段,人們主要是采用功能分解的指導(dǎo)思想。所謂的功能分解,就是將大的功能模塊分解成比較小的功能模塊,然后再將較小的功能模塊分解成更小的功能模塊。

按這一思路,分解到每一小功能模塊可以采用一個(gè)函數(shù)實(shí)現(xiàn)為止。一、面向?qū)ο蟮木幊趟枷?/p>

模塊之間的分解關(guān)系,在編程實(shí)現(xiàn)時(shí)體現(xiàn)為函數(shù)之間的調(diào)用關(guān)系。因此,在學(xué)習(xí)C語(yǔ)言的過(guò)程中,大家重點(diǎn)是要掌握函數(shù)相關(guān)的知識(shí)。2、面向?qū)ο蟮木幊趟枷胗?jì)算機(jī)發(fā)展到一定階段后,編寫(xiě)軟件的為模擬實(shí)現(xiàn)世界,即將現(xiàn)實(shí)生活中的某些現(xiàn)象或場(chǎng)景在計(jì)算機(jī)中模擬出來(lái)。

例如,現(xiàn)實(shí)生活中的商店購(gòu)物過(guò)程對(duì)應(yīng)于互聯(lián)網(wǎng)的天貓店購(gòu)物,賽車活動(dòng)對(duì)應(yīng)于計(jì)算機(jī)中的賽車游戲等。在計(jì)算機(jī)中所模擬場(chǎng)景的逼真程度,取決于我們對(duì)現(xiàn)實(shí)世界的認(rèn)識(shí)程度。

面臨的問(wèn)題:

怎樣有效地認(rèn)識(shí)現(xiàn)實(shí)世界的現(xiàn)象或場(chǎng)景?

唯物辯證法認(rèn)為:世界是由物質(zhì)所組成的,并且物質(zhì)之間存在普遍聯(lián)系。

何為物質(zhì)?物質(zhì)是指自然界客觀存在的事物,它不以人們的意識(shí)為轉(zhuǎn)移,即不管人們是否看到或意識(shí)到某一物質(zhì),它都真實(shí)存在于自然界。物質(zhì)---->實(shí)體---->對(duì)象將唯物辯證法引入到軟件工程領(lǐng)域中,就形成了面向?qū)ο蟮南到y(tǒng)分析:被模擬世界是由對(duì)象所組成的,對(duì)象之間存在普遍聯(lián)系。具體應(yīng)用時(shí),我們可以對(duì)這句話進(jìn)行深入分解,作為我們認(rèn)識(shí)現(xiàn)實(shí)世界的指導(dǎo)方針?!氨荒M世界是由對(duì)象所組成的”可以被分解成三個(gè)層次:1、所模擬世界是由哪些對(duì)象所組成的?據(jù)此,我們可以分析出所有的研究對(duì)象。2、每一個(gè)對(duì)象有哪些狀態(tài)?3、每一個(gè)對(duì)象有哪些行為?通過(guò)這兩步的分析,我們可以深入認(rèn)識(shí)每一個(gè)研究對(duì)象的具體內(nèi)容。“對(duì)象之間存在普遍聯(lián)系”也可以被分解成:4、對(duì)象之間是否存在組合關(guān)系?比如結(jié)構(gòu)上、空間上或邏輯上存在整體與部分的關(guān)系。5、對(duì)象之間是否滿足現(xiàn)實(shí)生活中的分類常識(shí)?比如存在一般與特殊的關(guān)系或同屬于一大類下的不同子類。6、對(duì)象之間是否存在依賴關(guān)系,以實(shí)現(xiàn)不同對(duì)象之間的協(xié)作?利用這種面向?qū)ο蟮乃季S方式,可以讓我們有計(jì)劃、有步驟地分析現(xiàn)實(shí)世界。針對(duì)日常的教學(xué)活動(dòng)(極端簡(jiǎn)化版),可以分析很多對(duì)象:張三、侯俊杰、C語(yǔ)言、李四、譚浩強(qiáng)、C++語(yǔ)言,…。針對(duì)大量的對(duì)象,怎樣進(jìn)行有效的描述或交流?歸納、總結(jié),進(jìn)行分類處理3、由對(duì)象抽象出類通過(guò)分類處理,可以發(fā)現(xiàn)這些對(duì)象都?xì)w屬于學(xué)生、教師和課程三種類型之一。好處:不需要面對(duì)千千萬(wàn)萬(wàn)個(gè)內(nèi)容各異的具體對(duì)象,只需要將精力集中在每種類型的共性方面,方便交流。怎樣描述同一類型的數(shù)據(jù)?C++類中有什么內(nèi)容?C語(yǔ)言:數(shù)據(jù)類型、結(jié)構(gòu)體------->C++:類類是什么?在C++語(yǔ)言中,類是一種自定義的數(shù)據(jù)類型,用來(lái)描述同一類對(duì)象的屬性與行為。對(duì)象狀態(tài)行為類成員變量成員函數(shù)數(shù)據(jù)代碼4、對(duì)象與類的關(guān)系先由現(xiàn)實(shí)世界中的對(duì)象抽象出類,然后在計(jì)算機(jī)世界中依據(jù)類實(shí)例化出相應(yīng)的對(duì)象。5、面向?qū)ο缶幊趟枷氲闹饕卣?、抽象是對(duì)具體對(duì)象(問(wèn)題)進(jìn)行概括,抽出這一類對(duì)象的公共性質(zhì)并加以描述的過(guò)程。=>是指由系統(tǒng)分析所得的各種具體對(duì)象,歸納出描述性的類。2、封裝是將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個(gè)整體。=>是指利用this指針,將對(duì)象的成員函數(shù)與成員變量關(guān)聯(lián)起來(lái)。3、繼承是C++中支持層次分類的一種機(jī)制,允許程序員在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體的說(shuō)明。=>是指利用分類學(xué)的原理,優(yōu)化類的層次結(jié)構(gòu)關(guān)系,提高代碼的重用率。4、多態(tài)性是同一名稱,不同的功能實(shí)現(xiàn)方式。具有重載函數(shù)和虛函數(shù)兩種實(shí)現(xiàn)方式。=>虛函數(shù)是構(gòu)架大型框架與平臺(tái)的基礎(chǔ),是底層框架與上層應(yīng)用的關(guān)聯(lián)點(diǎn)。下列術(shù)語(yǔ)中,能表明面向?qū)ο笏枷胫饕卣鞯氖牵ǎ?。封裝性靈活性安全性可靠性ABCD提交單選題1分下列關(guān)于類的敘述中,錯(cuò)誤的是()。類是一種抽象數(shù)據(jù)類型類是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心類與類之間不能形成層次結(jié)構(gòu)類可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的封裝和隱藏ABCD提交可為此題添加文本、圖片、公式等解析,且需將內(nèi)容全部放在本區(qū)域內(nèi)。正常使用需3.0以上版本類設(shè)計(jì)之初,就是為了體現(xiàn)面向?qū)ο蟮乃枷?,將有相似屬性和行為的?shí)體抽象為一個(gè)類,包含這一類實(shí)體的共有屬性和行為,選項(xiàng)A、B正確。類的三大特性:封裝性、繼承性、多態(tài)性,選項(xiàng)D正確。類的繼承屬性就能使類形成層次結(jié)構(gòu),故C選項(xiàng)錯(cuò)誤,故答案為C選項(xiàng)。答案解析答案解析單選題1分下面關(guān)于類和對(duì)象說(shuō)法不正確是()。類由數(shù)據(jù)與函數(shù)組成一個(gè)對(duì)象必屬于某個(gè)類對(duì)象是類的實(shí)例一個(gè)類的對(duì)象只有一個(gè)ABCD提交單選題1分類是一種復(fù)雜的數(shù)據(jù)類型,它是將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的運(yùn)算封裝在一起的集合體。1、類的定義類將一些數(shù)據(jù)及與數(shù)據(jù)相關(guān)的函數(shù)封裝在一起,使類中的數(shù)據(jù)得到很好的“保護(hù)”。在大型程序中不會(huì)被隨意修改。二、類的實(shí)現(xiàn)類的定義格式:class類名{private:

成員變量;

成員函數(shù);

public:

成員變量;

成員函數(shù);};關(guān)鍵字類名私有公有classStudent{private:charName[20];floatMath;floatChiese;

public:floataverage;

voidSetName(char*name);voidSetMath(floatmath);voidSetChinese(floatch);floatGetAverage(void);};分號(hào)不能少用關(guān)鍵字priviate限定的成員稱為私有成員對(duì)私有成員限定在該類的內(nèi)部使用私有成員變量只能被該類內(nèi)的成員函數(shù)調(diào)用私有成員函數(shù)只能被該類內(nèi)的成員函數(shù)調(diào)用類就相當(dāng)于私有成員的作用域。用關(guān)鍵字public限定的成員稱為公有成員,公有成員變量或函數(shù)不受類的限制,可以在類內(nèi)或類外自由使用。對(duì)類而言是透明的。私有變量公有變量類內(nèi)函數(shù)可以訪問(wèn)可以訪問(wèn)類外函數(shù)不可訪問(wèn)可以訪問(wèn)私有函數(shù)公有函數(shù)類內(nèi)函數(shù)可以調(diào)用可以調(diào)用類外函數(shù)不可調(diào)用可以調(diào)用類外類里每一個(gè)限制詞(private等)在類體中可使用多次。一旦使用了限制詞,該限制詞一直有效,直到下一個(gè)限制詞開(kāi)始為止。如果未加說(shuō)明,類中成員默認(rèn)的訪問(wèn)權(quán)限是private,即私有的。classStudent{ charName[20]; floatMath; floatChiese;

public: floataverage;voidSetName(char*name); voidSetMath(floatmath); voidSetChinese(floatch); floatGetAverage(void);};均為私有權(quán)限均為公有權(quán)限16.若有如下類定義classFruit{charname[20];public:voidPrint();private:doubleprice;};則下列敘述中,正確的是()。類中有1個(gè)公有數(shù)據(jù)成員類中有1個(gè)私有數(shù)據(jù)成員類中有2個(gè)私有數(shù)據(jù)成員數(shù)據(jù)成員name的訪問(wèn)權(quán)限未知ABCD提交單選題1分classA{floatx,y;public:

voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}}; xySetxy()Print()A私有數(shù)據(jù)公有函數(shù)在類外不能直接使用x或y,必須通過(guò)Setxy()給x或y賦值,通過(guò)Print()輸出x或y。成員函數(shù)與成員數(shù)據(jù)的定義不分先后,可以先說(shuō)明函數(shù)原型,再在類體外定義函數(shù)體。classA{floatx,y;public:

voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}}; 在類體內(nèi)定義成員函數(shù)classA{floatx,y;public:

voidSetxy(floata,floatb);

voidPrint(void);};

voidA::Setxy(floata,floatb){x=a;y=b;}voidA::Print(void){cout<<x<<‘\t’<<y<<endl;}在類體內(nèi)說(shuō)明成員函數(shù)原型在類體外定義成員函數(shù),需要使用作用域運(yùn)算符有如下類定義:

classCup{public:voidSetPrice(doubleval);private:doubleprice;};若要在類體外給出對(duì)成員函數(shù)SetPrice的定義,下列選項(xiàng)中正確的是()。voidCup::SetPrice(doubleval){price=val;}voidCup.SetPrice(doubleval){price=val;}voidSetPrice(doubleval){Cup::price=val;}voidSetPrice(doubleval){Cup.price=val;}ABCD提交單選題1分在定義一個(gè)類時(shí),要注意如下幾點(diǎn):1、類具有封裝性,并且類只是定義了一種結(jié)構(gòu)(樣板),所以類中的任何成員數(shù)據(jù)均不能使用關(guān)鍵字extern,auto或register限定其存儲(chǔ)類型。2、在定義類時(shí),只是定義了一種導(dǎo)出的數(shù)據(jù)類型,并不為類分配存儲(chǔ)空間,所以,在定義類中的數(shù)據(jù)成員時(shí),不能對(duì)其初始化。如:classTest{intx=5,y=6;//是不允許的

externfloatx; //是不允許的};在C++語(yǔ)言中,結(jié)構(gòu)體類型只是類的一個(gè)特例。結(jié)構(gòu)體類型與類的唯一的區(qū)別在于:在類中,其成員的缺省的存取權(quán)限是私有的;而在結(jié)構(gòu)體類型中,其成員的缺省的存取權(quán)限是公有的。2、內(nèi)聯(lián)成員函數(shù)當(dāng)我們定義一個(gè)類時(shí),可以在類中直接定義函數(shù)體。這時(shí)成員函數(shù)在編譯時(shí)是作為內(nèi)聯(lián)函數(shù)來(lái)實(shí)現(xiàn)的。注意:一定是內(nèi)聯(lián)函數(shù)!同時(shí),我們也可以在類體外定義類的內(nèi)聯(lián)成員函數(shù),在類體內(nèi)說(shuō)明函數(shù),在類體外定義時(shí),在成員函數(shù)的定義前面加上關(guān)鍵字inline。classA{floatx,y;public:voidSetxy(floata,floatb);

voidPrint(void);}; inlinevoidA::Setxy(floata,floatb){x=a;y=b;}inlinevoidA::Print(void){cout<<x<<‘\t’<<y<<endl;}說(shuō)明該成員函數(shù)為內(nèi)聯(lián)3、成員函數(shù)的重載類中的成員函數(shù)與前面介紹的普通函數(shù)一樣,成員函數(shù)可以帶有缺省的參數(shù),也可以重載成員函數(shù)。重載時(shí),函數(shù)的形參必須在類型或數(shù)目上不同。classTest{ intx,y; intm,n;public:

voidSetxy(inta,intb){x=a; y=b;}

voidSetxy(inta,intb,intc,intd){x=a;y=b;m=c;n=d;}

voidPrintxy(intx){cout<<“m="<<m<<'\t'<<“n="<<n<<endl;}voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){ Testp1,p2;

p1.Setxy(3,5);p2.Setxy(10,20,30,40);//參數(shù)不同

p1.Printxy();

p2.Printxy();p2.Printxy(2);//參數(shù)、類型不同}輸出:x=3y=5x=10y=20m=30n=404、缺省參數(shù)的成員函數(shù)classA{floatx,y;public:floatSum(void){returnx+y;}

voidSet(floata,floatb=10.0){x=a; y=b;}voidPrint(void){ cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){ Aa1,a2;

a1.Set(2.0,4.0); cout<<"a1:"; a1.Print(); cout<<"a1.sum="<<a1.Sum()<<endl;

a2.Set(20.0); cout<<"a2:"; a2.Print(); cout<<"a2.sum="<<a2.Sum()<<endl;}不缺省參數(shù),a1.x=2,a1.y=4缺省參數(shù),a2.x=20,a2.y=10下列關(guān)于類成員函數(shù)特性的敘述中,錯(cuò)誤的是()。成員函數(shù)可以遞歸成員函數(shù)可以重載成員函數(shù)都是內(nèi)聯(lián)函數(shù)成員函數(shù)可以設(shè)置默認(rèn)參數(shù)值A(chǔ)BCD提交單選題1分1、創(chuàng)建對(duì)象只有在定義了屬于類的變量后,系統(tǒng)才會(huì)為類的變量分配空間。在定義類時(shí),只是定義了一種數(shù)據(jù)類型,即說(shuō)明程序中可能會(huì)出現(xiàn)該類型的數(shù)據(jù),并不為類分配存儲(chǔ)空間。類的變量我們稱之為對(duì)象。對(duì)象是類的實(shí)例,定義對(duì)象之前,一定要先說(shuō)明該對(duì)象的類。三、類的使用不同對(duì)象占據(jù)內(nèi)存中的不同區(qū)域,它們所保存的數(shù)據(jù)各不相同,但對(duì)成員數(shù)據(jù)進(jìn)行操作的成員函數(shù)的程序代碼均是一樣的。類名對(duì)象1,對(duì)象2《,......》;Studentst1,st2;對(duì)象的定義格式:類名對(duì)象名在建立對(duì)象時(shí),只為對(duì)象分配用于保存數(shù)據(jù)成員的內(nèi)存空間,而成員函數(shù)的代碼為該類的每一個(gè)對(duì)象所共享。classA{floatx,y;public:voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};Aa1,a2;voidmain(void){Aa3,a4;}定義全局對(duì)象定義局部對(duì)象成員變量全局變量局部變量2、對(duì)象的使用一個(gè)對(duì)象的成員就是該對(duì)象的類所定義的成員,有成員變量和成員函數(shù),引用時(shí)同結(jié)構(gòu)體變量類似,用“.”運(yùn)算符。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;//定義對(duì)象

a1.m=10;a1.n=20;//為公有成員數(shù)據(jù)賦值

a1.Setxy(2.0,5.0);//為私有成員數(shù)據(jù)賦值

a1.Print();}a1nmyxa2nmyx10202.05.0輸出:2 5在類外,用成員選擇運(yùn)算符“.”只能訪問(wèn)對(duì)象的公有成員,而不能訪問(wèn)對(duì)象的私有成員或保護(hù)成員。若要訪問(wèn)對(duì)象的私有的數(shù)據(jù)成員,只能通過(guò)對(duì)象的公有成員函數(shù)來(lái)獲取。classA{floatx,y;public:floatm,n;

voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,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)同類型的對(duì)象之間可以整體賦值,這種賦值與對(duì)象的成員的訪問(wèn)權(quán)限無(wú)關(guān)。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;a1.m=10;a1.n=20; //為公有成員數(shù)據(jù)賦值

a1.Setxy(2.0,5.0);

a2=a1;a1.Print();a2.Print();}同類型的對(duì)象之間可以整體賦值相當(dāng)于成員變量間相互賦值對(duì)象可以作函數(shù)的入口參數(shù)(實(shí)參、形參),也可以作函數(shù)的出口參數(shù)。這與一般變量作為函數(shù)的參數(shù)是完全相同的??梢远x類類型的指針,類類型的引用,對(duì)象數(shù)組,指向類類型的指針數(shù)組和指向一維或多維數(shù)組的指針變量一個(gè)類的對(duì)象,可作為另一個(gè)類的成員類體的區(qū)域稱為類作用域。類的成員函數(shù)與成員數(shù)據(jù),其作用域都是屬于類的作用域,僅在該類的范圍內(nèi)有效,故不能在主函數(shù)中直接通過(guò)函數(shù)名和成員名來(lái)調(diào)用函數(shù)。3、類作用域和對(duì)象的作用域?qū)ο蟮淖饔糜蚺c前面介紹的變量作用域完全相同,全局對(duì)象、局部對(duì)象、局部靜態(tài)對(duì)象等。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;a1.m=20;a1.n=10;

a1.Setxy(2.0,5.0);

a1.Print();}voidmain(void){Aa1,a2;

m=20;n=10;

Setxy(2.0,5.0);

Print();

}用對(duì)象名調(diào)用不能直接調(diào)用classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}//成員函數(shù)voidPrint(void){cout<<x<<‘\t’<<y<<endl;}//成員函數(shù)};voidmain(void)//全局函數(shù){Aa1,a2;a1.m=20;a1.n=10;

a1.Setxy(2.0,5.0);

a1.Print();}成員函數(shù):局部變量-->成員變量-->全局變量全局函數(shù):局部變量-->全局變量4、類的對(duì)象如何引用私有成員變量1)通過(guò)公有函數(shù)為私有成員賦值classTest{ intx,y;public:

voidSetxy(inta,intb){x=a; y=b;}voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){ Testp1,p2;

p1.Setxy(3,5);

p1.Printxy();}調(diào)用公有函數(shù)為私有對(duì)象賦值2)利用函數(shù)訪問(wèn)私有數(shù)據(jù)成員classTest{intx,y;public:voidSetxy(inta,intb){x=a; y=b;}intGetx(void){returnx;}//返回x值

intGety(void){returny;}//返回y值

voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;

a=p1.Getx();b=p1.Gety();//將a=x,b=ycout<<a<<'\t'<<b<<endl;}函數(shù)值就是私有成員變量的值3)利用指針訪問(wèn)私有數(shù)據(jù)成員classTest{intx,y;public:voidSetxy(inta,intb){x=a; y=b;}

voidGetxy(int*px,int*py){*px=x;*py=y;}//提取x,y值

voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;p1.Getxy(&a,&b);//將a=x,b=ycout<<a<<'\t'<<b<<endl;}輸出:3 54)利用引用訪問(wèn)私有數(shù)據(jù)成員classTest{ intx,y;public:voidSetxy(inta,intb){ x=a;y=b;}

voidGetxy(int&px,int&py){px=x; py=y; }//提取x,y值

voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;p1.Getxy(a,b);//將a=x,b=ycout<<a<<'\t'<<b<<endl;}輸出:3 5類引用舉例(三角形類:三角形的三邊及與三邊相關(guān)的運(yùn)算)classTriangle{private: floata,b,c;//三邊為私有成員數(shù)據(jù)public: voidSetabc(floatx,floaty,floatz);//置三邊的值

voidGetabc(float&x,float&y,float&z);//取三邊的值

floatPerimeter(void);//計(jì)算三角形的周長(zhǎng)

floatArea(void);//計(jì)算三角形的面積

voidPrint(void);//打印相關(guān)信息};voidTriangle::Setabc(floatx,floaty,floatz){a=x;b=y;c=z;}//置三邊的值voidTriangle::Getabc(float&x,float&y,float&z)//取三邊的值

{x=a;y=b;z=c;}floatTriangle::Perimeter(void){return(a+b+c)/2;}//計(jì)算三角形的半周長(zhǎng)floatTriangle::Area(void)//計(jì)算三角形的面積{floatarea,p;p=Perimeter();area=sqrt((p-a)*(p-b)*(p-c)*p);//海倫公式returnarea;}voidTriangle::Print(void)//打印相關(guān)信息{cout<<"Peri="<<Perimeter()<<'\t'<<"Area="<<Area()<<endl;}voidmain(void){ TriangleTri1; //定義三角形類的一個(gè)實(shí)例(對(duì)象)

Tri1.Setabc(4,5,6); //為三邊置初值

floatx,y,z; Tri1.Getabc(x,y,z);//將三邊的值為x,y,z賦值

cout<<x<<'\t'<<y<<'\t'<<z<<endl; cout<<“s=”<<Tri1.Perimeter()<<endl;//求三角形的周長(zhǎng)

cout<<“Area=”<<Tri1.Area()<<endl;//求三角形的面積

cout<<"Tri1:"<<endl; Tri1.Print();//打印有關(guān)信息}類引用舉例(學(xué)生類:學(xué)生的姓名成績(jī)及相關(guān)的運(yùn)算)classStudent{ charName[20]; //學(xué)生姓名

floatChinese; //語(yǔ)文成績(jī)

floatMath; //數(shù)學(xué)成績(jī)public:floatAverage(void);//計(jì)算平均成績(jī)

floatSum(void); //計(jì)算總分

voidShow(void); //打印信息

voidSetStudent(char*,float,float);//為對(duì)象置姓名、成績(jī)

voidSetName(char*); //為對(duì)象置姓名

char*GetName(void); //取得學(xué)生姓名};floatStudent::Average(void){return(Chinese+Math)/2;}//平均成績(jī)floatStudent::Sum(void){returnChinese+Math;}//總分voidStudent::Show(void) //打印信息{cout<<"Name:"<<Name<<endl<<"Score:"<<Chinese<<'\t'<<Math<<'\t'<<"average:"<<Average()<<'\t'<<"Sum:"<<Sum()<<endl;}voidStudent::SetStudent(char*name,floatchinese,floatmath){ strcpy(Name,name); //置姓名

Chinese=chinese; //置語(yǔ)文成績(jī)

Math=math; //置數(shù)學(xué)成績(jī)}char*Student::GetName(void){returnName;}//返回姓名voidmain(void){ Studentp1,p2;p1.SetStudent(“Liqing”,98,96);//對(duì)象置初值p2.SetStudent("WangGang",90,88);//對(duì)象置初值p1.Show();//打印信息p2.Show();//打印信息p1.SetName(“Zhaojian”);//重新置p1對(duì)象的名字p1.Show();cout<<“p1.Name:”<<p1.GetName()<<endl;//打印對(duì)象的名字cout<<“p1.average:”<<p1.Average()<<endl;//打印對(duì)象的成績(jī)}575、定義類的指針及如何用指針來(lái)引用對(duì)象classA{ floatx,y;public: floatSum(void){returnx+y;} voidSet(floata,floatb){x=a; y=b;}voidPrint(void){ cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Aa1,a2;A*p; //定義類的指針

p=&a1; //給指針賦值

p->Set(2.0,3.0);//通過(guò)指針引用對(duì)象的成員函數(shù)

p->Print();cout<<p->Sum()<<endl;a2.Set(10.0,20.0);a2.Print();}xy2.03.0pa1定義類的數(shù)組及數(shù)組中元素的引用voidmain(void){

Stustu[3]; //定義類的數(shù)組

Stu*pstu; //定義類的指針

pstu=stu; //為指針賦值

inti;

stu[0].SetStudent(“A”,90,90);//通過(guò)數(shù)組元素的引用賦值

stu[1].SetStudent("B",80,80); stu[2].SetStudent("C",70,70); for(i=0;i<3;i++) {

pstu->Show();//指針變量指向數(shù)組元素

pstu++; //指針變量加一,指向下一元素

}}stupstupstu四、this指針不同對(duì)象占據(jù)內(nèi)存中的不同區(qū)域,它們所保存的數(shù)據(jù)各不相同,但對(duì)成員變量進(jìn)行操作的成員函數(shù)的程序代碼均是一樣的。classA{intx,y;public:voidSetxy(inta,intb){x=a;y=b;}};Aa1,a2;1a1.x2a1.y3a2.x4a2.y......x=a;y=b;......a1.Setxy()a2.Setxy()a1.Setxy(1,2);a2.Setxy(3,4);this->x=a;this->y=b;系統(tǒng)自動(dòng)將對(duì)象的指針帶到成員函數(shù)中當(dāng)對(duì)一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),編譯程序先將對(duì)象的地址賦給this指針,然后調(diào)用成員函數(shù),每次成員函數(shù)存取數(shù)據(jù)成員時(shí),也隱含使用this指針。this指針具有如下形式的缺省說(shuō)明:

Student*constthis;類名即this指針里的地址是一個(gè)常量源代碼:classA{intx,y;public:voidSetxy(inta,intb){x=a;y=b;}};Aa1;a1.Setxy(1,2);編譯后的代碼:classA{intx,y;public:voidSetxy(inta,intb,

A

*const

this){this->x=a;this->y=b;}};Aa1;a1.Setxy(1,2,&a1);由此可知,對(duì)對(duì)象的成員進(jìn)行訪問(wèn)或調(diào)用時(shí),都是依據(jù)對(duì)象來(lái)進(jìn)行的:顯式的形式:對(duì)象.成員或指針->成員隱式的形式:this->成員下列關(guān)于this指針的敘述中,錯(cuò)誤的是()。this指針只能在類的非靜態(tài)成員函數(shù)中使用this指針存儲(chǔ)著對(duì)象的地址this指針不需要顯式定義在構(gòu)造函數(shù)中不能使用this指針ABCD提交單選題1分什么是封裝?怎樣理解封裝?在面向?qū)ο蟮木幊陶Z(yǔ)言中,一個(gè)對(duì)象的成員變量和成員函數(shù)是一個(gè)邏輯統(tǒng)一體。即這個(gè)對(duì)象的成員函數(shù)可以直接訪問(wèn)對(duì)象的成員變量或直接調(diào)用對(duì)象的成員函數(shù)。classA{intx,y;public:voidSetxy(inta,intb)//對(duì)象的成員函數(shù){

x=a;

//成員函數(shù)直接訪問(wèn)成員變量

y=b;}};封裝是通過(guò)成員函數(shù)中的this指針來(lái)實(shí)現(xiàn)。在編譯過(guò)程中,編譯器會(huì)自動(dòng)為成員函數(shù)中的成員變量增加一個(gè)this指針,以實(shí)現(xiàn)對(duì)成員變量的訪問(wèn)。classA{intx,y;public:voidSetxy(inta,intb,

A

*const

this){this->x=a;

this->y=b;}};總結(jié)一句話:在面向?qū)ο蟮恼Z(yǔ)言中,對(duì)象的成員要通過(guò)對(duì)象來(lái)訪問(wèn)!

通常,每當(dāng)說(shuō)明一個(gè)對(duì)象時(shí),把該類中的有關(guān)成員數(shù)據(jù)拷貝到該對(duì)象中,即同一類的不同對(duì)象,其成員數(shù)據(jù)之間是互相獨(dú)立的。因此,我們通常也稱之為對(duì)象成員變量。classA{intx,y;public:voidSetxy(inta,intb){x=a;y=b;}};Aa1,a2;a1.xa1.ya2.xa2.y......x=a;y=b;......a1.Setxy()a2.Setxy()a1.Setxy(1,2);a2.Setxy(3,4);this->x=a;this->y=b;四、static關(guān)鍵字四、static關(guān)鍵字1、靜態(tài)成員變量如果要在同一類的多個(gè)對(duì)象之間實(shí)現(xiàn)數(shù)據(jù)共享,則可使用該類的靜態(tài)成員變量,即由同一類的所有對(duì)象共享該類的靜態(tài)成員變量。這樣的做法可避免使用全局變量所帶來(lái)的危險(xiǎn)。對(duì)象1…對(duì)象n同類型多個(gè)對(duì)象靜態(tài)成員變量共享同一個(gè)靜態(tài)在員變量概念在類中,用關(guān)鍵字static修飾的成員變量稱為靜態(tài)成員變量。classA{intx,y;staticintz;public:voidSetxy(inta,intb){x=a;y=b;}};Aa1,

a2;a1.xa1.ya2.xa2.yza1.za2.z不同對(duì)象,同一空間四、static關(guān)鍵字classCounter{

staticintcount; //用于表示已建立的對(duì)象數(shù)目

intobjnum; //用于表示對(duì)象序號(hào)public:Counter(){count++;//每建立一個(gè)對(duì)象就加一

objnum=count;//為當(dāng)前對(duì)象序號(hào)賦值

}voidshow(){cout<<“objid:"<<objnum<<"created"<<endl;cout<<“totally:“<<count<<"objects“<<endl;}};intCounter::count=0;//在類體之外進(jìn)行初始化1、在成員變量前使用static關(guān)鍵字2、必須在類體之外進(jìn)行初始化,此時(shí)要數(shù)據(jù)類型,但不要static關(guān)鍵字實(shí)現(xiàn)四、static關(guān)鍵字方式一:靜態(tài)成員變量為類所有,因此可以通過(guò)類名來(lái)進(jìn)行訪問(wèn)。形式為:

類名::靜態(tài)成員變量cout<<Counter::count<<endl;方式二:靜態(tài)成員變量為此類所有對(duì)象所共享,因此也可以是通過(guò)對(duì)象訪問(wèn)。形式為:

對(duì)象.靜態(tài)成員變量voidshow(){cout<<“objid:"<<objnum<<"created"<<endl;cout<<“totally:“<<count<<"objects“<<endl;}使用方式四、static關(guān)鍵字1、靜態(tài)成員變量屬于類,也可以說(shuō)是屬于此類的所有對(duì)象,而不是屬于該類的某一個(gè)對(duì)象。靜態(tài)成員變量的生命周期是整個(gè)程序,而其作用域是它被定義時(shí)所在的類。因此,也稱為類成員。非靜態(tài)成員變量的生命周期與其對(duì)象同在,而其作用域是它被定義時(shí)所在的類。因此,也稱為對(duì)象成員。注意事項(xiàng)732、類的靜態(tài)數(shù)據(jù)成員是靜態(tài)分配存儲(chǔ)空間的,而其它成員是動(dòng)態(tài)分配存儲(chǔ)空間的(全局變量除外)。對(duì)于對(duì)象成員變量,只有在程序執(zhí)行期間遇到創(chuàng)建類對(duì)象的語(yǔ)句時(shí),才為對(duì)象的所有成員依次分配存儲(chǔ)空間,這種存儲(chǔ)空間的分配是動(dòng)態(tài)的;對(duì)于類成員變量,在編譯時(shí),就要為類的靜態(tài)數(shù)據(jù)成員分配存儲(chǔ)空間。因此,必須在實(shí)現(xiàn)文件中,對(duì)靜態(tài)數(shù)據(jù)成員作一次且只能作一次定義性說(shuō)明。classA{staticintx;//定義靜態(tài)成員};intA::x=0;//必須對(duì)靜態(tài)成員作一次定義性說(shuō)明743、靜態(tài)數(shù)據(jù)成員具有全局變量和局部變量的一些特性。靜態(tài)數(shù)據(jù)成員與全局變量一樣都是靜態(tài)分配存儲(chǔ)空間的。全局變量在程序中的任何位置都可以訪問(wèn)它,而靜態(tài)數(shù)據(jù)成員受到訪問(wèn)權(quán)限的約束。必須是public權(quán)限時(shí),才可能在類外進(jìn)行訪問(wèn)。2、靜態(tài)成員函數(shù)可以將成員函數(shù)定義為靜態(tài)的成員函數(shù),即使用關(guān)鍵字static來(lái)修飾成員函數(shù)。classA{floatx,y;public:A(){}staticvoidsum(void){.....}};在類內(nèi)定義靜態(tài)成員函數(shù)76classTc{private:intA;

staticintB;//靜態(tài)數(shù)據(jù)成員public:Tc(inta){A=a;B+=a;}

staticvoiddisplay(Tcc);//Tc的對(duì)象為形參};voidTc::display(Tcc)//不用static修飾{cout<<"A="<<c.A<<",B="<<B<<endl;}1、在類內(nèi)聲明靜態(tài)成員函數(shù)2、在類外實(shí)現(xiàn)靜態(tài)成員函數(shù),不需要使用static關(guān)鍵字77對(duì)靜態(tài)成員函數(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論