




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第八章 類(lèi)的設(shè)計(jì) 在面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中,類(lèi)是最重要的概念,同時(shí),類(lèi)的設(shè)計(jì)也是面向?qū)ο蟪绦蛟O(shè)計(jì)的主要工作。一個(gè)程序的結(jié)構(gòu)如何、程序的運(yùn)行效率如何以及程序的可讀性可維護(hù)性如何,都與類(lèi)的設(shè)計(jì)有直接的關(guān)系。 在本章中,將詳細(xì)介紹幾個(gè)有實(shí)際意義的類(lèi)的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程,通過(guò)對(duì)這些類(lèi)的設(shè)計(jì),使讀者在加深對(duì)類(lèi)的設(shè)計(jì)的理解的基礎(chǔ)上,進(jìn)一步加深對(duì)與類(lèi)有關(guān)的一些基本概念的理解和運(yùn)用。 8.1 計(jì)數(shù)器類(lèi)的設(shè)計(jì) 顧名思義,計(jì)數(shù)器類(lèi)就是用于對(duì)計(jì)數(shù)值進(jìn)行管理的類(lèi),此類(lèi)的功能是能夠?qū)φ麛?shù)計(jì)數(shù)器進(jìn)行管理。計(jì)數(shù)器類(lèi)的功能 (1)在生成對(duì)象時(shí),能夠自動(dòng)為計(jì)數(shù)值清零。(2)計(jì)數(shù)值加1功能。(3)計(jì)數(shù)值減1功能。(4)獲取計(jì)數(shù)值的功
2、能。計(jì)數(shù)器類(lèi)的定義與實(shí)現(xiàn) #include #define uMax 30000 class cCounter unsigned int cnt; public: cCounter(void) cnt=0; void increment(void) if(cnt 0 ) cnt-; unsigned int value(void) return(cnt); ;void main(void) cCounter cnt1,cnt2; int i; for(i=0; i10; i+) cnt1.increment( ); cnt2.increment( ); for(i=0; i5; i+) cnt
3、2.decrement( ); cout “The value of cnt1 is: ” cnt1.value( ) n; cout “The value of cnt2 is: ” cnt2.value( ) n; 執(zhí)行結(jié)果:The value of cnt1 is: 10The value of cnt2 is: 5說(shuō) 明 (1)在上述cCounter類(lèi)的定義中,由于計(jì)數(shù)值為非負(fù)的,所以把計(jì)數(shù)值cnt定義為unsigned int,同時(shí),把計(jì)數(shù)值變量的訪(fǎng)問(wèn)權(quán)限指定為private,這就使得外界只能利用此類(lèi)中的成員函數(shù)來(lái)訪(fǎng)問(wèn)計(jì)數(shù)值cnt,而不能直接訪(fǎng)問(wèn)計(jì)數(shù)器變量,這樣,就起到了數(shù)據(jù)隱藏的作
4、用。 (2)由于在類(lèi)的構(gòu)造函數(shù)中將計(jì)數(shù)器的初值賦以零,這就保證了在main( )函數(shù)中定義cnt1和cnt2對(duì)象時(shí),能夠使其計(jì)數(shù)初值為零,而不是某一隨機(jī)數(shù),從而能夠保證程序運(yùn)行的正確性。用類(lèi)來(lái)進(jìn)行程序設(shè)計(jì)時(shí)的如下一些優(yōu)點(diǎn): (1)通過(guò)定義構(gòu)造函數(shù)能夠保證對(duì)對(duì)象中的變量進(jìn)行初始化,從而能夠消除由于沒(méi)有初始化而在程序運(yùn)行過(guò)程中所帶來(lái)的一些問(wèn)題,特別是當(dāng)類(lèi)的數(shù)據(jù)成員是指針時(shí),這一初始化過(guò)程就顯得尤為重要。 (2)由于只能通過(guò)類(lèi)的成員函數(shù)來(lái)修改計(jì)數(shù)器的值,這樣就使得對(duì)程序的維護(hù)變得容易。 在上面例子中,要想為計(jì)數(shù)值加1或減1,就需要利用類(lèi)中定義的成員函數(shù)來(lái)完成。cnt1.increment( ); /
5、計(jì)數(shù)值加1cnt2.decrement( ); /計(jì)數(shù)值減1例如: 同時(shí),要想取得計(jì)數(shù)器的值也需要調(diào)用成員函數(shù)來(lái)完成。 上述操作只能通過(guò)調(diào)用類(lèi)的成員函數(shù)來(lái)完成,實(shí)際程序設(shè)計(jì)過(guò)程中顯得比較麻煩,使用起來(lái)也不自然。x=cnt1.value( );例如: 如果能夠利用下述方式來(lái)完成上述功能的話(huà),則類(lèi)對(duì)象之間的運(yùn)算就如同普通變量運(yùn)算一樣簡(jiǎn)便: +cnt1; /相當(dāng)于cnt1.increment( );-cnt2; /相當(dāng)于cnt2.decrement( );x=cnt1; /相當(dāng)于x=cnt1.value( ); 顯然,要想實(shí)現(xiàn)上述功能,就必須要對(duì)+運(yùn)算符和-運(yùn)算符進(jìn)行重載,同時(shí)還要在類(lèi)中定義變換函數(shù)
6、。通過(guò)使用運(yùn)算符重載和變換函數(shù)來(lái)重新設(shè)計(jì)cCounter類(lèi),并實(shí)現(xiàn)上述運(yùn)算功能 #include #define uMax 30000class cCounter unsigned int cnt;public: cCounter(void) cnt=0; cCounter operator +( ) if(cnt 0) cnt-; return(*this); int operator !( ) return(cnt = 0); operator unsigned int( ) return(cnt); ; int main( void) cCounter cnt1,cnt2; int i;
7、 for(i=0; i10; i+) +cnt1; +cnt2; unsigned int k=cnt1+5; cout “k:” k n; while( cnt2 ) cout“cnt2:”unsigned(cnt2)n; -cnt2; if (!cnt1) cout “cnt1 is 0”; else cout ”等運(yùn)算符只能被重載為類(lèi)的成員函數(shù)。 由于cCounter類(lèi)中被重載的運(yùn)算符都是單目運(yùn)算符,因此,它們都是利用無(wú)參數(shù)的成員函數(shù)來(lái)實(shí)現(xiàn)的。 有了上述運(yùn)算符的重載定義之后,下面的運(yùn)算就變得可能了: +cnt1;它表示將cnt1對(duì)象中的計(jì)數(shù)值cnt加1。 在上面cCounter類(lèi)中定義的
8、+運(yùn)算符和-運(yùn)算符的重載函數(shù)的返回值類(lèi)型為cCounter,如果其返回值類(lèi)型為void的話(huà),則下面的計(jì)算將是不可能的: 注 意:unsigned int i;cCounter x;i=+x+5;原 因:由于 此時(shí),如果+x的返回值是void的話(huà),就不能夠利用變換函數(shù)來(lái)取出x對(duì)象中的計(jì)數(shù)值了。i=+x+5;i=unsigned int(+x)+5;可以看成 由于operator+( )和operator( )也同類(lèi)的成員函數(shù)一樣,因此也可以同調(diào)用一般的成員函數(shù)一樣來(lái)調(diào)用運(yùn)算符重載函數(shù)。cnt1.operator +( );例如: 對(duì)邏輯非運(yùn)算符!的重載,主要是用于判斷計(jì)數(shù)值是否為零,根據(jù)上述重載
9、定義可知,若cnt1對(duì)象中的計(jì)數(shù)值為零,則語(yǔ)句: if( !cnt1 ) 的條件為真。 從上述對(duì)運(yùn)算符的重載定義及其使用過(guò)程不難看出,一旦對(duì)運(yùn)算符進(jìn)行重載之后,對(duì)類(lèi)對(duì)象的操作就如同對(duì)簡(jiǎn)單變量的操作一樣方便、簡(jiǎn)潔。 k=a+i; /相當(dāng)于+i; k=ai; k=ai+; /相當(dāng)于k=ai; i+;+和-的前置運(yùn)算和后置運(yùn)算 在cCounter類(lèi)中,也應(yīng)該對(duì)前置運(yùn)算符和后置運(yùn)算符都進(jìn)行重載處理。一般來(lái)講,對(duì)前置運(yùn)算符和后置運(yùn)算符的重載處理應(yīng)該如下分別進(jìn)行: class cOperator public: type operator +( ); /前置運(yùn)算符+重載 type operator +(i
10、nt); /后置運(yùn)算符+重載 type operator -( ); /前置運(yùn)算符-重載 type operator -(int); /后置運(yùn)算符-重載 ;注 意: 前置運(yùn)算符的重載函數(shù)沒(méi)有參數(shù),后置運(yùn)算符的重載函數(shù)有一個(gè)整型參數(shù),但此整型參數(shù)只起到標(biāo)識(shí)作用,而沒(méi)有其它意義,換句話(huà)說(shuō),在重載函數(shù)中是不使用此參數(shù)的。 重新定義cCounter類(lèi),使其包含對(duì)+和-的前置運(yùn)算符和后置運(yùn)算符的重載處理。#include #define uMax 30000class cCounter unsigned int cnt;public: cCounter (void) cnt=0; cCounter op
11、erator +( ) if(cnt uMax) cnt+; return( *this); cCounter operator +(int dummy) cCounter x= *this; if(cnt 0) cnt-; return ( *this); cCounter operator -(int dummy) /注:返回值不可說(shuō)明為引用& cCounter x= *this; if (cnt 0) cnt-; return (x); int operator !( ) return (cnt=0); operator unsigned int( ) return(cnt); ; in
12、t main( ) cCounter cnt1,cnt2; printf(“cnt1+=%un”,cnt1+); /后置運(yùn)算符 printf(“+cnt2=%un”,+cnt2); /前置運(yùn)算符 printf(“cnt1-=%un”,cnt1-); /后置運(yùn)算符 printf(“-cnt2=%un”,-cnt2); /前置運(yùn)算符 return (0);執(zhí)行結(jié)果:cnt1+=0+cnt2=1cnt1-=1-cnt2=0說(shuō) 明 (1)這里的參數(shù)dummy只是用于表示是后置運(yùn)算符重載而已,除此之外沒(méi)有其它意義。(2) 函數(shù) cCounter operator -(int dummy)的定義如果改為如
13、下形式,將出現(xiàn)問(wèn)題:cCounter& operator -(int dummy) cCounter x= *this; if (cnt 0) cnt-; return (x); 因x是局部變量,函數(shù)返回后將釋放,返回其引用將提示警告錯(cuò)誤cCounter(或counter&) operator -(int dummy) cCounter& x= *this; if (cnt 0) cnt-; return (x); 因x是*this的別名,返回值仍然是減1后的結(jié)果,即同前置-,故錯(cuò)誤.(2)在main( )函數(shù)中:說(shuō) 明 對(duì)于前置運(yùn)算符和后置運(yùn)算符系統(tǒng)將根據(jù)有無(wú)參數(shù)進(jìn)行自動(dòng)判斷。 +cnt2;
14、 cnt2.operator +( )相當(dāng)于 cnt1+; cnt1.operator +(0)相當(dāng)于 (3)由于operator +( )和operator-( )也是cCounter類(lèi)的成員函數(shù),因此,下面的寫(xiě)法也是正確的,只是可讀性差些而已:說(shuō) 明cnt1.operator +(0); /調(diào)用后置運(yùn)算符重載cnt2.operator +( ); /調(diào)用前置運(yùn)算符重載8.2 字符串類(lèi)的設(shè)計(jì) 字符串類(lèi)就是用于對(duì)字符串進(jìn)行管理的類(lèi),此類(lèi)的功能是能對(duì)字符串進(jìn)行處理。 字符串類(lèi)的功能 (1)在生成對(duì)象時(shí),能夠自動(dòng)為字符串清空。(2)允許為對(duì)象進(jìn)行初始化操作。 (3)允許取出字符串中的任一個(gè)字符。(
15、4)允許對(duì)字符串進(jìn)行比較操作。(5)提供獲取字符串的功能。字符串類(lèi)的定義與實(shí)現(xiàn) #include #include class cString char *s;public: cString(void); cString(const char *); cString(const cString &); cString( ) delete s; cString &operator=(const char *); cString &operator=(const cString &); char &operator (int); operator char *( ); /變換函數(shù) void pri
16、nt(void) const printf(“%s”,s); friend int operator=(const cString &x, const cString &y) return (strcmp(x.s,y.s)=0); friend int operator !=(const cString &x, const cString &y) return (strcmp(x.s,y.s) !=0); ; cString:cString(void) /缺省構(gòu)造函數(shù) s=new char1; *s=0; cString:cString(const char *x) /構(gòu)造函數(shù) s=new c
17、harstrlen(x)+1; strcpy(s, x); cString:cString(const cString &x ) /復(fù)制構(gòu)造函數(shù) s=new charstrlen(x.s)+1; strcpy(s, x.s); cString & cString:operator=(const char *x) /賦值運(yùn)算符重載 delete s; s=new charstrlen(x)+1; strcpy(s, x); return( *this ); cString &cString:operator= (const cString &x) /賦值運(yùn)算符重載 delete s; s=new
18、 charstrlen(x.s)+1; strcpy(s, x.s); return( *this );char & cString:operator (int i) /下標(biāo)運(yùn)算符重載 return(si); cString:operator char *(void) /變換函數(shù) char *p=new charstrlen(s)+1; strcpy(p, s); return(p); void main(void) cString x; cString y(“abcd”); cString z=y; cString a; a=”abcdef”; a3=a0; /如果 運(yùn)算符重載的返回值不是c
19、har&, a4=z; /而是char,則a3等不能出現(xiàn)在=號(hào)左邊 x=y; printf(“a: ”); a.print( ); putchar(n); printf(“x: ”); x.print( ); putchar(n); printf(“y: ”); y.print( ); putchar(n); printf(“z: ”); z.print( ); putchar(n); printf(“x=y: %dn”, x=y); printf(“y=z: %dn”, y=z); printf(“a=x: %dn”, a=x); printf(“y!=z: %dn”, y!=z); pri
20、ntf(“x!=y: %dn”, x!=y); printf(“a!=x: %dn”, a!=x); char c100=“cc”; strcat(c, a); printf(“%sn”, c);執(zhí)行結(jié)果: a: abcazf x: abcd y: abcd z: abcd x=y: 1 y=z: 1 a=x: 0 y!=z: 0 x!=y: 0 a!=x: 1 ccabcazf說(shuō) 明 (1)這里需要注意的是main( )函數(shù)中的strcat(c, a)語(yǔ)句,這里的c是字符數(shù)組,a是cString類(lèi)型的對(duì)象,由于在cString類(lèi)中定義了變換函數(shù),所以,系統(tǒng)通過(guò)自動(dòng)使用變換函數(shù),就能夠使作為對(duì)
21、象的a像一般字符串一樣來(lái)使用。說(shuō) 明 (2)需要注意的是,如果下標(biāo)運(yùn)算符 的重載函數(shù)的返回值不是char&,而是char,則a3等不能出現(xiàn)在賦值語(yǔ)句的左邊,而只能出現(xiàn)在賦值語(yǔ)句的右邊,這是由于返回的只是一個(gè)值(常量),同函數(shù)的返回值一樣,只有當(dāng)函數(shù)的返回值是指針或引用時(shí)其調(diào)用才能出現(xiàn)的賦值語(yǔ)句的左邊。這時(shí),下面的賦值語(yǔ)句是錯(cuò)的: a3=a0; 說(shuō) 明 (3)在利用指針來(lái)管理字符串時(shí),一定要注意對(duì)內(nèi)存的申請(qǐng)和釋放工作。在此類(lèi)中定義的析構(gòu)函數(shù)就是用于這一目的的。說(shuō) 明 (4)本例中給出了多個(gè)運(yùn)算符重載函數(shù)的定義,包括 、=、!=和=等,正確地掌握這些運(yùn)算符重載函數(shù)的定義,將有助于提高C+語(yǔ)言程序設(shè)
22、計(jì)能力和技巧。 8.3 鏈表類(lèi)的設(shè)計(jì) 鏈表是一種非常有用的數(shù)據(jù)結(jié)構(gòu),很多復(fù)雜的程序設(shè)計(jì)都需要借助于鏈表來(lái)實(shí)現(xiàn)。鏈表類(lèi)主要用于對(duì)鏈表進(jìn)行管理,盡管很多程序設(shè)計(jì)語(yǔ)言都可以定義鏈表,但C+語(yǔ)言在定義和實(shí)現(xiàn)鏈表方面還是有其顯著特點(diǎn)的。 鏈表類(lèi)的主要功能 (1)向鏈表中插入元素,主要包括向鏈表頭插入元素和向鏈表尾插入元素。 (2)從鏈表中刪去元素,主要包括刪去鏈表頭的元素和刪去鏈表尾的元素。 一個(gè)類(lèi)是cLink,它主要用來(lái)管理鏈表中每個(gè)結(jié)點(diǎn)中的數(shù)據(jù)以及指向下一個(gè)結(jié)點(diǎn)的指針;實(shí)現(xiàn)鏈表功能的類(lèi)的設(shè)計(jì) 另一個(gè)類(lèi)是cList,它主要用來(lái)對(duì)鏈表進(jìn)行管理并提供對(duì)鏈表的操作。 鏈表的實(shí)現(xiàn) #include #incl
23、ude class cLink friend class cList; cLink *next; char item20; public: cLink(char *x=“” ) strcpy(item,x); cLink *get_next(void) return(next); void print(void) printf(“%sn”, item); ;class cList protected: cLink *first; cLink *last; public: cList(void) first=last=new cLink;/or new cLink( ); cList( ) Cl
24、ear( ); delete first; cList &Insert(const cLink &); /表頭插入結(jié)點(diǎn) cList &Append(const cLink &); /表尾插入結(jié)點(diǎn) cList &Delete(void); /刪去表頭結(jié)點(diǎn) cList &Remove(void); /刪去表尾結(jié)點(diǎn) cList &Clear(void); /刪去所有結(jié)點(diǎn) void Print(void); /顯示所有結(jié)點(diǎn) ;/向表頭插入結(jié)點(diǎn)cList &cList:Insert(const cLink &x) cLink *ptr=first; first=new cLink; *first=x;
25、first-next=ptr; return(*this);/向表尾插入結(jié)點(diǎn)cList & cList:Append(const cLink &x) cLink *ptr=last; *ptr=x; last=new cLink; ptr-next=last; return(*this);/刪除表頭結(jié)點(diǎn) cList &cList:Delete(void) if(first !=last) cLink *ptr=first-next; delete first; first=ptr; return(*this);/刪除表尾結(jié)點(diǎn)cList &cList:Remove(void) if (first
26、=last) ; else if (first -next=last) Delete( ); else cLink *now=first; cLink *pre; while(now-next !=last) pre=now; now=now-next; pre -next=last; delete now; return(*this); /刪去所有結(jié)點(diǎn)cList &cList:Clear(void) cLink *ptr=first; while (ptr !=last) cLink *next=ptr-next; delete ptr; ptr=next; first=last; retu
27、rn(*this); /顯示所有結(jié)點(diǎn)/void cList:Print(void) puts(“= = = = list = = = =”); int no=1; cLink *ptr=first; while (ptr != last) printf(“%d:”, no+); ptr-print( ); putchar(n); ptr=ptr -next; int main(void) cList ls; ls.Append(cLink(“Wang”); ls.Insert(cLink(“Zhang”); ls.Append(cLink(“Gong”); ls.Append(cLink(“Y
28、ang”); ls.Print( ); return(0); 執(zhí)行結(jié)果:= = = = list = = =1: Zhang2: Wang3: Gong4: Yang說(shuō) 明 (1)由于cList類(lèi)在進(jìn)行各種鏈表操作時(shí),需要使用cLink類(lèi)中的數(shù)據(jù)成員和成員函數(shù),這樣,如果能夠無(wú)條件地訪(fǎng)問(wèn)cLink類(lèi)中的private成員的話(huà)將是很方便的,基于這一考慮,在本程序中把cList類(lèi)作為cLink類(lèi)的友元來(lái)使用,這樣,cList類(lèi)中的所有函數(shù)都能夠直接訪(fǎng)問(wèn)cLink類(lèi)中的所有成員。說(shuō) 明 (2)為了處理上的方便,cList類(lèi)中的last指針始終指向一個(gè)空結(jié)點(diǎn),這一空結(jié)點(diǎn)是在定義此類(lèi)的對(duì)象時(shí)由構(gòu)造函數(shù)自
29、動(dòng)生成的,有了這個(gè)空結(jié)點(diǎn)就使得對(duì)鏈表的操作比較方便了。8.4 堆棧類(lèi)的設(shè)計(jì) 堆棧是一種常用的數(shù)據(jù)結(jié)構(gòu),在實(shí)際程序設(shè)計(jì)過(guò)程中經(jīng)常會(huì)用到。在本節(jié)中給出的堆棧類(lèi)設(shè)計(jì),比“數(shù)據(jù)結(jié)構(gòu)”課程中所講解的內(nèi)容稍微有點(diǎn)擴(kuò)充,不僅提供push(入棧)和pop(出棧)操作,還提供一些其他操作,其目的主要是為了提高讀者的程序設(shè)計(jì)能力。 設(shè)計(jì)一個(gè)堆棧類(lèi)Stack,用于對(duì)整型數(shù)據(jù)進(jìn)行管理,要求:(1)在定義對(duì)象時(shí)能夠確定堆棧的長(zhǎng)度。 (2)給出push( )和pop( )函數(shù)的定義。 (3)通過(guò)運(yùn)算符重載,實(shí)現(xiàn)對(duì)堆棧是否為 空的判斷。 (4)定義變換函數(shù),用于返回堆棧的長(zhǎng)度。 (5)通過(guò)函數(shù)的遞歸調(diào)用,來(lái)計(jì)算堆棧中 數(shù)據(jù)
30、為0的元素的個(gè)數(shù)。 (6)給出main( )函數(shù)的定義,在函數(shù)體中合 理地調(diào)用上述每一個(gè)函數(shù)。 #include iostream.hclass Stack int size; int *ptr; int *top;public: Stack(int n) /構(gòu)造函數(shù) ptr=top=new intn; size=n; int *getPtr( ) return ptr; void push(int x) /push函數(shù) if(top-ptr ptr) return *-top; else return 0; int operator !( ) /!運(yùn)算符重載 return (top-ptr!
31、=0); operator int( ) /變換函數(shù) return size; int count(int *p) /遞歸調(diào)用函數(shù) static int m=0; if(p top) if( *p+ =0) m+; count(p); return m; ; void main( ) Stack s(10); int len; int *p=s.getPtr( ); s.push(1); s.push(0); s.push(0); s.push(2); s.push(0); s.push(1); if(!s) cout Zero=s.count(p)endl; if(!s) cout Pop=
32、s.pop( ) endl; len=s; cout Len=len endl運(yùn)行結(jié)果: Zero=3 Pop=1 Len=10 說(shuō)明: (1)定義了變換函數(shù)之后,就可以像len=s;這樣來(lái)調(diào)用該函數(shù),從而簡(jiǎn)化了程序設(shè)計(jì)過(guò)程。 (2)由于top始終指向棧頂下一個(gè)入棧數(shù)據(jù)的空位置,因此需要注意+和-運(yùn)算符在push和pop函數(shù)中的用法。 (3)由于堆棧遵循“先進(jìn)后出”的原則,因此,需要注意push和pop函數(shù)的數(shù)據(jù)存取順序。 說(shuō)明: (4)在本例中,count被定義為遞歸調(diào)用函數(shù),其中的局部變量m被定義為靜態(tài)局部變量,如果去掉static關(guān)鍵字,則該函數(shù)不能正常工作。 (5)在定義對(duì)象時(shí)需要做的
33、工作,實(shí)際上就是在構(gòu)造函數(shù)中應(yīng)該定義的功能。8.5 數(shù)組類(lèi)的設(shè)計(jì) 數(shù)組也是常用的數(shù)據(jù)結(jié)構(gòu),當(dāng)需要處理大量的同類(lèi)型數(shù)據(jù)時(shí),利用數(shù)組是很方便的。通過(guò)學(xué)習(xí)數(shù)組類(lèi)的設(shè)計(jì),使讀者能夠進(jìn)一步掌握有關(guān)運(yùn)算符重載等知識(shí)。 設(shè)計(jì)一個(gè)類(lèi)Matrix,用于對(duì)一整型88矩陣進(jìn)行管理。要求:(1)在生成對(duì)象時(shí),能夠自動(dòng)為矩陣中的每個(gè)元素清0。(2)通過(guò)運(yùn)算符重載,實(shí)現(xiàn)對(duì)兩個(gè)矩陣的減法和乘法運(yùn)算。(3)通過(guò)運(yùn)算符重載,實(shí)現(xiàn)矩陣中主對(duì)角線(xiàn)上的元素是否 全為0的判斷。(4)實(shí)現(xiàn)按列為矩陣輸入數(shù)據(jù)的成員函數(shù)。(5)實(shí)現(xiàn)求矩陣中主對(duì)角線(xiàn)上元素的最小值的成員函數(shù)。(6)給出main( )函數(shù)的定義,在函數(shù)體中合理地調(diào)用上述 每一個(gè)
34、函數(shù)。 #include iostream.h“#define MLEN 8class Matrix int MMLEN MLEN;public: Matrix( ); Matrix operator*(Matrix&); Matrix operator-(Matrix&); int operator!( ); void cInput( ); int Minv( ); void disp( ); ; Matrix:Matrix( ) /構(gòu)造函數(shù) int i, j; for(i=0;i MLEN;i+) for(j=0;j MLEN;j+) Mij=0; Matrix Matrix:operat
35、or*(Matrix& x) /*運(yùn)算符重載 int i,j,k; Matrix a; for(i=0;i MLEN;i+) for(j=0;j MLEN;j+) for(k=0;k MLEN;k+) a.Mij+=Mik*x.Mkj; return a;Matrix Matrix:operator-(Matrix& x) /-運(yùn)算符重載 int i,j; Matrix a; for(i=0;i MLEN;i+) for(j=0;j MLEN;j+) a.Mij=Mij-x.Mij; return a;void Matrix:cInput( ) /按列輸入數(shù)據(jù) int i,j; cout In
36、put MLEN MLEN data: n; for(i=0;i MLEN;i+) for(j=0;j Mji;int Matrix:Minv( ) /求主對(duì)角線(xiàn)上元素的最小值 int i,Mi; Mi=M00; for(i=1;iMii) Mi=Mii; return Mi;int Matrix:operator!( ) /!運(yùn)算符重載 int i; for(i=0;i MLEN;i+) if(Mii) return 0; return 1; void Matrix:disp() int i,j; for(i=0;i MLEN;i+) for(j=0;j MLEN;j+) cout Mij
37、; cout n; void main() Matrix M, N, P; M.cInput( ); N.cInput( ); P=M - N; P.disp( ); cout Min= P.Minv( ) endl; P=M * N; P.disp( ); cout Min= P.Minv( ) endl; if(!P) cout All elements are zero.n; else cout Non-zero elements exist.n; 說(shuō)明:(1)將數(shù)組長(zhǎng)度定義為符號(hào)常量,有利于對(duì)不同長(zhǎng)度的數(shù)組進(jìn)行管理,從而能夠提高程序的可讀性和可擴(kuò)充性。 (2)對(duì)真、假值的判斷以及零、非零的判斷等,一般都是對(duì)邏輯非運(yùn)算符(?。┻M(jìn)行重載。8.6 用于
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 游樂(lè)場(chǎng)環(huán)保技術(shù)應(yīng)用-深度研究
- 鐵路運(yùn)輸服務(wù)質(zhì)量提升-深度研究
- 智能家居能效評(píng)估模型-深度研究
- 3D重建與MR融合-深度研究
- 社交媒體對(duì)藝術(shù)推廣的影響-深度研究
- 跨平臺(tái)進(jìn)程間通信接口-深度研究
- 高效腐熟劑長(zhǎng)效機(jī)制研究-深度研究
- 共享經(jīng)濟(jì)中的信任機(jī)制構(gòu)建與維護(hù)-深度研究
- 質(zhì)量數(shù)據(jù)挖掘與應(yīng)用-深度研究
- 自動(dòng)駕駛算法優(yōu)化-第1篇-深度研究
- 安全生產(chǎn)法律法規(guī)匯編(2025版)
- 義務(wù)教育化學(xué)課程標(biāo)準(zhǔn)(2022年版)解讀
- 生產(chǎn)加工型小微企業(yè)安全管理考試(含答案)
- 2《幼苗長(zhǎng)大了》課件
- 第三章-農(nóng)村公共管理組織課件
- 注塑員工培訓(xùn)
- 《麻精藥品培訓(xùn)》ppt課件
- JMP操作簡(jiǎn)要培訓(xùn)
- 勝利油田壓驅(qū)技術(shù)工藝研究進(jìn)展及下步工作方向
- 研究生復(fù)試匯報(bào)ppt
- 畢節(jié)市疾病預(yù)防控制中心衛(wèi)生應(yīng)急管理工作規(guī)范
評(píng)論
0/150
提交評(píng)論