筆記課程考試試題cprimer章節(jié)版_第1頁
筆記課程考試試題cprimer章節(jié)版_第2頁
筆記課程考試試題cprimer章節(jié)版_第3頁
筆記課程考試試題cprimer章節(jié)版_第4頁
筆記課程考試試題cprimer章節(jié)版_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二章開始學(xué)習(xí) 第三章數(shù)據(jù)處 簡單變 const限定 浮點 c++算術(shù)操作 第四章復(fù)合類 數(shù)組 字符 string類簡 共用體 枚舉類型 指針和自由空 第五章循環(huán)和關(guān)系表達 while循 第六章分支語句和邏輯操作 第七章函數(shù)——c++的程序模 7.9函數(shù)指 第八章函數(shù)探 內(nèi)聯(lián)函 8.2變 默認(rèn)參 函數(shù)重 函數(shù)模 總 第九章內(nèi)存模型和名稱空 單獨編 9.2持續(xù)性、作用域和 布局new操作 名稱空 第十章對象和 this指 10.7類作用 10.9總 第十一章使用 11.6類的自動轉(zhuǎn)換和強制類型轉(zhuǎn)換(未看 第十二章類的動態(tài)分配內(nèi) 總 第十三章類繼 繼承——is-a關(guān) 第十四章C++中的代碼重 類模 總 第十五章、異常和其 嵌套 異 第十六章string類和標(biāo)準(zhǔn)模板 string 變量名的約定:類型_名稱或者 140main()函數(shù)不是關(guān)鍵字,由于它不是語法的組成頭文件stdlib.h中rand()函數(shù)不接受任何參數(shù),并返回一個隨機整數(shù),其函數(shù)如下:intsizeof操作符能夠打印類型或變量長度的單位字節(jié)數(shù),如:sizeof(int);sizeof a;//a為變量頭文件climits包含了整型限制信息signedchar最charint值 signedchar最shortlongunsignedintshortlong int值unsignedc++c:inta=15;c++的:inta(15);如果不初始化那么變量的值C++添加了兩種類型:longlongunsignedlonglong64longu或uunsignedint,int。charch=’a’;cout.put(ch);/put(charc++ascii換行符(nl退格回車水平制表符垂直制表符確保標(biāo)準(zhǔn)同步,unicode可以表示96000多種符號和49個手寫符號,而ascii碼就是unicode的一個子集)cout<<”nig\u00e2teau.\n”;打印如下nigateau //a的iso10646編碼是00e2特殊類型:wcha_t寬字符類型 值都被轉(zhuǎn)換為true,零被轉(zhuǎn)換為false;反之intaa=true;longbb=false;也成立。constconstlongmonths=true;//const 5.6545e8。浮點類型要添加頭文件float.h,浮點型的類型有float(32位,其精度低,系統(tǒng)至少有6位有效數(shù)位或更低),double(64位,精度至少在13位有效位),longdouble(80,96,128位)。 浮點常量默認(rèn)為double類型若希望常量位float,要用f或f后綴,對于longdouble類型。使用l或l(盡量用l,l像1)cout<<2.2l<<3.12f<<8.123;//8.123為double默認(rèn)型c++23.45000023.45。常只右邊字節(jié)(long)bianliang;//clong(bianliang);//c+第四章shortlongkk[10]={10,12,6856,12};//oklongjj[10];//ok

jj[10]={1,2,3};//notallowedlongcc=jj;//notallowed kk[]={0,523,54,3,4};//編譯器計算出[]內(nèi)的元素個數(shù),這里為5個longlong_kk=sizeofkk/sizeof(short);/charchardog[5]={‘a(chǎn)’,’b’,’c’,’d’,’c’};//定義了一個char型數(shù)組,的不是一個字符charcat[5]={‘a(chǎn)’,’b’,’c’,’d’,’\0’};//的是一個字符串,到空字符結(jié)束//在確定的字符串所需的最短數(shù)組時,別忘了將結(jié)尾的空字符計算在內(nèi)另一種初始化字符串的方法:charkk[]=”nihao!!”;strlen(cstringcharkk[15]=”nihao!”;//strlen只計算可見字符,不把空字符計操作數(shù)在內(nèi) ”<<sizeof(kk);//sizeof是確定數(shù)組的長度kk[3]=’\0’;//當(dāng)cout讀到’\0’時變停止 )’/0’ getline(get()將換行符保留在輸入序列中。getline()有兩個參數(shù),第一個是數(shù)組名第二個是字符數(shù)-1(如若是20,最多度19個)getgetlinecin.get();//get()另一個變體cin.get()可一個字符,即使是換行符,這樣就可以保留在輸入列我們可以將兩個類成員函數(shù)合并:cin.get(array,200).get(get()cincin.get(array,200).cin.get().get(get()不返回對象.inta;charcin.getline(kk,100);//如果就這樣,無法輸入字符串就跳到下一行,因為上一行有回車string對象;可以用數(shù)組的表示法其中的字符理論上,char數(shù)組是一個字符串的單元,string類變量是一個表示字符串實體stringstr1=”kjlsamdl”,str2,str3;//stringstr2=str1;//stringstringstr2+=“nikancharc1[20]=”jjjj”,c2[20];//數(shù)組也可以連續(xù)定義,要注意不要超出數(shù)組的大小。strcpy(c2,c1);//strcpy()能將c1中的字符串賦值到c2中,出數(shù)組的大小,會破壞數(shù)據(jù);發(fā)生錯誤。strcat(c2,”kkkk”);//strcat()函數(shù)能將字符串”kkkk”附加到c2字符串的末尾處cout<<c1<<’\t’<<c2<<’\t’<<strlen(c1);//strlen()也是cstring提供的函數(shù),能數(shù)組中字符串的大小 jjjkkkk4stringstr=“123,str0string類的函數(shù)。因此只能這樣調(diào)用。intkk=str.size();//size(stringstr3(不帶’\0’空字符結(jié)構(gòu)可以多種類型的數(shù)據(jù)定義結(jié)構(gòu)描述:1它描述并標(biāo)記了能夠在結(jié)構(gòu)中的各種數(shù)據(jù)類型;2按描述創(chuàng)建變量每個列表項都是一條語句,每一個語句都是一個結(jié)構(gòu)成員structinflatablegoose;/cinflatanle goose.price就相當(dāng)于一個double類型的變量,可以像常規(guī)使用double變量那樣來使用它們,類成員函數(shù)就是從結(jié)構(gòu)成員這里衍生來的,結(jié)構(gòu)也是c++oop(類)堡壘的基石struct charname[20];floataa;doublebb;

}kk= //要用逗號。c++不提倡使用外部變量,但提倡使用外部結(jié)構(gòu),還提倡外部符號常 inflatablemm={“l(fā)eilei”,12.3,6.8};//inflatablell;ll=mm;//我們可以將結(jié)構(gòu)賦給另一個同類型的結(jié)構(gòu) unionmingcheng{longlong_aa;boublebouble_aa;}bianliang;//語法與結(jié)構(gòu)一樣,但每次只調(diào)用一個成員,可structinflatable{charname[20];doublehehe;union{longlong_aa;doubleinflatablejiegou_bianliang;cout<<jiegou_bianliang.long_aa;//共用體成員被視為結(jié)構(gòu)的成員,可直接enumkk{a,b,c,d,e};//kk,a.b.c0,往后依次類推kkband=d;//kkbandkk(12);//選擇用多少空間來枚舉由編譯器決定,對于范圍小的枚舉使用一個字節(jié)或更小的空間enumkk={a,b=0,c=100,d,f};//枚舉量可以相同(ab0)c=100指針用于值的地址,指針名表示的是地址。*操作符被稱為間接值或解除操作符,如m表示的是一個地址,*m表示在該處的值int*p_kare=&kk;//操作符*兩邊的空格是可選的。c:int*ptr;c++使用這種格式:int*ptrc++中int*p1,p2;//這樣將創(chuàng)建一個指針p1和一個常規(guī)int變量p2。對于每一個指針變量名,都需要使用一個*。int*a;*a=23;//未初始化的指針的。應(yīng)養(yǎng)成在定義指針時將指針初始化為一個確定的、適合的地址的習(xí)慣。int*pt=0xb int* 為一個數(shù)據(jù)對象(可以是結(jié)構(gòu),也可以是基本類型)獲得并指定分配內(nèi)存的通用格式如下:typename=newint*ps=newint;//int*pn=ps;//不要創(chuàng)建兩個指針指向同一個內(nèi)存塊的指針,因為這將增加錯誤刪除同一內(nèi)存塊兩次的可能。釋放變量所獲取的內(nèi)存,不過,對空指針使用delete是安全的。new[]deleteint*a=newint[2];a[0]=0;a[1]=1;//初始化??梢詫⑺闯蒳nta[2]數(shù)組來處理,a的地址為數(shù)組第一個a+=1;//a[0]=1;a-=1;//deletea;//delete[]將指針變量加一,就是增加的值等于指向的類型占用的字節(jié)數(shù)。如:long*a;a++;//ac-風(fēng)格字符串。charflower[10]=”nihao”;//常規(guī)定義一個char型數(shù)組來字符串到遇到‘\0’//后面”haizaima?\n”字符串打印,cout’\0’結(jié)束charcout<<(int*)p<<endl;strcpy()可以將一個字符串?dāng)?shù)組給另一個字符串?dāng)?shù)組:atrcpy(shuzu1,”zif”);//也以將字符串給數(shù)組們用strncpy這個函數(shù)來如:strncpy(shuzu,”naiznlls”,5);//它將字符串的前五個字符付給了數(shù)組,但所以要設(shè)置shuzu[5]=’\0’;//我們要添加語句,確保字符數(shù)組的最后為空字符,要不然它的不是字符串了newstructinflatable{charname[20];floatvolume;doubleprice;inflatable*ps=newinflotable;//定義一個指針指向在堆中創(chuàng)建的結(jié)構(gòu);ps,*ps①for(語句塊)⑥逗號操作符⑦關(guān)系操作符⑧whiletypedefget()字符輸入方法⑾文件尾條件⑿嵌套循環(huán)和二維數(shù)組booltruefalse;c++表達式都是值與操作符的組合,c++表達式都有值。maid=(cooks=4)+3;/c++x=y=z=0;這樣的語句存在longa=100;cout<<a>1; cout.setf(ios.base::boolalpha);booltruefalse10cout<<a<3;//設(shè)置以后就不顯示數(shù)字0false定義一個const值來表達數(shù)組中的元素個數(shù)是好的習(xí)慣。在數(shù)組和數(shù)組長度時,可以使用const值。stringsize()獲得字符串中的字符數(shù),如:stringword;cin>>word;intkk=word.size(); 復(fù)合語句(也叫語句塊:單獨的一對大括號就是一個語句塊,在一個語句塊內(nèi)定義的變量到語句塊外面就釋放了逗號操作符:逗號操作符的優(yōu)先級是最低的。如:i=20,j=i*2;//兩語句是有先后順序,翻過來是不行的for(longi=0,j=10;i<j;i++,j-)/逗號操作符一般用于r循環(huán)語句這個循環(huán)以將字符串中的字符反過來。關(guān)系表達式:< > <= >= == !=;:if(strcmp(aanihao)==0)stringstr1;str1“nihao”;//whilewhile(1統(tǒng)時間為單位的時間。clock_t是clock()函數(shù)返回類型的別名,我們可以將變量為clock_t類型,他表示long、unsigndeint類型別名:c#definec+typedef#definechchar*chchar*chkkkkcharchar*chcha,bchar*a,b;typedeftypedefchar*ch;/c++char*dowhliecin>>ch;//使用原始的輸入能將鍵盤輸入的下一個字符輸入到變量中,但他能將空格、換行符和制表符忽略。eofeoflongkk[2][3]=23long ”haizaiba!”}; //第一個字符串的地址,而調(diào)用kk[0]時就等于調(diào)用了第一個字符串or操作符||:i++ notcc++C++的保留字。:它是switch3switchdefault:case‘c’:hanshu();break;//這樣輸入大寫小寫都行,這也是一種解決大小寫一樣的breakbreakc++函數(shù)在中接受參數(shù)與在定義中接受參數(shù)可以用不一樣的變量名。如:voidkk(longj);//voidkk(longk){}//定義的屬性和特別之處longkk=10;viodhans(long&kk);voidhanshans(constlong&kk)//變量、定義函為了保證被調(diào)用函數(shù)只使用調(diào)用函數(shù)的變量值,而不是是修改變量值,我們一般情況下是不用的,如果要用引constlong*constkk;voidhans(kk+3);//這是錯誤的,現(xiàn)在的c++是不允許將表達式傳遞給,而按值傳遞是允許參數(shù)因為這樣//它創(chuàng)建了臨時變量,用指向臨時變量時,但是函數(shù)不會修改器臨時變量值,這樣避免了想修改將于用于結(jié)構(gòu):非常適合用于結(jié)構(gòu)和類,c++加入主要為了用于這些類型的,而不是基本的內(nèi)置類7.9函數(shù)指針:假一個函數(shù)為:doublepam(int)確的指針類型為:double(*pf)(int)這與pam()的類正確的了函數(shù)指針之后,可以將函數(shù)的地址賦給它:doublepam(int);double(*pf)(int);pf=pamdouble(*pf)(int);pf=pam;doublex(*pf)(5);doublexpf(5);少次調(diào)用就有多少次拷貝,內(nèi)聯(lián)函數(shù)的運行速度比常規(guī)函數(shù)快,但是需要占用的內(nèi)存。如果代碼的執(zhí)行時間函數(shù)前加上關(guān)鍵字inline,函數(shù)定義前加上關(guān)鍵字#define b= c=a8.2變是已定義的變量的別名.修改的值和修改變量的值是一樣的效創(chuàng)建變量:intrats;int&rodents=rats;其中&不是地址操作符而是表示rodents是rats的變量,int&表示是指向int的,就像在中char*表示的是指向char的指針。rats和rodents的地址相同。必須在聲明的時進行初始化。和const類型相似,必須在時初始化。參數(shù)的方式叫做按傳遞。和按指針傳遞效果一樣。voidswapr(int&a,intvoidswapp(int*a,intvoidswapp1(int*a,int{{{inttemp=intint}intint} }intcube(x+2);x+2并不是變量參數(shù)的類型不匹配,則C++將創(chuàng)建類型正確的變量,將函數(shù)調(diào)用的參數(shù)的值傳遞給該變量,并讓參數(shù)來該變量。因為如果接受的參數(shù)的函數(shù)的意圖是修改作為參數(shù)傳遞的變量,則編譯器將會讓兩個臨時變量交換值,而原來的變量的值不變,const變量不允許改變變量的值,因此不會出錯,可行。如:refcube(constdoublex);inta;可以接受 constconstconstconst類型的數(shù)據(jù),也constconst能使函數(shù)正確的生成臨時變量,減少錯誤. struct{charname[26];charquote[64];intused;}const&sysopuse(sysop&{

sysopref.used++;returnsysopref;}int{sysop

}元的內(nèi)容將被到copycat中。然而由于use返回的是一個指向looper的。這種情況下,looper的內(nèi)容將被直接到copycat中,這是返回指向結(jié)構(gòu)的而不是結(jié)構(gòu)的優(yōu)點:效率更高返回時需要注意的問題:避免返回當(dāng)函數(shù)終止的時候不再存在的內(nèi)存單元constsysop&clone(sysop{sysopnewguy;newguy=sysopref;returnnewguy;}

constsysop&clone(sysop{sysop*newguy=new*newguy=sysopref;return*newguy;}newguyC++newdelete來釋放它們,auto_ptrint*pt;未初始化的int指針,系統(tǒng)會分配pt的空間(沒保存int的地址),即并不會分配它指向的int的空間,空間不存int*pt=newint;系統(tǒng)會分配pt的空間,并且會分配它指向的int的空間,只是int的值是不確定的。int空間存inta=5;*pt=a;這個的意思是,把a的值賦給*pt,就是把a的值寫到pt指向的int類型的空間去。前提是該空間應(yīng)該存在。use()返回類型是constsysop&。表示不能使用它返回的去修改它指向的。不能使用:use(looper).used=10;將用于類對象(使用string類作為例子const類型的變量,不能返回已經(jīng)被銷毀的變量的對象、繼承和:基類可以指向派生類對象,而如需進行強制類型轉(zhuǎn)換,可以定義一個接受基類作為參數(shù)的函數(shù),調(diào)用該函何時使用參數(shù)使用參數(shù)的主要的原因有兩個通過傳遞而不是整個數(shù)據(jù)對象,可以提高程序的運行速度。使用、指針、按住傳遞的一些指導(dǎo)原則:如果數(shù)據(jù)對象是數(shù)組,則使用指針,因為這是唯一的選擇,并將指針為指向const的指如果數(shù)據(jù)對象是較大的結(jié)構(gòu),則使用const指針或const,以提高效率,節(jié)省空間和時如果數(shù)據(jù)對象是類對象,則使用const。類設(shè)計的語義常常要求使用。傳遞類對象參數(shù)的標(biāo)準(zhǔn)方式是按傳遞。對于修改調(diào)用函數(shù)中數(shù)據(jù)的函數(shù)如果數(shù)據(jù)對象是結(jié)構(gòu),則使用或指如果數(shù)據(jù)對象是類對象。則使用通過函數(shù)原型來設(shè)定默認(rèn)值,如:char*left(constchar*strinti1);iintone(intn,intm=4,int inttwo(intn,intm=5,intj); intthree(intn=1,intm=4,intj=5);//valid

beers=one(2);//thesameas:one(2,4,5);beers=one(1,2);//thesameas:one(1,2,5);beers=one(1,2,3);//thesameas:但是一些看起來彼此不同的特征表不能共存,如:doublecube(doublex); doublecube(double&x);因為:doublex3;cuble(3);與這兩個原型都匹配,系統(tǒng)不知道調(diào)用哪個原型,因此它們不允許共存。temte<classvoidSwap(Any&a,Any{Anytemp=a;}

temte<typenameAny>voidSwap(Any&a,Any&b){Anytemp=a;}以上兩者等價。第一行要建立一個模板,并將類型命名為Any調(diào)用的方式為:inti=1;int doublex=1.0;doubley=2.0;intdouble版本,不需要程序員參與。temte<classvoidSwap(Anya[],Anyb[],int{Any{

temte<classvoidSwap(Any&a,Any{Anytemp=a;}inti=1;intintd1[]={1,3};intd2={5,4};int}}name,則需要提供一個具體化函數(shù)定義(稱為顯示具體顯示具體化的原型和定義,應(yīng)該以temte<>打頭,并通過名稱來類型非模板函數(shù)(正常函數(shù):voidswap(sysop&,sysop&)模板函數(shù) temte<Any>voidswap(Any&,Any temte<>voidswap(sysop&,sysop&)、temte<>voidswap<sysop>(sysop&,sysop&)swap(x,j);int顯示實例化:temtevoidswap<int>(int,int&)所需要的類型int,并加上關(guān)鍵字temte,編譯器會使用int顯示具體化:temte<>voidswap(int&,int&)或等價:temte<>voidswap<int>(int&,int&)。意思是:不要使swap()int類型生成函數(shù)定義,這些原型需要:temte<>voidswap<int>(int&,int定義:temte<>voidswap<int>(int&,int&){….實現(xiàn)具體過程變量是一種指針,主要被用作處理類和結(jié)構(gòu)對象的函數(shù)的參數(shù)#ifndef #define 9.2持續(xù)性、作用域和自動持續(xù)性:在函數(shù)定義中的變量的持續(xù)性為自動的。函數(shù)結(jié)束后自動銷靜態(tài)持續(xù)性:在函數(shù)定義外定義的變量和使用關(guān)鍵字static定義的變量的持續(xù)性都是靜態(tài)的內(nèi)存的持續(xù)性為動態(tài),有時又稱為自由。作用域和在默認(rèn)情況下,在函數(shù)中的函數(shù)參數(shù)和變量的持續(xù)性為自動,作用域是局部的,沒有性。(LIFO性。關(guān)鍵字register表示變量不在堆棧里,而是在cpu的寄存器中,以方便快速。registerintireg=9;如果變量在寄存器中則沒有內(nèi)存地址,因此不能對它進行取地址操作,因此&ireg是錯誤的。0intglobal=1000;doublewarming=0.4;staticintone_file=50;intmain() …..return0;

voidupdate(double{externdoublewarming;}

void staticdoubleau=90;doublewarming=8;doublea=::warming;}global的持續(xù)性為靜態(tài),作用域是整個文件,性為外部,即另外的文件也能one_file的持續(xù)性為靜態(tài),作用域是整個文件,性為內(nèi)部,即只有這個文件能它,其他文件不行1,靜態(tài)持續(xù)性,外部externdublewarming;表示使用extern對warming變量進行重新,該關(guān)鍵字的意思是,使用以前被外部定義的(::local()中,::warmingwarming(warming都需要使用extern該變量)2,靜態(tài)持續(xù)性,內(nèi)部staticintone_file=50;表示one_file只能在這個文件中使用,其他文件不能它3,靜態(tài)持續(xù)性,無在函數(shù)內(nèi)部定義的使用static修飾的變量,無性。員依然可以被修改,不受const限制)在同一個中不能使用多個說明符。vc限定符:const(限定變量不能修改)\volatile(變量隨時可能被改,每次取值都須變量,不能讀緩存static屬文件私有的,這就是能夠?qū)⒊A慷x放在頭文件中(可以被任何文件)的原因如果出于某種原因,程序員想要將const常量的性變成外部,可以使用extern來覆蓋默認(rèn)的內(nèi)部性externconstintaa=100;這種情況下,必須在所有使用該常量的文件中用extern關(guān)鍵字來,并且初始化。C++不允許在一個函數(shù)內(nèi)定義另一個函數(shù)因此所有的函數(shù)的持續(xù)性都是靜態(tài)的在整個程序執(zhí)行期間都存在。默認(rèn)為性是外部的。但是有static修飾過,性即為內(nèi)部的。必須同時在原型和函數(shù)定義中使用static關(guān)鍵語言性(language編譯器執(zhí)行名稱矯正或名稱修飾,為重載函數(shù)生成不同的符號名稱。叫做語言性newnewdeletenew操作符建立類對12章中講述。頭文件為:#include<new>structchaff{chardross[20];intslag;charbuffer1[50];char

int{chaffint*p3,*p4;*p5,*p6p1=newchaff;p3=newint[20];p2=new(buffer1)chaff;p4=new(buffer2)int;p5=new(buffer2)int;}p2=new(buffer1)chaff;p4=new(buffer2)int;buffer1、buffer2p5會覆蓋p4值的內(nèi)存塊,但是p6不會,會接著p4的地址重新分配內(nèi)存區(qū)域:可以在其中進行的區(qū)域,其有效的區(qū)域。比如全局變量則區(qū)域為所在的文件,局部變量其區(qū)域為所在的代碼塊。潛在作用域:點開始,到其區(qū)域的結(jié)尾。潛在作用域比區(qū)域小。變量必須定以后才能使域中的同名變量所隱藏??臻g里的名稱,同時允許程序的其他部分使用該名稱空間中的東西。namespace{doublepail;intpal;struct}

namespace{doublebucket(doublen){……};voidfetch();intstruct}通過作用解析操作符(::)來名稱空間的名稱:Jack::pal=using和using編譯指我們不希望每次都使用作用解析操作符來名稱空間里的名稱,因此使用using和using編譯指令來簡化using由被限定的名稱和它前面的關(guān)鍵字using組成:usingJill::fetch;using編譯指令使所有的名稱可用:usingnamespaceJill;using和using編譯指令的比使用using編譯指令導(dǎo)入一個名稱空間中所有的名稱,相當(dāng)于大量使用作用域解析操作符。區(qū)域中依然可以定使用using時,就像了相應(yīng)的名稱一樣。不能在作用空間里定義同名變量。namespaceone{namespacetwo{intn;}}使用方法:usingnamespaceone::two;using未命名的名稱空間 {int int該名稱空間中的名稱的潛在作用域為:從點到區(qū)域末尾。由于沒有名稱,所以不能被其他程序調(diào)用C++staticintcounts; intothers; int

namespace{intcounts;}intothers;int導(dǎo)入名稱時,首選使用作用解析操作符或using的方法對于using,首選將其作用域設(shè)置為局部而不是全局C++類型:決定了數(shù)據(jù)對象需要的內(nèi)存數(shù)量;決定了如何解釋內(nèi)存中的位(longfloat內(nèi)存中占用的位數(shù)相同,但是是一種將抽象轉(zhuǎn)化為用戶數(shù)據(jù)類型的#include<cstring>class //類的{charintshares;doubletotal_val;

Stock(constchar*co,intmum=0,doubleprice=0.0);voidacquire(constchar*co,intn,doublepr);voidbuy(intnum,doubleprice);voidsell(intnum,doubleprice);voidupdate(doubleprice);voidStock::Stock(constchar*co,intnum,double{std::strncyp(if(n<0)shares=0;elseshares=n;}voidStock::acquire(constchar*co,intn,double

voidStock::buy(intnum,doublevoidStock::sell(intnum,doublevoidStock::update(doublevoid類:以數(shù)據(jù)成員的方式描述數(shù)據(jù)部分,以成員函數(shù)(又稱為方法)的形式描述公有接口。接口:接口是一個共享框架,供兩個系統(tǒng)(如兩個類之間,或者計算機和之間……)交互時使用分開被稱為封裝。封裝的另一個例子是:將類函數(shù)的定義和類放在不同的文件中。控制對成員的:public、private。可以不必在類中使用關(guān)鍵字private,這是類對象的默認(rèn)控制類和結(jié)構(gòu):結(jié)構(gòu)的默認(rèn)類型是public,類的為private定義成員函數(shù)時,使用作用域解析操作符(::)voidStock::update(double類方法可以類的private組內(nèi)聯(lián)方法:其定義位于類中的函數(shù)都將自動成為內(nèi)聯(lián)函數(shù),如果愿意也可以將類外定義的函數(shù)定義為內(nèi)聯(lián)inline限定符。方法定義,然后在類的后面將定義改寫為內(nèi)聯(lián)函數(shù)。因此定義位于類中的函數(shù),和定義緊跟類后,并inline限定符的函數(shù)是等價的。struct charint

thingabc={“worry”,22}; stockhot={“shock”,200,50};//invalidprivate,不能直接數(shù)頭雖然沒有返回值,但是沒有被為void類型。實際上,構(gòu)造函數(shù)沒有類型。Stock::Stock(constchar*,intshares,doubleshare_val) Stockfood(“worldcabbage”,250,1.25);Stock*pfood=newStock(“world類為Stockfood;時,如果類沒有提供任何構(gòu)造函數(shù),則C++將自動提供默認(rèn)構(gòu)造函數(shù)Stock::Stock(){},但是price){}如果提供了非默認(rèn)構(gòu)造函數(shù),但沒有提默認(rèn)構(gòu)造函數(shù),則為Stockfood;將會出錯。如果要創(chuàng)建對象,而不顯式構(gòu)造函數(shù)的所有參數(shù)提供默認(rèn)值:Stock(constchar*co=”Noname”,intmum=0,doubleprice=0.0);,一個是,通過函數(shù)重載來定義另一個構(gòu)造函數(shù),一個沒有任何參數(shù)的構(gòu)造函數(shù):Stock();Stock::Stock(){….}用構(gòu)造函數(shù)創(chuàng)建對象后,程序負(fù)責(zé)對象,直到其過期為止,對象過期時,程序自動調(diào)用析構(gòu)函數(shù),析構(gòu)函數(shù)完成 Stock::~Stock(){};自動調(diào)用析構(gòu)函數(shù)。程序必須有一個析構(gòu)函數(shù),如果程序員沒有提供,則編譯器將隱式地一個默認(rèn)析構(gòu)函數(shù)。const成員函數(shù)constStock 為const或指向const的指針來解決這種問題,但是show()方法沒有任何參數(shù)。想法,他所使用的對象都是由方法調(diào)用隱式地提供的。保證函數(shù)不會修改調(diào)用對象的另法是:把show()稱:voidshow()const;將const和指針用作函數(shù)形參一樣,只要類方法不修改調(diào)用對象,就應(yīng)將其為const。如,構(gòu)造函數(shù)原型為:Bozo(intage);則可以使用下面的任何一種形式來初始化對象:Bozoone= Bozo Bozothreethisthisthis(包括構(gòu)造函數(shù)和析構(gòu)函數(shù))都有一個this指針。this指針指向調(diào)用對象。如果方法要整個調(diào)用對象,則可以使用對象數(shù)組的方法與標(biāo)準(zhǔn)數(shù)組的方法相同。可以分別用構(gòu)造函數(shù)來初始化數(shù)組元素Stockstock[10]={Stock(“Smart”,12,120),Stock(),Stock(“Momo”,13,10)};前三個按照規(guī)定的初始化,其他用默認(rèn)構(gòu)造函數(shù)然后將臨時對象的內(nèi)容到相應(yīng)的元素中。因此,要創(chuàng)建類對象數(shù)組,則這個類必須有默認(rèn)構(gòu)造函數(shù)10.7的,在類外是不可知的。因此,可以在不同的類中間使用同名的成員,不會。外部也不能直接類成員,公類中不能const類型常量,因為const常量必須在時初始化,但類只是描述了對象的形式,并沒有真正創(chuàng)建對象,因此沒有用于的空間在類中常量有兩種方法第一種在類中一個枚舉classStock{char}

classStock{staticconstintLen=30; }10.9如:Timeoperator+(constTime&t)const;TimeTime::operator+(constTime&t)const{Timesum.minutes=minutes+t.minutessum.hours=hours+t.hours;return}的參數(shù)也不會被用到,所以不必指定其名稱。 2,使用操作符時不能操作符的原來的句則,不能改變操作符的優(yōu)先簡介:函數(shù),類,成員函TimedoubleA=B*2.45為 然而A=2.45*B則不能轉(zhuǎn)換有一種解決方式,非成員函數(shù)。原型為:Timeoperate*(doublem,constTime&t);A=2.45*B但是常規(guī)非成員函數(shù)不能直接類的私有數(shù)據(jù),但,有一類特殊的非成員函數(shù)可以私有成員,叫做函數(shù)函數(shù),放在類里面:friendTimeoperate*(doublem,constTime&t);friendTimeoperate*(doublem,constTime&t){….函數(shù)的權(quán)限與成員函數(shù)相同,都可以類的私有成員函數(shù)是否有悖于oop:只有類可以決定哪一個函數(shù)是,因此類仍然控制了那些函數(shù)可以私有數(shù)據(jù)。簡而言之,類方法和只是表達類接口的兩種不同機制。如果要為類重載操作符,并將非類的一項作為其第一個操作數(shù),則可以使元函數(shù)來反轉(zhuǎn)操作數(shù)。對于很多操作符來說可以選擇使用成員函數(shù)或非成員函數(shù)來實現(xiàn)操作符重載一般來說非成員函數(shù)是函數(shù),這樣才能類的私有成員。如:Timeoperate+constTime&t)const;friendTimeoprate+(constTime&t1constTime&T2)將轉(zhuǎn)化為 靜態(tài)類成員特點:無論創(chuàng)建了多少對象,static。在類的時候不能對靜態(tài)數(shù)據(jù)成員進行初始化,靜態(tài)數(shù)據(jù)成員在類中,在包含類方法的文件中(類定義的時候)初始化。初始化時使用作用域操作符來靜態(tài)成員所屬的類,但是如果靜態(tài)成員是整型或枚舉型const,則可以在類中初始化。在構(gòu)造函數(shù)中使用new來分配內(nèi)存是必須在相應(yīng)析構(gòu)函數(shù)中使用delete來釋放內(nèi)存如果使用new[]來分配內(nèi)存,則應(yīng)使用delete[]來釋放內(nèi)存。如:inta=newint();deletea; 和char*a=newchar[];delete[]a;StringBadsailors=sports;StringBadsailors=StringBad(sports);構(gòu)造函數(shù)原型為:StringBad(constStringBad&);因為C++自動提供了下面這些成員函數(shù):默認(rèn)構(gòu)造函數(shù)、構(gòu)造函數(shù)、賦值操作符、默認(rèn)析構(gòu)函數(shù)、地址操作符。默認(rèn)構(gòu)造函數(shù)Class_namea;將不知道調(diào)用哪個構(gòu)造函數(shù)。構(gòu)造函數(shù):構(gòu)造函數(shù)用于將一個對象到新創(chuàng)建的對象中,它用于初始化過程中,而不是常規(guī)的賦值過程中。原型如下:Class_name(constClass_name&);它接受一個指向類對象的常量作為參數(shù)。新建一個對象并將它初始化為同類現(xiàn)有對象時,構(gòu)造函數(shù)將會被調(diào)用。以下四種都將調(diào)用構(gòu)造函1.Class_namea(b);2.Class_namea=b;3.Class_namea=Class_name(b);4.Class_name*pa=new其間的兩種可能會使用構(gòu)造函數(shù)直接創(chuàng)建對象,也可能使用構(gòu)造函數(shù)生成一個臨時對象。然后將臨時對象的內(nèi)容賦給a,這取決于具體的實現(xiàn),第4個使用b初始化一個對象,并將新對象的地址賦給pa指每當(dāng)程序生成了對象副本時,編譯器都將使用構(gòu)造函數(shù)。具體來說,當(dāng)函數(shù)按值傳遞對象或函數(shù)返回對象時,都將使用構(gòu)造函數(shù)。按值傳遞意味著創(chuàng)建元是變量的一個副本,編譯器生成臨時對象是,也將使用構(gòu)造函功能、問題、解決方法:默認(rèn)構(gòu)造函數(shù)逐個非靜態(tài)成員(成員也叫淺的是成員的值,即如為深度,的另一種形式(成員或淺)只是指針值。淺僅淺淺的指針信息,而不會深入挖掘來指針的結(jié)構(gòu)。操作符:Class_name&Class_name::operator=(constClass_nameC允許結(jié)構(gòu),而C++允許類對象,這個通過自動為類重載賦值操作符實現(xiàn)的。將已有的對象賦值給另一個對象時,將使用重載的賦值操作符:StringBada(“I’mbadstring.”);Stringbadb;b=a; =knot;這個是新創(chuàng)建的對象 ,初始化為knot的值,因此使用構(gòu)造函數(shù),不過也可能會分兩步來處理,使用構(gòu)造函數(shù)創(chuàng)建一個臨時變量,然后使用操作符將臨時對象的值到新對象中。與構(gòu)造函數(shù)相似,操作符的隱式實現(xiàn)也對成員進行逐個,如果成員本身就是類對象,則程序?qū)⑹褂脼檫@個類定義的操作符來該成員,但靜態(tài)數(shù)據(jù)成員不受影響。StringBad&StringBad::operator=(constStringBad{if(this=&st)return*this;delete[]str;str=newchar[len+1];return*this;}的,可以使用類名和作用域解析操作符來調(diào)用它。staticintHowMany(){returnnum_str;}intcount=String::HowMany();由于靜態(tài)成員函數(shù)只與特定的對象相關(guān)聯(lián),因此只能使用靜態(tài)數(shù)據(jù)成員,如靜態(tài)方法HowMany只能靜態(tài)成員num_str,不能strlen。newdeletenewdelete必須相互兼容。new數(shù)中將指針初始化為空(NULL0delete(無論是帶中括號還是不帶中括號)都可以用于空指針。應(yīng)定義一個構(gòu)造函數(shù),通過深度將一個對象初始化為另一個對象。應(yīng)當(dāng)定義一個賦值操作符,通過深度將一個對象賦值給另一個對象當(dāng)成員函數(shù)或獨立的函數(shù)返回對象時,有幾種返回方式可供選擇,返回指向?qū)ο蟮?,指向?qū)ο蟮腸onst,const對象。如果方法或函數(shù)要返回局部對象,則應(yīng)返回對象,而不是指向?qū)ο蟮?。這種情況下將使用構(gòu)造函數(shù)來生成返回的對象。如果方法或函數(shù)要返回一個沒有公有構(gòu)造函數(shù)的類(如ostream)的對象,它必須返回一個指向這種對象的。使用常規(guī)表示法來指向?qū)ο蟮闹羔槪篠tring:Stringnew來初始化指針,這將創(chuàng)建一個新的對象:String*favorite=newnewString*a=newString; String*b=newString(“bbb”); //String(constchar*);String*c=newString //String(constString可以使用->操作符通過指針類方法:a-可以對對象指針應(yīng)用解除操作符(*)來獲得對象:Stringd=new程序員必須負(fù)責(zé)管理布局new操作符從中使用的緩沖區(qū)內(nèi)存單元,防止兩個變量的內(nèi)存單元newnewdelete配合使new操作符創(chuàng)建的對對象都被銷毀后,才能釋放用于這些對象的緩沖區(qū)。class{intnumber;JustTesting(Conststring&s=“JustTesting”,intn=0){words=s;number=n;cout<<words<<”~JustTesting(){cout<<words<<”destoryed;\n”;}show()const{cout<<words<<”,

int{char*buffer=newchar[512];JustTesting*p1,*p2;p1=new(buffer)JustTesting; p4=newdeletep2;deletedelete[]buffer;}轉(zhuǎn)換函數(shù)(11.6類的自動轉(zhuǎn)換和強制轉(zhuǎn)換,并未細(xì)看(c_name(type_name在轉(zhuǎn)換函數(shù)時要,可以在構(gòu)造函數(shù)式使用關(guān)鍵字explicit,防止它被用于隱式轉(zhuǎn)換。在類中可以嵌套結(jié)構(gòu)或者類。這樣它們的作用域是內(nèi)部的,只是在類中使用。classconstClass constintsize;int&count;}

{size=a; count= }由于調(diào)用構(gòu)造函數(shù)時,對象將在大括號中的代碼執(zhí)行之前被創(chuàng)建。但是const和對象必須在創(chuàng)建對象時被初始由分隔的初始化列表組成完成(前面帶冒號。只有構(gòu)造函數(shù)能夠使用這種初始化列表句法。const類成員,被為的類成員必須使用這個句法,其他類成員也可以使用。newdelete來釋放分配的內(nèi)保護方法。派生類對象特征:派生類對象了基類的數(shù)據(jù)成員(派生類繼承了基類的實現(xiàn)。派生類對象可以使用基類的方 yer:: 如果省略成員初始化列表 yer:: yer(unsignedintr,constchar*fn,constchar*ln,bool等效于 yer:: yer(unsignedintr,constchar*fn,constchar*ln,boolht): yer()類對象;基類可以在不進行顯式轉(zhuǎn)換時派生類對象,不過基類指針或只能調(diào)用基類方法。即派生類對象或地址可以賦值給基類或指針,但不可以將基類對象和地址賦給派生類和指針。此匹配是單向的。繼承——is-ais-a關(guān)系,即派生類對象也是一個基類對象,可以對基類對象執(zhí)行任何is-a-kind-of,比如,蘋果是一種水果。class{enum{MAX=charfullName[MAX];longacctNum;doublebalance;Brass(constchar*s="Nullbody",longan=-1,doublebal=0.0);voidDeposit(doublevirtualvoidWithdraw(doubleamt);doubleBalance()const;virtualvoidViewAcct()const;virtual~Brass(){}Brass類在BrassPiggy("PorcelotPigg",381299,BrassPlusHoggy("HoratioHogg",382288,3000.00);Brass&b1_ref=Piggy;Brass&b2_ref=b1_refViewAcct();//useBrassViewAcct()b2_refViewAcct();//useBrassViewAcct()ViewAcct()是虛擬的,則:b1_ref.ViewAcct();//useBrass::ViewAcct()b2_ref.ViewAcct();//useBrassPlus::

classBrassPlus:public{doublemaxLoan,rate,owesBank;BrassPlus(constchar*s="Nullbody",longan=-1,doublebal=0.0,doubleml=500,doubler=0.10);BrassPlus(constBrass&ba,doubleml=500,double=virtualvoidvirtualvoidWithdraw(doublevoidResetMax(doublem){maxLoan=m;}voidResetRate(doubler){rate=r;};voidResetOwes(){owesBank=0;虛函數(shù)的這種行為十分方便,因此,經(jīng)常在基類中將派生類會重新定義的方法為虛方法,方法在基類中為基類中了一個虛擬析構(gòu)函數(shù),這樣做是為了確保釋放派生對象時,按正確的順序調(diào)用析構(gòu)函數(shù)BrassPlus::BrassPlus(constBrass&ba,doubleml,double:Brass(ba)//usesimplicitcopy

maxLoan=owesBank=0.0;rate=r;}voidBrassPlus::ViewAcct(){

//disybaseportioncout<<"umloan:$"<<maxLoan<<endl;cout<<"Owedtobank:$"<<owesBank<<endl;cout<<"LoanRate:"<<100*rate<<"%\n";}為何需要虛擬析構(gòu)函數(shù):對于前一個示例,兩個Brass的一個指向Brass對象,一個指向BrassPlus對象,如果的函數(shù)特征標(biāo)覆蓋基類而是隱藏同名的基類方法不管參數(shù)特征標(biāo)如何但如果返回類型是基類或指針,則可以修改為指向派生類的或指針這種特性被成為返回類型協(xié)變因為允許返回類型隨類類型的變化而變化。如果基類被重載了,則應(yīng)在派生類中重新定義所有的基類版本。不然另外的重載版本將被隱藏,派生類對象無關(guān)鍵字protected與private相似,在類外只能用公有類成員protected部分中的成員,protected與private的區(qū)的私有成員private。對外部世界來說,保護成員和私有成員相似,對派生類來護成員和公有成員相似。純虛函數(shù)virtualvoidViewAcct()const= 純虛函數(shù)的結(jié)尾處為當(dāng)類中包含純虛函數(shù)時,則不能創(chuàng)建該類的對象,只能用作基類ABC看作是一種必須實施的借口,ABC要求具體派生類覆蓋其純虛函數(shù)——迫使派生類遵循ABCABC指定的功能。如果基類使用動態(tài)內(nèi)存分配,并重新定義賦值和構(gòu)造函數(shù)派生類不使用new:那么派生類可以使用默認(rèn)析構(gòu)函數(shù),默認(rèn)賦值函數(shù),默認(rèn)構(gòu)造函數(shù)。因為,派生類都會派生類使用了new:這種情況下,必須為派生類定義顯式的析構(gòu)函數(shù)、構(gòu)造函數(shù)和賦值函數(shù)。派生類的析構(gòu)baseDMA&baseDMA::operator=(constbaseDMA&{If(this==&hs)return*this;delete[]label;label=newchar[std::strlen(hs.label)+1];return*this;

hasDMA&hasDMA::operator=(consthasDMA&{If(this==&hs)return*this;style=newchar[std::strlen(hs.style)+1];return}} //相當(dāng)于使用基類的=操作符,把hs調(diào)用基類的=操作符執(zhí)行:*this=hs;將基類hasDMA類(派生類)的friendstd::ostream&operator<<(std::ostream&os,consthasDMA&rs);baseDMA類(基類)的friendstd::ostream&operator<<(std::ostream&os,constbaseDMA&rs); baseDMA&rs){os<<”Label:”<<rs.label<<endl;returnos;}

hasDMA&rs){os<<(constbaseDMA&)hs;os<<”Style;”<<hs.style<<endl;returnos;}os<<(constbaseDMA&)hs因為不是成員函數(shù),因此不能使用作用于解析操作符來要使用哪個函數(shù),所以使構(gòu)造函數(shù)接受其所屬類的對象作為參數(shù),如 Class_name&執(zhí)行成員初始化的構(gòu)造函數(shù)。也就是說,新對象的每個成員都被初始化為原始對象相應(yīng)成員的值。在某些情況下,默認(rèn)構(gòu)造函數(shù)的成員初始化是不合適的,如,使用new初始化的成員指針通常要求執(zhí)行深制,或者類可能包含需要修改的靜態(tài)變量,上述情況,需要自己定義構(gòu)造函數(shù)如果需要顯式定義構(gòu)造函數(shù),則基于相同的原因,也需要顯式定義賦值操作符。使用一個參數(shù)就可以調(diào)用的構(gòu)造函數(shù)定義了從參數(shù)類型到類類型的轉(zhuǎn)換。例如,下述star類的構(gòu)造函數(shù)原型:Star(constchar*);//char*轉(zhuǎn)換為Star Star(constSpectral&,intmembers=1);//Spectral轉(zhuǎn)化成StarStarnorth;north=”polaris”;Star::operator=(constStar*)Star::Star(constchar*)生成一個Star對象,該對象將被用作上述操作符函數(shù)的參數(shù),這里假設(shè)沒有定義將char*賦給Star的賦值操作符。在帶一個參數(shù)的構(gòu)造函數(shù)原型中使用explicit將進行隱式轉(zhuǎn)換,但仍允許顯式轉(zhuǎn)換Class

StarStar=”polaris”; //notallowedStar=Star(“polaris”); 通常,編寫使用對象作為參數(shù)的函數(shù)時,應(yīng)按而不是按值傳遞對象。這樣做的原因之一是為了提高效率。按值比傳遞花費的時間要多得多。如果函數(shù)不修改對象,應(yīng)將參數(shù)為const。按傳遞對象的另外一個原因是,在繼承使用虛函數(shù)時,被定義為接受基類參數(shù)的函數(shù)可以接受派生一些類方法返回對象,有些成員函數(shù)直接返回對象,而另一些則返回,有時必須返回對象,但如果可以步返回對象,則應(yīng)返回,而不是返回對象。調(diào)用構(gòu)造函數(shù)來聲稱拷貝所需的時間和調(diào)用析構(gòu)函數(shù)刪除拷貝所需的時間。返回可節(jié)省時間和內(nèi)存,直接返回對象與按值傳遞對象相似:它們都生成臨時拷貝。同樣返回與按傳遞對象相似:調(diào)用和被調(diào)用的函數(shù)不過,并不總是可以返回,函數(shù)不能返回在函數(shù)中創(chuàng)建的臨時對象的,因為當(dāng)函數(shù)結(jié)束時,臨時對象將消失,因此這種將是的,在這種情況下,應(yīng)返回對象,以生成一個調(diào)用程序可以使用的拷貝。通用規(guī)則是,如果函數(shù)返回在函數(shù)中創(chuàng)建的臨時對象,則不要使用。如,加法后的返回值。如果函數(shù)返回的是通過或指針傳遞給他的對象,則應(yīng)按返回對象??梢允褂盟鼇泶_保方法不修改參數(shù):Star::Star(constchar*s){…}//const來確保方法不修改調(diào)用他的對象:voidStar::show()const{…}constconstStar*this通常,可以將返回的函數(shù)放在賦值語句的左側(cè),這實際上意味著可以將值賦給的對象,但可以使用來確?;蛑羔樂祷刂挡荒苡糜谛薷膶ο笾械臄?shù)據(jù)constStock&Stock::topval(constStock&s){elsereturn*this;}該方法返回this或s的,因為都被為const,所以函數(shù)不能對它們進行修改,這意味著返回的也必須被const注意,如果函數(shù)將參數(shù)為指向const的或指針,則不能將該參數(shù)傳遞給另一個函數(shù),除非后者也確保了參C++has-a//class{typedefstd::valarray<double>ArrayDb;std::stringname; //containedobjectArrayDb //contained…..

// {}有繼承將對象作為一個未被命名的繼承對象添加到類中。使用屬于子對象來表示通過繼承或包含添加對象。classstudent:privatestd::string,privatenamescores來描述對象了。例如包含將使用這樣的構(gòu)造函數(shù):Student(constchar*str,constdouble*pd,intn):name(str),scores(pd,n){}Student(constchar*str,constdouble*pd,intn):std::string(str),std::valarray<double>(pd,n){//{if(scores.size()>returnreturn}

//{if(ArrayDb::size()>returnreturn}如果需要使用基類對象本身,那么派生類的代碼如何內(nèi)部的基類的未命名對象呢?使用強制類型轉(zhuǎn)換繼承而來的string對象。如下返回一個,該指向用于調(diào)用該方法的student對象中的繼承而來的string對conststring&Student::Name() return(conststring&) 基類的函ostream&operator<<(ostream&os,constStudent&{os<<"Scoresfor"<<(conststring&)stu <<":\n";returnos;}C++派生類可以重新定義虛函數(shù),但包含類不能。使用私有繼承,從新定義的函數(shù)將只能在類中使用,不是公有的。通常,應(yīng)使用包含來建立ha-a關(guān);如果新類需要原有類的保護成員,或需要重新定義虛函數(shù),則應(yīng)使用私有繼承。classStudent:privatestd::string,private 只能通過基類接口只能通過基類接口只能通過基類接口能能(只能在類內(nèi)使用using重新定義權(quán)方法之一是定義一個使用該基類方法的派生類方法;外法是,將函數(shù)調(diào)用包裝在另一個函數(shù)調(diào)用中,即使用一個using(就像名稱空間一樣)來派生類可以使用特定的基類成員,即使采用的是私有派生。doubleStudent::sum(){return return}

classStudent:privatestd::string,privateusingstd::valarray<double>::min;usingMI可能會給程序員帶來許多新問題從兩個不同的基類繼承同名方法從兩個或相關(guān)基類那里繼承同一個類的WorkerSingerWaiterSinger、WaiterSingingWaiter。SingerWaiter都繼承了須使用類型轉(zhuǎn)換來指定對象:Worker*pw=(Waiter*)&ed;或Worker*pw=(Singer*)&ed;虛基類實得從多個(它們的基類相同派生出的對象只繼承一個基類對象例如通過在類中使用關(guān)鍵字virtual,WorkerSingerWaiter的虛基類(virtualpublic的次序無關(guān)緊要)classWaiter:virtualpublicWorker{….} classSinger:publicvirtualWorker{….}classSingingWaiter:publicSinger,publicWaiter{….}現(xiàn)在SingingWaiter對象只包含Worker對象的一個拷貝從本質(zhì)上來說繼承的Singer和Waiter對象共個Worker種,C++在基類是虛擬的時,信息通過中間類自動傳遞給基類。不過編譯器必須在構(gòu)造派生對象之前構(gòu)造Worker的默認(rèn)構(gòu)造函數(shù)。于非虛基類,則是的。singingWaitershowshow方法,多重繼承可能導(dǎo)致函數(shù)調(diào)用的二義性。可以使用作用域解析操作符來確定調(diào)用它:singingWaitersw;sw.Singer::show()singingWaitershowvoidsingingWaiter::show(){Singer::show();Waiter::show();WorkerWaiter組件Singer組件(WaiterSinger組件)singingWaiter::show()方法中將組件組合起來{cout<<"Name:"<<fullname<<endl;cout<<"EmployeeID:"<<id<<}voidWaiter::Data(){cout<<"Panacherating:"<<panache<<}voidSinger::Data(){cout<<"Vocalrange:"<<pv[voice]<<MI

{}voidSingingWaiter::Show(){cout<<"Category:singingWaiter\n";}如果某個名稱優(yōu)先于其他所有名稱,則使用它時,即使不使用限定符(作用域解析操作符MI首先復(fù)下不使用虛基類的MI,這種形式的MI不會引入新的規(guī)則,不過如果一個類從兩個不同的類那里繼承了兩個同名的成員,則需要在派生類中使用類限定符來區(qū)分它們。否則,編譯器將二義性有間接虛基類的派生類包含直接調(diào)用間接基類構(gòu)造函數(shù)的構(gòu)造函數(shù),這對于間接非虛基類來說是的;正如看到的。MI會增加編程的復(fù)雜程度,不過,這種復(fù)雜性主要是由于派生類通過多條途徑繼承同一個基類引起temte<classType>classStack{enum{MAX=10};Typeitems[MAX];inttop;

boolisempty();boolisfull();boolpush(constType&item);boolpop(Type&item);temte<classType>

top=}temte<classbool{returntop==}類型替換他,可以使用不太容易的關(guān)鍵字typename代替class開頭:exporttemte<classType>classStack{….},將方法定義放在源代碼文件中,包含頭文件,保證可用。Stack<int> Stack<string>has-a的關(guān)系。使用私有繼承時,基類的公有成員和保護成員將成為派生類的私有成員;使用保情況下,基類指針或?qū)⒉荒苤赶蚺缮悓ο?。還可以通過開發(fā)包含對象成員的類來重用類代碼,這種方法被成為包含、層次化或組合,它建立的也是has-a多重繼承(MI)MIMIhas-aMI建立類定義(實例化)在類對象并指定特定類型是生成classIc<shortsic;//Ic<short>,Ic<short>temteclassIc<int>;//顯示實例化,編譯器將稱一個int具體化——Ic<int>雖然尚未請求這個類的對temte<>classIc<char*>//顯示具體化—覆蓋模版定義的具體類,從新。類型參數(shù)為char*將使用定類模版可以被部分具體化:temte<classT>Pals<T,T,10>{…}當(dāng)n的值為10時,建立了一個具體化。所有這些機制的目的都是為了讓程序員能夠重用經(jīng)過測試的代碼,而不用手工它們。這樣可以簡化編程工第十五章、異常和其15.1類并非只能擁有函數(shù),也可以將類作為,在這種情況下,類的所有方法都可以原始類的私有比如電視機TV類,和Remote類,既不是is-a的關(guān)系,也不是has-a的關(guān)系,事實上,可以改變電視機狀態(tài),則表明應(yīng)將Remote類作為TV類的一個。class{friendclass //

class{//函friendvoidRemote::set_chan(Tv&t,intc);共同的:函數(shù)需要兩個類的私有數(shù)據(jù),它可以是一個類的成員,同時是另一個類的,不過又是將函數(shù)作為兩個類的更合理。在C++中,可以將類放在另一個類中,在另一個類中的類被稱為嵌套類。它通過新的類型類作用域來避免名稱。包含類的成員函數(shù)可以創(chuàng)建和使用被嵌套類的對象;而僅當(dāng)位于公共部分才能在包含類的外面使用了一種類型,該類型僅在包含嵌套類的類中有效些地方可以使用嵌套類以及如何使用嵌套類,取決于作用域和控制。作用域:如果嵌套類在另一個類的私有部分。只有那個包含類知道它。如果在保護部分,包含類和它所派生的類知道它。如果在共有部分,外部也知道它,可以使用類限定符來。類可見后,其決定作用的將是控制,包含類對嵌套類權(quán)的控制規(guī)則與對常規(guī)類相同。就是包含類對象只能顯式地嵌套類對象的公有成員。分的途徑。對異常處理有三個組成部分:異常

溫馨提示

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

評論

0/150

提交評論