c課件另外一個老師的chapter_第1頁
c課件另外一個老師的chapter_第2頁
c課件另外一個老師的chapter_第3頁
c課件另外一個老師的chapter_第4頁
c課件另外一個老師的chapter_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第 9 章類的高級部分1主要內(nèi)容靜態(tài)成員對象賦值問題拷貝構(gòu)造函數(shù)運算符重載對象組合29.1靜態(tài)成員例:一個學(xué)生類,定義其對象、,他們分別著類成員的一份副本(學(xué)號、籍貫等)。如果要統(tǒng)計一個班學(xué)生總數(shù)?用類外的變量,違背了數(shù)據(jù)封裝。用類的一個數(shù)據(jù)成員,導(dǎo)致多個副本,不僅冗余,而且勢必造成數(shù)據(jù)不一致。39.1.1靜態(tài)數(shù)據(jù)成員1. 用關(guān)鍵字sic;同一個類中的所有對象都共享該變量;必須在類外定義和初始化,用(:)來指明所屬的類。靜態(tài)變量不依賴于對象而存在,無論是否定義該類的對象,這種類型的變量都存在。靜態(tài)數(shù)據(jù)成員實際上是在類外定義的一個變量,它的生存期和整個程序的生

2、存期一樣,在定義對象之前,靜態(tài)數(shù)據(jù)成員就已經(jīng)存在。4classSicDemo x ;sicy ;public:void void理解它!putx( puty(a)b )x=a ; y=b ;getx( ) gety( ) return returnx ;y ; ;SicDemo:x ;/ 靜態(tài)變量x將被SicDemo類的所有對象共享,例如:obj2 ;SicDemoobj1,obj1.putx(5) ; obj1.puty( l0 ) ; obj2.puty(20 ) ;cout x: obj1.getx( ) obj2.getx( ) endl ;cout y: obj1.gety( ) o

3、bj2.gety( ) endl ;9.1.2靜態(tài)函數(shù)成員靜態(tài)函數(shù)成員是類中的一個函數(shù),有sic修飾。靜態(tài)函數(shù)成員和靜態(tài)數(shù)據(jù)成員類似,在對象生成之前也已經(jīng)存在。這就是說在對象產(chǎn)生之前,靜態(tài)的函數(shù)成員就能其它靜態(tài)成員。類外代碼可以使用類名和作用域操作符來調(diào)用靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)只能屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。見例【例9-2】。6/ budget2.h文件的內(nèi)容 。class BudgetsicfloatcorpBudget;float public:divBudget;Budget( ) divBudget = 0;voidaddBudget( floatb)divBudget

4、+= b; corpBudget += divBudget;sicvoidmainOffice( float );float floatgetDivBudget( )return divBudget; return corpBudget;getCorpBudget( );/ Contents of budget2.cpp #include budget2.hfloatBudget:corpBudget = 0 ;/ Definition of sic member function.void Budget:mainOffice(float moffice)corpBudget += moffi

5、ce;/主程序pr9-2.cpp的內(nèi)容#include budget2.h“ void main( )floatamount; i;bud;floatcout amount;budget request: ;Budget:mainOffice(amount);Budgetdivis4;for ( i = 0; i 4; i+)cout Enter the budget for Divi;cout (i + 1) bud; ;divisi.addBudget(bud);cout n Here are the divi for ( i = 0; i 4; i+)budget :n;cout t D

6、ivi cout divi (i + 1) t $ ;si.getDivBudget( ) endl;cout t Total Requests:;cout divis0.getCorpBudget( ) endl;對于靜態(tài)的函數(shù)成員,是通過類名和作用域分辨符調(diào)用的。也可以采用對象點的方式調(diào)用9.2函數(shù)1.引入的原因?的特征:函數(shù)不是類中的函數(shù)成員,但它和類的函數(shù)成員一樣,可以類中定義的私有成員。2.函數(shù)可以是一個外部函數(shù),也可以是另外一個類的函數(shù)成員。3. 將某個函數(shù)friend 。為一個類的方式,前面加129.2.1外部函數(shù)作為類的【例9-3】求兩個點之間的距離。classPox,y;pu

7、blic:Po(xx=0,=xx;yy=0 )=yy; return x return yxy) ) GetX GetY(;frienddoubleDistance(Po&a, Po&b);13;doubleDistance( Po& a,Po& b)double double returndx=a.x dy=a.y-b.x-b.y;sqrt(dx*dx+dy*dy);voidmain( )Pop1(3, 5),p2(4, 6);cout Distance(p1, p2) endl;9.2.2類的成員函數(shù)作為另外一個類的其他類的成員函數(shù)為一個類的函數(shù),這個成員函數(shù)也稱為成員。成員不僅可以成員和

8、公有成員,還可以自己所在類對象中的私有friend語句所在類對象中的私有成員和公有成員,這樣能使兩個類相互合作完成某一任務(wù)。例:將Aux類的函數(shù)addBudget函數(shù)。為Budget類的15classBudget ;/對Budget類超前使用說明classAux/Aux類的定義private: float public:auxBudget ;Aux( ) auxBudget = 0 ;void floataddBudget( float , Budget& ) ;getDivBudget( ) returnauxBudget ; ;class Budget/ Budget class decl

9、arationsicfloatcorpBudget;float public:divBudget;Budget( ) divBudget = 0;voidaddBudget(float B)divBudget += B;corpBudget += divBudget;float floatgetDivBudget( ) getCorpBudget( ) return divBudget; return corpBudget;sicvoid voidmainOffice( float ); Aux:addBudget(float, Budget &);friend;/ Contents of b

10、udget3.cpp #include budget3.h/ Definition of sic member of Budget classfloat Budget:corpBudget = 0;/ Definition of sic member function mainOffice.voidBudget:mainOffice(floatmoffice )corpBudget += moffice;/ Contents of auxi1.cpp #include auxi1.h #include budget3.h/ Definition of member function mainO

11、ffice. void Aux:addBudget(float b, Budget &div)auxBudget += b; div.corpBudget += auxBudget;Regard/ Contents of main program #include budget3.h“void main( )floati; floatamount;bud;cout amount; Budget:mainOffice(amount);budget: ;Budget Auxdivi auxOffis4;4;for (i = 0; i 4; i+)cout Enter the budget requ

12、est for divi cout (i + 1) bud;divisi.addBudget(bud);cout Enter the budget request for divi cout (i + 1) bud;auxOffii.addBudget(bud, divisi);cout Here are the divi for (i = 0; i 4; i+)budget requests:n;cout tDivi cout setw(7); (i + 1) ttt ;cout divisi.getDivBudget( ) endl;cout tAuxilary Office of Div

13、i cout t; (i+1);cout auxOffii.getDivBudget( ) endl;cout tTotal Requests (including main office):;cout divis0.getCorpBudget( ) endl;9.2.3一個類作為另外一個類的若一個類為另一個類的,則此類的所有成員都能對方類的私有成員。不好的方法,模仿9.3對象賦值問題采用賦值運算符“=”可以將一個對象賦值給另外一個對象,或者采用一個對象初始化另外一個對象。在缺省情況下,這兩個操作執(zhí)行的是對象成員之間的拷貝,也稱為按位拷貝或淺拷貝。【例9-5】淺拷貝應(yīng)用舉例。.24classR

14、ectanglefloat void public:voidwidth , length , area;calcArea( ) area = width * length; setData(float w, flo) width = w;length = l; calcArea( );float float floatgetWidth( )return return returnwidth; length; area;getLength( ) getArea( );voidmain()Rectanglebox1,box2;box1.setData(10, 20);box2.setData(5,

15、 10);cout n Box ls Area: box1.getArea( ); cout n Box 2s Area: box2.getArea( );box2 = box1;/ assignmentcout n Box ls Area: box1.getArea( ); cout n Box 2s Area: box2.getArea( );9.3對象賦值問題(continued)當(dāng)采用一個對象初始化另一個對象時,對象成員之間的賦值也是按位拷貝。賦值和初始化的區(qū)別:賦值出現(xiàn)在兩個對象都已經(jīng)存在的情況下,而初始化出現(xiàn)在創(chuàng)建對象時,例如:Rectanglebox1;box1. setData

16、(100, 50);Rectanglebox2 = box1;/ initialization279.4拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一個特殊的構(gòu)造函數(shù),當(dāng)定義一個對象并采用同類型的另外一個對象初始化時,將自動調(diào)用拷貝構(gòu)造函數(shù)。通常,采用缺省的按位拷貝操作也能正確地實現(xiàn)賦值,但在某些情況下不能正常地執(zhí)行。Exle:28classInfo*name; age;charpublic:Info(char name = new*n,a)charstrlen(n) + 1;strcpy(name, n);age = a; charInfo ( )delete return return name; name

17、; age;*getName ( ) getAge ( );Info Info1(Jones, 20);2 =1;/ 將產(chǎn)生?1. 解決的方法:定義拷貝構(gòu)造函數(shù)。2.拷貝構(gòu)造函數(shù)是一個特殊的構(gòu)造函數(shù),當(dāng)采用一個對象初始化另一個對象時,將自動調(diào)用該函數(shù)。UsingconstParameters思考:為什么拷貝構(gòu)造函數(shù)的參數(shù)一定是個?319.4.1缺省的拷貝構(gòu)造函數(shù)如果一個類沒有定義拷貝構(gòu)造函數(shù),C+將為其創(chuàng)建一個缺省的拷貝構(gòu)造函數(shù)。缺省的拷貝構(gòu)造函數(shù)的功能就是按位賦值。329.4.2調(diào)用拷貝構(gòu)造函數(shù)的情況1. 用對象初始化同類的另一個對象。例如:InfoInfost1(ZhangSan , 20

18、 );st2( st1) ,st3 = st1 ;332.如果函數(shù)的形參是對象,當(dāng)進(jìn)行參數(shù)傳遞時將調(diào)用拷貝構(gòu)造函數(shù)。voidchange(Infop )/voidmain (Info)st1(Susan , 20 ) ; ( st1 ) ;change3.如果函數(shù)的返回值是對象,函數(shù)執(zhí)行結(jié)束時,將調(diào)用拷貝構(gòu)造函數(shù)對無名臨時對象初始化。class public:Info Info ( ) Info ( Info ( ) cout調(diào)用構(gòu)造函數(shù)n ;Info&obj ) cout調(diào)用拷貝n ; cout調(diào)用析構(gòu)函數(shù)n ; ;Infoget Info();/ 函數(shù)的返回值是對象return;voidm

19、ain ( )Infostudent ;student = get( ) ;通過賦值運算符 =調(diào)用拷貝構(gòu)造函數(shù)main( )函數(shù)get( )函數(shù)9.5 運算符重載Exle 1:The / operator can perform two typesof divi: floating poandeger.Exle 2:Datetoday( 2006 , 4 , 27 );today.add (5 );today += 5;/ ?379.5.1重載賦值運算符如果對象中有指針成員,采用拷貝構(gòu)造函數(shù)能解決對象初始化問題,但并不能處理對象賦值。Exle:38Overload the = operator

20、 :classInfo*name; age;charpublic: void operator = (constInfo &right)delete name;name = new charstrlen() + 1; strcpy(name, );age = right.age;operator= 函數(shù)的參數(shù)不一定是常具有如下原因: :,上述基于效率考慮。采用可以防止參數(shù)傳遞時生成對象拷貝,節(jié)省了對象初始化和析構(gòu)的過程。將參數(shù)為常,可以防止函數(shù)無意間修改對象right的內(nèi)容。符合賦值運算的。Function call: p2.operator = (p1

21、); p2 = p1;p3 = p2 = p1;/ ?9.5.2this指針this是一個隱含的內(nèi)嵌指針,它指向調(diào)用成員函數(shù)的當(dāng)前對象。this指針是以隱含參數(shù)的形式傳遞給非靜態(tài)的函數(shù)成員的。Exle:cout cout getName( ) endl;getName( ) endl;41/ 【例9-8】classInfochar*name; age;public:Info operator=(const delete name;Info&right)name = new charstrlen()+ 1; strcpy(name, );age = rig

22、ht.age;return*this;/ 其他函數(shù)略;void main()Infojim(Jim, 20), bob(Bob, 21), clone = jim;clone = bob = jim;/ Call overloaded = operatorcout clone.getName( ) , clone.getAge( )name = newchar strlen( name ) + 1 ;strcpy( this-name, name ) ;this-age = age ;9.5.3重載雙目算術(shù)運算符引入原因:Feetincheslength1(3,5), length2(6,3)

23、, length3;length3 = length1 + length2;/ 等價于length3 = length1.operator + ( length2 );僅講述如何重載雙目運算符+和-,其它類似。46class FeetInchesfeet,inches;voidpublic:simplify( );/ 其他函數(shù)代碼見9.5.3節(jié) FeetInchesFeetInchesoperator + (const FeetInches &);operator - (const FeetInches &);/ Overloaded binary + operator. FeetInches

24、 FeetInches:operator + (constFeetInches &right )FeetInchestemp;temp.inches = inches + right.inches; temp.feet = feet + right.feet; temp.simplify( );returntemp;/ Overloaded binary - operator. FeetInches FeetInches:operator - (const FeetInches &right)FeetInchestemp;temp.inches = inches - right.inches;

25、 temp.feet = feet - right.feet; temp.simplify( );returntemp;9.5.3重載雙目算術(shù)運算符任何一個雙目算術(shù)運算符B被重載以后,當(dāng)執(zhí)行Obj1BObj2B( Obj2 )二元運算時:完全等價于:Obj1.operator509.5.4重載單目算術(shù)運算符Exle 1:distance2 = +distancel;/ 前置+等價于:distance2 = distancel.operator + ();Exle 2:distance2 = distancel+;/ 后置+等價于:distance2 = distancel.operator +

26、 (0);51class FeetInches/ 【例9-9】feet, inches;voidpublic:simplify( ); FeetInches FeetInches FeetInchesFeetInchesoperator + (const FeetInches &);operator - (const FeetInches &);operator+(operator+(););Dummy parameter/ Overloaded prefix + operator.FeetInchesFeetInches:operator+()+inches;simplify ( );ret

27、urn*this;/ Overloadedtfix + operator.FeetInches FeetInches:operator+()FeetInchestemp(feet, inches);inches+; simplify( ); returntemp;9.5.5重載關(guān)系運算符重載關(guān)系運算符,實現(xiàn)兩個對象的比較,其中關(guān)系運算符函數(shù)要返回一個布爾值(true或false):Exle:55if ( distancel operator operator.boolFeetInches:operator (constFeetInches&right )if (feet right.feet)

28、returntrue;elseif (feet=right.feet & inches right.inches)return returntrue; false;else57 / Overloaded operator.boolFeetInches:operator (const FeetInches &right)if (feet right.feet)return true;elseif (feet = right.feet & inches right.inches)returntrue;elsereturnfalse;58/ Overloaded = operator.boolFee

29、tInches:operator=(const FeetInches &right)if (feet = right.feet & inches = right.inches) return true;elsereturn false;9.5.6重載流操作符Exle:value ;能否實現(xiàn)?cout distance;注意:如果要為FeetInches類重載流符,那么必須通過函數(shù)的形式實現(xiàn)函數(shù)重載。60classFeetInchesfeet , public: inches;friend ostream &operator(;/ Overloaded operator.ostream&oper

30、ator(ostream&strm,FeetInches&obj)strm obj.feet feet, obj.inches operator.istream&operator(istream&strm,FeetInches&obj)cout cout obj.feet;strm obj.inches;Inches:strm;63cout distancel 等價于如下過程: distance2 endl ;1. 首先調(diào)用重載函數(shù),執(zhí)行cout distancel,返2. 執(zhí)行cout “回cout對象;”,返回值是cout對象;3.以(1)的方式,執(zhí)行cout distance2;4. 以

31、(2)的方式,執(zhí)行表達(dá)式中的cout distance;f = distance; i = distance;9.5.8重載 操作符Exle 1:stringname = John;cout name0;name0=a;C+除了支持重載傳統(tǒng)的運算符,還支持重載 符。這樣就能象操作普通數(shù)組一樣操作對象數(shù)組。69classArray *aptr; arraySize;void memError( ); void subError( );public:why?Array();Array( constArray & );Array(size( ); returnarraySize;&operator

32、(const& );/ Constructor forArray classArray:Array(s )arraySize = s;aptr = newif (aptr = 0)s;memError( );i = 0; i arraySize; i+)*(aptr + i) = 0;for (71/ Copy Constructor forArray class.Array:Array(constArray&obj)arraySize = obj.arraySize;aptr = newif (aptr = 0)arraySize;memError ( );i = 0; i 0)delete

33、 aptr; arraySize=0;73/ memError function.voidArray:memError( )cout Cannot allocate memory. n; exit(0);/ subError function. Array:subError( )voidcout Subscript out of range. n; exit(0);74/ Overloaded operator.&Array:operator (const&sub)if ( sub= arraySize)subError( );returnaptrsub;75voidmain( )Arrayx;table(10);for ( x

溫馨提示

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

最新文檔

評論

0/150

提交評論