版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Part1基本概念1. 求下面函數(shù)的返回值(微軟)intfunc(x){intcountx=0;while(x){countx++;x=x&(x-1);}returncountx;}x=9999。:8x21的個(gè)數(shù)。2. 什么是“”?申明和使用“”要注意哪些問(wèn)題?答:申明一個(gè)名作為其他變量名的別名。一個(gè)Part1基本概念1. 求下面函數(shù)的返回值(微軟)intfunc(x){intcountx=0;while(x){countx++;x=x&(x-1);}returncountx;}x=9999。:8x21的個(gè)數(shù)。2. 什么是“”?申明和使用“”要注意哪些問(wèn)題?答:申明一個(gè)名作為其他變量名的別名。一個(gè),類型,因此本身不占單元,系統(tǒng)也不給分配單元。不能建立數(shù)組的。3. 將“(1)傳遞”作為函數(shù)參數(shù)有哪些特點(diǎn)?給函數(shù)與傳遞指針的效果是一樣的。這時(shí),被調(diào)函數(shù)的形參就成為原來(lái)主調(diào)相應(yīng)的目標(biāo)對(duì)象(在主調(diào)函數(shù)中)的操作。(2)使用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒(méi)有產(chǎn)生實(shí)參的副本,它是直接對(duì)實(shí)參操作;較大時(shí),用比用一般變量傳遞參數(shù)的效率和所占空間都好。(3)使用指針作為函數(shù)的參數(shù)雖然也能達(dá)到與使用的效果,但是,在被調(diào)函數(shù)中同樣要給形參分配單元,且需要重復(fù)使用"*指針變量名"的形式進(jìn)行運(yùn)算,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差;另一方面,在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址作為實(shí)參。而 更容易使用,更清晰。4. 在什么時(shí)候需要使用“?!??用常。常1:inta;方式:const&名=目標(biāo)變量名;constint&ra=a;ra=1;//錯(cuò)誤a=1;//正確2:stringfoo();voidbar(string&s);那么下面的表達(dá)式將是 的:bar(foo());bar("helloworld");)和"helloworld"C++中,這些臨時(shí)對(duì)象都是類型的對(duì)象轉(zhuǎn)換為非const類型,這是 的。型參數(shù)應(yīng)該在能被定義為constra=1;//錯(cuò)誤a=1;//正確2:stringfoo();voidbar(string&s);那么下面的表達(dá)式將是 的:bar(foo());bar("helloworld");)和"helloworld"C++中,這些臨時(shí)對(duì)象都是類型的對(duì)象轉(zhuǎn)換為非const類型,這是 的。型參數(shù)應(yīng)該在能被定義為const的情況下,盡量定義為const5. 將“”作為函數(shù)返回值類型的格式、好處和需要遵守的規(guī)則?&函數(shù)名(形參列表及類型說(shuō)明){//}(注意:正是因?yàn)檫@點(diǎn)原因,所以返回一個(gè)局部變量的是不可取的。因?yàn)殡S著該局部變量生存期的結(jié)束,相應(yīng)的也會(huì)失效,產(chǎn)生runtimeerror!注意事項(xiàng):變量會(huì)在函數(shù)返回后被銷毀,因此被返回的狀態(tài)。new分配的內(nèi)存的就成為了無(wú)所指"的,程序會(huì)進(jìn)入未知C++[1]Item31。銷毀問(wèn)題,可對(duì)于這種情況(new分配內(nèi)存的引雖然不存在局部變量的用,又其它尷尬局面。例如,被函數(shù)返回的只是作為一個(gè)臨時(shí)變量出現(xiàn),而沒(méi)有l(wèi)eak。(由new分配就無(wú)法memory(3可以返回類成員的EffectiveC++[1]Item30。主要原因是當(dāng)對(duì)象的屬性是與某種業(yè)務(wù)規(guī)則(businessrule)相關(guān)聯(lián)的時(shí)候,其賦值常常與規(guī)則的完整性。(4)流操作符重載返回值申明為“(或指針,那么對(duì)該屬性的單純賦值就會(huì)破壞業(yè)務(wù)”的作用:<<"hello"<<endl; 因此這兩個(gè)操作符的返回值應(yīng)該是一個(gè)仍然支持這兩個(gè)操作符的流。可選的其它方案包括:返回一個(gè)流對(duì)象和返回一個(gè)流對(duì)象指針。但是對(duì)于返回一個(gè)流對(duì)象,程序必須重新(拷貝)構(gòu)造一個(gè)新的流對(duì)象,也就是說(shuō),連續(xù)的兩個(gè)<<操作符實(shí)際上是針對(duì)不同對(duì)象的!這無(wú)法讓人接受。對(duì)于返回一個(gè)流指針則不能連續(xù)使用<<操作符。因此,返回一個(gè)流對(duì)象是惟一選擇。這個(gè)唯一選擇很關(guān)鍵,它說(shuō)明了 的重要性以及無(wú)可替代性,也許這就是C++語(yǔ)言中引入這個(gè)概念的原因吧。賦值操作符=。這個(gè)操作符象流操作符一樣,是可以連續(xù)使用的,例如:x=j=10;或者(x=10)=100;賦值操作符的返回值必須是一個(gè)左值,以便可以被繼續(xù)賦值。因此成了這個(gè)操作符的惟一返回值選擇。3#include<iostream.h>int&put(intn);voidmain(){put(0)=103#include<iostream.h>int&put(intn);voidmain(){put(0)=10//以put(0)函數(shù)值作為左值,等價(jià)于vals[0]=10;put(9)=20//以put(9)函數(shù)值作為左值,等價(jià)于vals[9]=20;cout<<vals[0];cout<<vals[9];}int&put(intn){if(n>=0&&n<=9)returnvals[n];else{cout<<"subscripterror";returnerror;}},EffectiveC++[1]的Item23sideeffect,變量的new分配的對(duì)象的、返回一個(gè)靜態(tài)對(duì)象 。根據(jù)前面提到的為返回值的三個(gè)規(guī)則第23兩個(gè)方案都被否決了靜態(tài)對(duì)象的 又因?yàn)?(a+b)==true而導(dǎo)致錯(cuò)誤。所以可選的只剩下返回一個(gè)對(duì)象了。6. “”與多態(tài)的關(guān)系?派生類實(shí)例。4ClassA;ClassB:ClassA{...};Bb;A&ref=b;可以指向它的7.“”與指針的區(qū)別是什么?外,就是上面提到的對(duì)函數(shù)傳ref和pointer的區(qū)別。8. 什么時(shí)候需要“”?流操作符<<和>>、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其它情況都推薦使用。9. 結(jié)構(gòu)與 有和區(qū)別?1.結(jié)構(gòu)和 都是由多個(gè)不同的數(shù)據(jù)類型成員組成,但在任何同一時(shí)刻,中只存放了(所有成員共用一塊地址空間),而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同。2.對(duì)于的不同成員賦值,將會(huì)對(duì)其它成員重寫(xiě),原來(lái)成員的值就不存在了,而對(duì)于結(jié)8. 什么時(shí)候需要“”?流操作符<<和>>、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其它情況都推薦使用。9. 結(jié)構(gòu)與 有和區(qū)別?1.結(jié)構(gòu)和 都是由多個(gè)不同的數(shù)據(jù)類型成員組成,但在任何同一時(shí)刻,中只存放了(所有成員共用一塊地址空間),而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同。2.對(duì)于的不同成員賦值,將會(huì)對(duì)其它成員重寫(xiě),原來(lái)成員的值就不存在了,而對(duì)于結(jié)構(gòu)的不同成員賦值是互不影響的。10.下面關(guān)于“a)”的題目的輸出?#include<stdio.h>union{inti;charx[2];}a;voidmain(){a.x[0]=10;a.x[1]=1;printf("%d",a.i);}:266低位低地址,b)main(){union{inti;struct{Ox010A)/*定義一個(gè)*//*在*/}half;}number;first;second;number.i=0x4241;/*成員賦值*/printf("%c%c\n"number.half.firstmumber.half.second);number.half.first='a';/* 中結(jié)構(gòu)成員賦值*/number.half.second='b';printf("%x\n",number.i);getch();}AB (0x41對(duì)應(yīng)'A',是低位;Ox42對(duì)應(yīng)'B',是共用一塊地址空間)AB (0x41對(duì)應(yīng)'A',是低位;Ox42對(duì)應(yīng)'B',是共用一塊地址空間)number.halfstrcpy的函數(shù)原型:char*strcpy(char*strDest,constchar*strSrc)數(shù)strcpy。:char*strcpy(char*strDest,constchar*strSrc){if(strDest==NULL||strSrc==NULL)returnNULL;if(strDest==strSrc)returnstrDest;char*ptr=strDest;while(*strDest++=*strSrc++);returnptr;}12.String類定義如下:classString{public:String(constchar*strNULL)通用構(gòu)造函數(shù)String(constString&another)拷貝構(gòu)造函數(shù)~String()析構(gòu)函數(shù)String&operater=(constString&rhs)賦值函數(shù)private:char*m_data用于保存字符串};嘗試寫(xiě)出類的成員函數(shù)實(shí)現(xiàn)。:String::String(constchar*str){ifstrNULL//strlen在參數(shù)為NULL時(shí)會(huì)拋異常才會(huì)有這步判斷{m_data=newchar[1];m_data[0]='\0';}else{m_data=newchar[strlen(str)+1];strcpy(m_data,str);}}String::String(constString&another){m_data=newchar[strlen(another.m_data)+strcpy(m_data,str);}}String::String(constString&another){m_data=newchar[strlen(another.m_data)+1];strcpy(m_data,other.m_data);}String&String::operator=(constString&rhs){if(this==&rhs)return*this;delete[]m_data//刪除原來(lái)的數(shù)據(jù),新開(kāi)一塊內(nèi)存m_data=newchar[strlen(rhs.m_data)+1];strcpy(m_data,rhs.m_data);return*this;}String::~String(){delete[]m_data;}.hifndef/define/endif的作用?答:防止該頭文件被重復(fù) 。14.#include<file.h>#include"file.h"的區(qū)別?Library的路徑尋找和file.h。file.h,而后者是從當(dāng)前工作路徑搜尋并引Cextern“C”?鍵字告訴編譯器,其的函數(shù)和變量可以在本模塊或其它模塊中使用。的函數(shù)和全局變量以關(guān)鍵字extern通常,在模塊的頭文件中對(duì)本模塊提供給其它模塊該模塊A中定義的全局變量和函數(shù)時(shí)只需包含模塊A的頭文件即可。這樣,模塊B中調(diào)用模塊A中的函數(shù)時(shí),在編譯階段,模塊B雖然找不到該函數(shù),但是并報(bào)錯(cuò);它會(huì)在連接階段中從模塊A編譯生成的目標(biāo)代碼中找到此函數(shù)extern"C"是連接申明(linkagedeclaration),被extern"C"C語(yǔ)言方式,C++C的函數(shù)是怎樣編譯的:C語(yǔ)言的不同。例如,假設(shè)某個(gè)函數(shù)的原型為:voidfoo(intx,inty);C編譯器編譯后在符號(hào)庫(kù)中的名字為_(kāi)fooC++編譯器則會(huì)產(chǎn)生像_foo_int_int稱為“mangldnamefoo(intx,intC編譯器編譯后在符號(hào)庫(kù)中的名字為_(kāi)fooC++編譯器則會(huì)產(chǎn)生像_foo_int_int稱為“mangldnamefoo(intx,inty)voidfoo(intx,floaty)編譯生成的符號(hào)是不相同的,后者為_(kāi)foo_int_float。的類成員變量可能與全局變量同名,我們以"."來(lái)區(qū)分。而本質(zhì)上,編譯器在進(jìn)行編譯時(shí),的全局變量名字不同。"C"時(shí)的連接方式C++A的頭文件如下:moduleA.h#ifndefMODULE_A_H#defineMODULE_A_Hintfoo(intx,inty);#endifB中該函數(shù):#include"moduleA.h"foo(2,3);AmoduleA.obj中尋找_foo_int_int這樣的符號(hào)!"C"后的編譯和連接方式"C"后,模塊A的頭文件變?yōu)椋?/模塊A頭文件 #ifndefMODULE_A_H#defineMODULE_A_Hextern"C"intfoo(intx,inty);#endiffoo2,3),其結(jié)果是:式;Bfoo(2,3)調(diào)用時(shí),尋找的是修改的符號(hào)名_foo。A中函數(shù)"C"Bexternintfoo(intx,inty)BA中的函數(shù);反之亦然。extern“C”這個(gè)的真實(shí)目的(任何語(yǔ)言中的任何語(yǔ)法特性的誕語(yǔ)言是怎么做的,還要問(wèn)一問(wèn)它為什么要這么做, 許多問(wèn)題C++與Cextern"C"的設(shè)立extern"C"的慣用法extern"C"通常的使用技巧:在中 Cextern"C"的設(shè)立extern"C"的慣用法extern"C"通常的使用技巧:在中 C言中的函數(shù)和變量在包含C語(yǔ)言文(假設(shè)為時(shí)需進(jìn)行下列處理:extern"C"{#include"cExample.h"}extern類型,Cextern"C"extern"C"時(shí)會(huì)出現(xiàn)編譯語(yǔ)法錯(cuò)誤。C++C函數(shù)例子工程中包含的三個(gè)文件的源代碼如下:*/#ifndefC_EXAMPLE_H#defineC_EXAMPLE_Hexternintadd(intx,inty);#endifcExample.c*/#include"cExample.h"intadd(intx,inty){returnx+y;}16.關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別?涉及到UML中的一些概念:關(guān)聯(lián)是表示兩個(gè)類的一般性,比如“學(xué)生”和“老師”就是一責(zé),如下圖所示,用空的菱形表示聚合關(guān)系:從實(shí)現(xiàn)的角度講,聚合可以表示為:classA{...}classB{A*a; }合類要對(duì)被組合類負(fù)責(zé),采用實(shí)心的菱形表示組合關(guān)系:實(shí)現(xiàn)的形式是:classA{...}classB{Aa;...}17.面向?qū)ο蟮娜齻€(gè)基本特征,并簡(jiǎn)單敘述之?封裝:將客觀事物抽象成類,每個(gè)類對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private,protected,public)繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(指使用基類的屬性和方法而無(wú)需額外編實(shí)現(xiàn)的形式是:classA{...}classB{Aa;...}17.面向?qū)ο蟮娜齻€(gè)基本特征,并簡(jiǎn)單敘述之?封裝:將客觀事物抽象成類,每個(gè)類對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private,protected,public)繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(指使用基類的屬性和方法而無(wú)需額外編(對(duì)象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式。3.多態(tài):是將父對(duì)象設(shè)置成為和一個(gè)或的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式將子類類型的指針賦值給父類類型的指針。18.重載(overload)和重寫(xiě)(overried,有的書(shū)也叫做“覆蓋”)的區(qū)別?從定義上來(lái)說(shuō):數(shù)類型不同,或許兩者都不同。重寫(xiě):是指子類重新定義復(fù)類虛函數(shù)的方法。從實(shí)現(xiàn)原理上來(lái)說(shuō):不同的函數(shù)(至少對(duì)于編譯器來(lái)說(shuō)是這樣的。兩個(gè)同名函數(shù):functionfunctionfunc(p:string):integer;、str_func。對(duì)于這兩個(gè)函數(shù)的調(diào)用,在編譯器間就已經(jīng)確定了,是靜態(tài)的。也就是說(shuō),它們的地址在編譯期就綁定了(早綁定,因此,重載和多態(tài)無(wú)關(guān)!的子類的虛函數(shù)的地址無(wú)法給出。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(晚綁定。19.多態(tài)的作用?主要是兩個(gè):1.隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;2.接口重用:為了類在繼承和派生的時(shí)候,保證使用正確調(diào)用。中任一類的實(shí)例的某一屬性時(shí)的free的與區(qū)別?且不能初始化對(duì)象,new會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù)。deletedestructor,而free#defineDOUBLE(xx+x,i5*DOUBLE(5)i是多少?30。intializationlistassignment?const、reference成員變量;基類的構(gòu)造函數(shù)都需要初始化表。23.C++是不是類型安全的?:不是。兩個(gè)不同類型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpretcast)。C#是類型安全的。24.main函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼?main函數(shù)之前執(zhí)行。25.描述內(nèi)存分配方式以及它們的區(qū)別?1)行期間都存在。例如全局變量,static變量。結(jié)束時(shí)這些單元自動(dòng)被。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集。3)從堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用23.C++是不是類型安全的?:不是。兩個(gè)不同類型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpretcast)。C#是類型安全的。24.main函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼?main函數(shù)之前執(zhí)行。25.描述內(nèi)存分配方式以及它們的區(qū)別?1)行期間都存在。例如全局變量,static變量。結(jié)束時(shí)這些單元自動(dòng)被。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集。3)從堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc或new申請(qǐng)任意多少的使用非常靈活,但問(wèn)題也最多。26.structclass的區(qū)別:struct的成員默認(rèn)是公有的,而類的成員默認(rèn)是私有的。struct和class在其他方面是功能相當(dāng)?shù)摹G矣泄袛?shù)據(jù)(這種事情在良好設(shè)計(jì)的系統(tǒng)中是存在的!)struct關(guān)鍵class關(guān)鍵字。27.當(dāng)一個(gè)類A中沒(méi)有生命任何成員變量與成員函數(shù),這時(shí)sizeof(A)的值是多(Autodesk)一個(gè)classA[10]對(duì)象數(shù)組,而每一個(gè)對(duì)A[0],A[1]…了。28.C++4種類型轉(zhuǎn)換方式?,dynamic_castreinterpret_cast的區(qū)別和應(yīng)用。BOOL,int,float,a與“零”的比較語(yǔ)句。:ifaifaifa0constFLOATSMALL=0.000001if(fabs(a)<SMALL)ifaNULLifaNULLBOOL:int:float:pointerconst與#define相比,有何優(yōu)點(diǎn)?:2)const常量進(jìn)行調(diào)試,但是不能對(duì)宏常量進(jìn)行調(diào)試。31.簡(jiǎn)述數(shù)組與指針的區(qū)別?數(shù)組要么在靜態(tài)類型的內(nèi)存塊。區(qū)被創(chuàng)建(如全局?jǐn)?shù)組,要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任意(1)修改內(nèi)容上的差別chara[0]charp[0]a[]=“hello”;=‘X’;*p=“world”;31.簡(jiǎn)述數(shù)組與指針的區(qū)別?數(shù)組要么在靜態(tài)類型的內(nèi)存塊。區(qū)被創(chuàng)建(如全局?jǐn)?shù)組,要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任意(1)修改內(nèi)容上的差別chara[0]charp[0]a[]=“hello”;=‘X’;*p=“world”;=‘X’;p指向常量字符串編譯器不能發(fā)現(xiàn)該錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤sizeof可以計(jì)算出數(shù)組的容量(字節(jié)數(shù)。sizeof(p),p為指針得到的是一個(gè)指針變量的字節(jié)數(shù),而不是p所指的內(nèi)存容量。C++/C語(yǔ)言沒(méi)有辦法知道指針?biāo)傅膬?nèi)存容同類型的指針。chara[]="helloworld";char*p=a;cout<sizeof(aendl12字節(jié),數(shù)組的大小cout<sizeof(pendl4字節(jié),指針變量的大小注意:voidFunc(chara[100]){endl4100字節(jié),a實(shí)際上是一個(gè)指針}為在函數(shù)是等價(jià)的:voidFunc(chara[]);voidFunc(char*a);32.類成員函數(shù)的重載、覆蓋和隱:a.成員函數(shù)被重載的特征:(在同一個(gè)類中;irtual關(guān)鍵字可有可無(wú)。別?b.覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:(分別位于派生類與基類;virtual關(guān)鍵字。c.“隱藏”是指派生類的函數(shù)了與其同名的基類函數(shù),規(guī)則如下:關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載。鍵字。此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋)33.Therearetwointvariables:aandb,don’tuse“if”,“?:”,“switch”orother33.Therearetwointvariables:aandb,don’tuse“if”,“?:”,“switch”orotherjudgementstatements,findoutthebiggestoneofthetwonumbers.:((a+b)+abs(a-b))/234.如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號(hào)?:cout<<FILE;cout<<LINE;和LINE是系統(tǒng)預(yù)定義宏,這種宏并不是在某個(gè)文件中定義的,而是由編譯器定義的。35.main主函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,給出說(shuō)明?:可以,可以用_onexitmain之后執(zhí)行。intfn1(void),fn2(void),fn3(void),fn4(void);voidmain(void){Stringstr("zhanglin");_onexit(_onexit(_onexit(_onexit(fn1fn2fn3fn4););););printf("Thisisexecutedfirst.\n");}int{fn1()printf("next.\n");return0;}int{fn2()printf("executed");return0;}int{fn3()printf("is");return0;}int{fn4()printf("This");return0;}The_onexitfunctionispassedtheaddressofafunction(func)tobecalledwhentheprogramterminatesnormally.Successivecallsto_onexitcreatearegisteroffunctionsthatareexecutedinLIFO(last-in-first-out)order.Thefunctionspassedto_onexitcannot}The_onexitfunctionispassedtheaddressofafunction(func)tobecalledwhentheprogramterminatesnormally.Successivecallsto_onexitcreatearegisteroffunctionsthatareexecutedinLIFO(last-in-first-out)order.Thefunctionspassedto_onexitcannottakeparameters.36.如何判斷一段程序是由C編譯程序還是由C++編譯程序編譯的?:#ifdefcpluspluscout<<"c++";#else#endif37.文件中有一組整數(shù),要求排序后輸出到另一個(gè)文件中:#include<iostream>#include<fstream>usingnamespacestd;voidBubbleSort(vector<int>&data)//bubblesort{for(intpass=1;pass<data.size();pass++){inttag=false;//n-1趟for(intpos=0;pos<data.size()-pass;pos++){if(data[pos]>data[pos+1]){tagtrue;//本趟發(fā)生了inttemp=data[pos];data[pos]=data[pos+1];data[pos+1temp;}}iftagfalse)//本趟沒(méi)有發(fā)生break;,數(shù)組已經(jīng)完全有序}}voidmain(void){vector<int>data;ifstreamin("c:\\data.txt");if(!in){ifstreamin("c:\\data.txt");if(!in){cerr<<"fileerror!";exit(1);}while(!in.eof()){intn;in>>n;data.push_back(n);}in.close//關(guān)閉輸入文件流Order(data);ofstreamout("c:\\result.txt");if(!out){cerr<<"fileerror!";exit(1);}for(i=0;i<data.size();out<<data[i]<<"";out.close//關(guān)閉輸出文件流i++)}38.鏈表題。一個(gè)鏈表的結(jié)點(diǎn)結(jié)構(gòu)structNode{intdata;Node*next;};typedefstructNodeNode;head,寫(xiě)一個(gè)函數(shù)把這個(gè)鏈表逆序(Intel)Node*ReverseList(Node*head//鏈表逆序{if(head==NULL||head->next==NULL)returnhead;NodeNodeNode*p1*p2*p3====head;p1->next;p2->next;NULL;!=NULL)p1->nextwhile(p3{p2->next=p1;p1p2p3===p2;p3{p2->next=p1;p1p2p3===p2;p3;p3->next;}p2->next=p1;head=p2;returnhead;}head1head2各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序。(保留所有結(jié)點(diǎn),即便大小相同)Node*Merge(Node*head1,Node*head2){if(head1==NULL)returnhead2;if(head2==NULL)returnhead1;NodeNodeNodeif({*head*p1=*p2==NULL;NULL;NULL;head1->data<head2->data)headp1=p2==head1;head2;}else{headp2=p1=}=head2;head2->next;head1;Node*pcurrent=head;while(p1!=NULL&&p2!=NULL){if(p1->data<=p2->data){pcurrent->next=p1;pcurrent=p1;p1=p1->next;}else{pcurrent->next=p2;pcurrent=p2;p2pcurrent->next=p2;pcurrent=p2;p2=p2->next;}}if(p1!=NULL)pcurrent->next=p1;if(p2!=NULL)pcurrent->next=p2;returnhead;}(Autodesk):Node*MergeRecursive(Node*head1,Node*head2){if(head1==NULL)returnhead2;if(head2==NULL)returnhead1;Node*head=NULL;if(head1->data<head2->data){head=head1head->next=;MergeRecursive(head1->next,head2);}else{head=head2head->next=}returnhead;;MergeRecursive(head1,head2->next);}39.分析一下這段程序在2種情況下的輸出classB{public:}~B(){cout<<"destructed"<<whoami<<endl;}B(constB&other):data(other.data){cout<<"copyconstructorfromB.data="<<dataostringstreamss;<<endl;ss<<"copyfromB.data="<<data;whoami=ss<<"copyfromB.data="<<data;whoami=ss.str();}B(inti):data(i){//worksasaconverter(int->instanceofB)cout<<"constructedbyparameter"ostringstreamss;ss<<"constructedbyparameter"whoami=ss.str();<<data<<endl;<<data;}private:intdata;stringwhoami;};BPlay(Bb){cout<<"inplayfunction."<<endl;returnb;}1:intmain(intargc,char*argv[]){Bt1=Bt2=returnPlay(5);0;}運(yùn)行結(jié)果:55構(gòu)造一個(gè)臨時(shí)變量作為函數(shù)實(shí)參)inplayfunction.(執(zhí)行函數(shù)體)5copyt1構(gòu)造一個(gè)變量)destructedconstructedbyparameter5函數(shù)出棧,臨時(shí)變量析構(gòu))5copyt1構(gòu)造一個(gè)臨時(shí)變量作為函數(shù)實(shí)參)inplayfunction.(執(zhí)行函數(shù)體)5(copyt2構(gòu)造一個(gè)變量)5(函數(shù)出棧,臨時(shí)變量析構(gòu))5(t2析構(gòu))析構(gòu),注意析構(gòu)順序)2:copycopycopyfromfromfromB.dataintmain(intargc,char*argv[]){Bt1;t1=Play(5);Play(t1);return0;}(t1缺省構(gòu)造)5(Play(t1);return0;}(t1缺省構(gòu)造)5(5構(gòu)造臨時(shí)變量作為函數(shù)實(shí)參)inplayfunction.(執(zhí)行函數(shù)體)copyconstructorfromB.data5(為返回值構(gòu)造臨時(shí)變量)destructedconstructedbyparameter5(函數(shù)出棧,函數(shù)實(shí)參臨時(shí)變量析構(gòu))destructedcopyfromB.data5返回值臨時(shí)對(duì)象析構(gòu))0copyt1構(gòu)造臨時(shí)變量作為函數(shù)實(shí)參)inplayfunction.(執(zhí)行函數(shù)體)copyconstructorfromB.data0(為返回值構(gòu)造臨時(shí)變量)說(shuō)明:copyfromB.data0(函數(shù)出棧,函數(shù)實(shí)參臨時(shí)變量析構(gòu))0(main函數(shù)沒(méi)有接收返回值,返回值對(duì)象析構(gòu))(t1析構(gòu))本題說(shuō)明了一個(gè)很細(xì)微的編譯特性。t1copyt1進(jìn)行初始化(這樣可以減少一次臨時(shí)對(duì)象的構(gòu)造/析構(gòu)的代價(jià))。構(gòu)造函數(shù)構(gòu)造一個(gè)臨時(shí)返回對(duì)象,再將臨時(shí)返回對(duì)象的值通過(guò)賦值運(yùn)算符t1,然后函數(shù)激活出棧。(3)注意出棧的順序,雖然臨時(shí)返回對(duì)象在棧頂,但是輸出結(jié)果表明出棧時(shí)局部變量和函數(shù)(調(diào)用析構(gòu)函數(shù)),然后才銷毀返回對(duì)象。40.寫(xiě)一個(gè)函數(shù)找出一個(gè)整數(shù)數(shù)組中,第二大的數(shù):constintMINNUMBER=INT_MIN;(microsoft)intfind_sec_max(intdata[],intcount){forsec_max=(inti==data[0];MINNUMBER;1;i<count;i++){if(data[i]>maxnumber){sec_max=maxnumber;maxnumber=data[i];}elseif(data[i]>sec_max)sec_max=data[i];}returnsec_max;}41.寫(xiě)一個(gè)在一個(gè)字符串(n)41.寫(xiě)一個(gè)在一個(gè)字符串(n)中尋找一個(gè)子串(m)第一個(gè)位置的函數(shù)。KMP算法效率最好,時(shí)間復(fù)雜度是O(n+m)。(見(jiàn)嚴(yán)蔚敏《數(shù)據(jù)結(jié)構(gòu)C語(yǔ)言版》)(注意不能用標(biāo)志位,最多只能用兩個(gè)額外指針)的話兩者必然重合,反之亦然:structnode{charval;node*next;}boolcheck(constnode*head//returnfalse無(wú)環(huán);true有環(huán)boolcheck(constnode*head){if(head==NULL)returnfalse;node*low=head,*fast=head->next;while(fast!=NULL&&fast->next!=NULL){low=low->next;fast=fast->next->next;if(low==fast)returntrue;}returnfalse;}Part2C++常見(jiàn)面試題1. 是不是一個(gè)父類寫(xiě)了一個(gè)virtual函數(shù),如果子類覆蓋它的函數(shù)不加virtual,也能實(shí)現(xiàn)多態(tài)?virtual修飾符會(huì)被隱形繼承的。private也被繼承,只事派生類沒(méi)有virtual可加可不加子類的空間里有父類的所有變量(staticPart2C++常見(jiàn)面試題1. 是不是一個(gè)父類寫(xiě)了一個(gè)virtual函數(shù),如果子類覆蓋它的函數(shù)不加virtual,也能實(shí)現(xiàn)多態(tài)?virtual修飾符會(huì)被隱形繼承的。private也被繼承,只事派生類沒(méi)有virtual可加可不加子類的空間里有父類的所有變量(static除外)同一個(gè)函數(shù)只存在一個(gè)實(shí)體(inline除外)子類覆蓋它的函數(shù)不加virtual,也能實(shí)現(xiàn)多態(tài)。在子類的空間里,有父類的私有變量。私有變量不能直接權(quán)限而已。2. (C++)#include<iostream>usingnamespacestd;voidmain(){stringin;getline(cin,in);char*s=newchar[in.size()+1];strcpy(s,in.c_str());charcharfor({*front=s;*back=s+strlen(s)-1;;front<back;front++,back--)chart=*front;*front=*back;*back=t;}cout<<s<<endl;delete[]s;}getline()函數(shù)最健壯,允許輸入任意長(zhǎng)的字符串。中的內(nèi)容出來(lái)。//第二種#include#include<iostream><algorithm>usingnamespacestd;voidmain(){stringin;getline(voidmain(){stringin;getline(cin,in);reverse(in.begin(),in.end());cout<<in<<endl;}算法,注意包含<algorithm>頭文件。(她)目瞪口呆,但是給不給分就不知道了3. 這道題目的結(jié)果是什么?#defineSQR(X)X*Xintmain(intargc,char*argv[]){intakm===14;2;1;a/=SQR(k+m)/SQR(k+m);printf("%d\n",a);return0;}define只是定義而已,在編擇時(shí)只是簡(jiǎn)單代換X*X而已,并不經(jīng)過(guò)算術(shù)法則:a/=(k+m)*(k+m)/(k+m)*(k+m);=>a/=(k+m)*1*(k+m);=>a=a/9;=>a=1;本人添加的說(shuō)明:上述解答是錯(cuò)的。執(zhí)行代換以后:=>a/=k+m*k+m/k+m*k+m;=>a/=2+1*2+1/2+1*2+1;=>a/=7;=>a=2;如果是這樣寫(xiě)的:#defineSQR(X)(X)*(X)上面的解釋才是對(duì)的。當(dāng)然,上述代碼的本意是a應(yīng)該仍然是14,結(jié)果卻得到了1,說(shuō)明這個(gè)帶參數(shù)的宏寫(xiě)得仍然不對(duì)。正確的寫(xiě)法是:#defineSQR(X)((X)*(X))這個(gè)題目告訴我們,寫(xiě)帶參數(shù)的宏需要很多很多很多很多的括號(hào)。4. const符號(hào)常量;(1)constchar*p(2)charconst*p(3)char*constp說(shuō)明上面三種描述的區(qū)別;(1)(2)(2)charconst*p(3)char*constp說(shuō)明上面三種描述的區(qū)別;(1)(2)是一回事。const位于星號(hào)的右側(cè),則指針本身不能改變。(4)constchar*constp這種是指針及指向?qū)ο蠖疾荒苄薷摹?. Cif語(yǔ)句判斷方式。請(qǐng)問(wèn)哪種寫(xiě)法更好?為什么?intn;ifn10第一種判斷方式if(10n第二種判斷方式個(gè)編譯警告。6. 下面的代碼有什么問(wèn)題?并請(qǐng)給出正確的寫(xiě)法。voidDoSomeThing(char*p){charstr[16];intn;assert(NULL!=p);sscanf(p,"%s%d",str,n);......}sscanf(p,"%s%d",str,&n);應(yīng)該是:7. 下面代碼有什么錯(cuò)誤?voidtest1(){charstring[10];char*str1="0123456789";strcpy(string,str1);}string8. 下面代碼有什么問(wèn)題?voidtest2(){charstring[10],str1[10];for(i=0;i<10;i++)str1[i]='a';strcpy(string,str1);}strcpy只能用于C風(fēng)格的字符串(必須有‘\0’結(jié)尾)9. 寫(xiě)出運(yùn)行結(jié)果:voidstr[]="world";coutcoutcoutcout<<<<<<9. 寫(xiě)出運(yùn)行結(jié)果:voidstr[]="world";coutcoutcoutcout<<<<<<sizeof(str)<<":";sizeof(p)<<":";sizeof(i)<<":";*pi*p===str;10;malloc(10);<<sizeof(p)<<endl;6:4:1:4C風(fēng)格字符串,末尾還有一個(gè)‘\06324個(gè)字節(jié)。1個(gè)字節(jié)。324個(gè)字節(jié)。10.下面的代碼有什么問(wèn)題?classA{public:A(){p=this;}~A(){if(p)deletep;}private:A*p;};答:會(huì)引起無(wú)限遞歸11.i最后等于多少?if(i=1;j=i++;(i>j++)&&(i++==j))i+=j;答:i5本人添加的說(shuō)明:本人極其憎惡這種毫無(wú)意義的題目。本題在VC下得到的結(jié)果是i=5,但++的副作用,C++本身并沒(méi)有規(guī)定。因此本題根本沒(méi)有正確。VC在判斷i>j++(i=2j=1)j++的操作,然后i++i=32個(gè)條件都滿足,if條件為真,執(zhí)行語(yǔ)句體i+=j,i=5j=2。12.unsignedshortarray[]={1,2,3,4,5,6,7};inti=3;*(array+i)=?答:4array[3]4個(gè)元素。13.classA{public:virtualvoidfunc1(){cout<<"fun1inclassA"<<endl;}voidfunc2()13.classA{public:virtualvoidfunc1(){cout<<"fun1inclassA"<<endl;}voidfunc2(){cout<<"fun2inclassA"<<endl;}};classB:publicA{public:voidfunc1(){cout<<"fun1inclassB"<<endl;}virtualvoidfunc2(){cout<<"fun2inclassB"<<endl;}};Afunc1和B中的func2都是虛函數(shù).Afunc1和B中的func2都不是虛函數(shù).是虛函數(shù).,Bfunc1不是虛函數(shù).func1是虛函數(shù).答A本人添加的說(shuō)明:從原則上講A是不合理的。如果A正確,那么任何一個(gè)派生類都可以把基類中沒(méi)有為虛函數(shù)的方法搗騰成虛函數(shù),這從本質(zhì)上破壞了類體系設(shè)計(jì)的基本思想,即基類確定原則,派生類增加實(shí)現(xiàn)。4個(gè)選項(xiàng)都是錯(cuò)的。Afunc1是虛函數(shù).,Bfunc2不是虛函數(shù)。這個(gè)題目告訴我們,網(wǎng)上找到的題目,一定要自己編程試一試才能知道正確。14.輸出下面程序結(jié)果。classA{public:virtualvoidprint(void)};classB:publicApublic:virtualvoidprint(void)};classC:publicB{public:virtualvoidprint(void)};{cout<<"A::print()"<<endl;}{cout<<"B::print()"<<endl;};{cout<<"C::print()"<<endl;}voidprint(Aa){a.printvoidprint(Aa){a.print();}voidmain(void){ABCa,*pa,*pb,*pc;b;c;pa=&a;pb=&b;pc=&c;a.print();b.print();c.print();pa->print();pb->print();pc->print();print(a);print(b);print(c);}輸出結(jié)果:A::print()B::print()C::print()A::print()B::print()C::print()A::print()A::print()A::print()說(shuō)明:只有指針才能實(shí)現(xiàn)多態(tài)調(diào)用。34.請(qǐng)指出下列程序中的錯(cuò)誤并且修改voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;voidTest(void){char*str=NULL;strcpy(str,"helloworld");printf(str);}p并不能回傳給調(diào)用函數(shù),Test函數(shù)中strNULL,strcpy(str"helloworld");將使程序修改如下:voidGetMemory(char**p){*p=(char*)malloc(100);}。voidTest(void){char*str=NULL;strcpy(str,"helloworld");printf(str);}15.C寫(xiě)一個(gè)輸入的整數(shù),倒著輸出整數(shù)的函數(shù),要求用遞歸方法答:voiddisplay(intn){if(n==0)return;cout<<n%10;display(n/10);}16.寫(xiě)出程序結(jié)果:voidFunc(charstr[100]){printf("%d\n",sizeof(str));}答:4。str實(shí)際上只是一個(gè)指針。17.intid[sizeof(unsignedlong)];這樣寫(xiě)對(duì)嗎?為什么?答:對(duì)。sizeof是運(yùn)算符,其值編譯時(shí)就確定了。18.找錯(cuò)題試題1:voidtest1(){18.找錯(cuò)題試題1:voidtest1(){charstring[10];char*str1="0123456789";strcpy(string,str1);}2:voidtest2(){charstring[10],str1[10];inti;for(i=0;i<10;i++)str1='a';strcpy(string,str1);}3:voidtest3(char*str1){charstring[10];if(strlen(str1)<=10)strcpy(string,str1);}解答:1str11(包括末尾的'\'string10個(gè)字節(jié)的空間,strcpy會(huì)導(dǎo)致數(shù)組越界;2str13分;strcpy(string,str1)調(diào)用使得從str1內(nèi)存起內(nèi)存起所的字節(jié)數(shù)具有不確定性strcpy10分;3,if(strlen(str1)<=10)應(yīng)改為if(strlen(str1)<10),因?yàn)閟trlen的結(jié)果未統(tǒng)計(jì)'\0'1個(gè)字節(jié)。剖析:考查對(duì)基本功的掌握:'\0'結(jié)尾;對(duì)數(shù)組越界把握的敏感度;10,下面給出幾個(gè)不同得分的2分voidstrcpy(char*strDest,char*strSrc){while((*strDest++=*strSrc++)!='\0');}:4分void4分voidstrcpy(char*strDest,constchar*strSrc)const2分{while((*strDest++=*strSrc++)!='\0');}7分voidstrcpy(char*strDest,constchar*strSrc){03分assert((strDest!=NULL)&&(strSrc!=NULL));while((*strDest++=*strSrc++)!='\0');}10分3分!char*strcpy(char*strDest,constchar*strSrc){assert((strDest!=NULL)&&(strSrc!=NULL));char*address=strDest;while((*strDest++=*strSrc++)!='\0');returnaddress;}'\0'。strlen的實(shí)現(xiàn)版本:intstrlenconstchar*str//輸入?yún)?shù)const{assertstrtNULL//斷言字符串地址非空intlen;while(*str++)len++;returnlen;}本人添加的說(shuō)明:assert()斷言。,這類要提供給各種場(chǎng)合應(yīng)用的庫(kù)函數(shù)而言,判斷輸入?yún)?shù)是否if語(yǔ)句進(jìn)行判斷,如果不滿足函數(shù)執(zhí)行的前提條件,0(strlen)。strcpy()在課堂上已經(jīng)給出了完整的實(shí)現(xiàn)代碼,比這里10分的實(shí)現(xiàn)仍然是有漏洞的。assert()斷言了。4:voidGetMemory(char*pvoidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,"helloworld");printf(str);}5:char*GetMemory(void){charp[]="helloworld";returnp;}voidTest(void){char*str=NULL;str=GetMemory();printf(str);}6:voidGetMemory(char**p,intnum{*p=(char*)malloc(num);}voidTest(void){char*str=NULL;)GetMemory(&str,100strcpy(str,"hello"printf(str);););}7:voidTest(void){char*str=(char*)strcpy(str,"hello"free(str);省略的其它語(yǔ)句}解答:malloc(100););char*p)函數(shù)的形參為字符串指針,在函數(shù)內(nèi)部修改形參并不能真正的改變傳入形參的值,執(zhí)行完char*str=NULL;char*p)函數(shù)的形參為字符串指針,在函數(shù)內(nèi)部修改形參并不能真正的改變傳入形參的值,執(zhí)行完char*str=NULL;GetMemory(str);NULL;5中charp[]="helloworld";returnp;p[]數(shù)組為函數(shù)內(nèi)的局部自動(dòng)變量,在函數(shù)返回后,內(nèi)存已經(jīng)被的錯(cuò)誤,其根源在于不理解變量的生存期。。這是許多程序員常犯4GetMemory的參數(shù)為字符串指針的中執(zhí)行申請(qǐng)內(nèi)存及賦值語(yǔ)句*p=(char*)malloc(num);if*pNULL{...//進(jìn)行申請(qǐng)內(nèi)存失敗處理}76同樣的問(wèn)題,在執(zhí)行char*str=(char*)malloc(100);str為空,導(dǎo)致可能變成一個(gè)"野"指針,應(yīng)加上:str=NULL;6的Testmalloc的內(nèi)存進(jìn)行剖析:。的錯(cuò)誤。但是要完全解答正確,卻也絕非易事。對(duì)內(nèi)存操作的考查主要集中在:指針的理解;變量的生存期及作用范圍;(3)良好的動(dòng)態(tài)內(nèi)存申請(qǐng)和習(xí)慣。再看看下面的一段程序有什么錯(cuò)誤:swap(int*p1,int*p2){int*p;*p=*p1;*p1=*p2;*p2=*p;}swap函數(shù)中,p是一個(gè)"野"指針,有可能指向系統(tǒng)區(qū),導(dǎo)致程序運(yùn)行的Violation"。該程序應(yīng)該改為:VC++swap(int*p1,int*p2){intp=*p1*p2swap(int*p1,int*p2){intp=*p1*p2p;*p1;=*p2;=p;}19.內(nèi)功題1:"零值"比較的if語(yǔ)句(var)解答:BOOL型變量:if(!var)int型變量:if(var==0)float型變量:constfloatif((x>=-指針變量:剖析:EPSINON=0.00001;EPSINON)&&(x<=EPSINON)if(var==NULL)if(!var),上述寫(xiě)法雖然程序都能正確運(yùn)行,但是未能清晰地表達(dá)程序的意思。if判斷一個(gè)變量的"真"、"假"if(var)、if(!var),表明其;if判斷一個(gè)數(shù)值型變量(short、int、long等)if(var==0),表明0進(jìn)行數(shù)值上的比較;而判斷指針則適宜用i(var==NULLif(x0.0)0分。本人添加的說(shuō)明:我本人并!運(yùn)算符。(1)bool型變量:bool類型的函數(shù)boolis×××()的形式。boolisLeapintyear);isLeap(yearfalse也沒(méi)有什么不妥。isLeap(year一般的boolboolfound;iffoundfalseif!found都可以,前者更清楚。型變量0或if!var都可以。一般傾向于前者。0或ifvar都可以。更傾向于使用后者。浮點(diǎn)型變量通常不建議浮點(diǎn)型變量直接與0比較。當(dāng)然實(shí)際上,如果浮點(diǎn)型變量中的數(shù)確實(shí)很小很不見(jiàn)得就一定不能得到正確的結(jié)果。但是一般數(shù)值計(jì)算過(guò)程中產(chǎn)生的很小的數(shù)一般很難到10-150判斷最好還是判斷其絕對(duì)值小于某個(gè)10-2,10-5,10-7等等。(4)指針變量與空指針的比較。判斷是空指針一般寫(xiě)為if(p==NULL或if(!p),兩種寫(xiě)法都很常見(jiàn),沒(méi)有孰優(yōu)孰劣。ifp。2:32C++sizeof的值voidFunc(charstr[100]){sizeof(str)=?}void*p=malloc(100);sizeof(p)=?解答:sizeof(str)=4sizeof(p)=4剖析:Funccharstr[100])函數(shù)中數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個(gè)指針;在失去其內(nèi)涵的同時(shí),它還失去了其常量特性,可以作自增、自減等操作,可以被修改。數(shù)組名的本質(zhì)如下:;例如:charstr[10];cout<<sizeof(str)<<endl;10,strchar[10]。數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針,而且是一個(gè)指針常量,不能作自增、自減等操作,不能被修改;charstr[10];str不是左值str)、sizeof(p)4。3:寫(xiě)一個(gè)標(biāo)準(zhǔn)"會(huì)發(fā)生什么事?least=MIN(*p++,b);解答:#defineMIN(A,B)((A)<=(B)?(A):(B))MIN(*p++,b)會(huì)產(chǎn)生宏的副作用剖析:也不是真的參數(shù),在宏展開(kāi)的時(shí)候?qū)?參數(shù)"進(jìn)行的是一對(duì)一的替換。程序員對(duì)宏定義的使用要非常,特別要注意兩個(gè)問(wèn)題:"參數(shù)"和整個(gè)宏用用括弧括起來(lái)。所以,嚴(yán)格地講,下述解答:#defineMIN(A,B)(A)剖析:也不是真的參數(shù),在宏展開(kāi)的時(shí)候?qū)?參數(shù)"進(jìn)行的是一對(duì)一的替換。程序員對(duì)宏定義的使用要非常,特別要注意兩個(gè)問(wèn)題:"參數(shù)"和整個(gè)宏用用括弧括起來(lái)。所以,嚴(yán)格地講,下述解答:#defineMIN(A,B)(A)<=(B)?(A):(B)#defineMIN(A,B)(A<=B?A:B)0分;宏定義#defineMIN(A,B((A(B(A(B))b)的作用結(jié)果是:((*p++)<=(b)?(*p++):(*p++))++自增操作。0分的解答是:#defineMIN(A,B)((A)<=(B)?(A):(B));";",顯示編寫(xiě)者對(duì)宏的概念模糊不清。4:為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?#ifndefINCvxWorksh#defineINCvxWorksh#ifdefcplusplusextern"C"{#endif……#ifdefcplusplus}#endif#endif/*INCvxWorksh解答:頭文件中的編譯宏#ifndefINCvxWorksh#defineINCvxWorksh#endif*/的作用是防止被重復(fù)。C語(yǔ)言的不同。例如,假設(shè)某個(gè)函數(shù)的原型為:voidfoo(intx,inty);該函數(shù)被C編譯器編譯后在symbol庫(kù)中的名字為_(kāi)foo,而C++編譯器則會(huì)產(chǎn)生像_foo_int_int_foo_int_int這樣的名字包含了函數(shù)名和函數(shù)參數(shù)數(shù)量及類型信息,C++就是靠這種機(jī)制來(lái)實(shí)現(xiàn)函數(shù)重載的。"C"來(lái)解決名字C++就是靠這種機(jī)制來(lái)實(shí)現(xiàn)函數(shù)重載的。"C"來(lái)解決名字C語(yǔ)言的方式將該函數(shù)編譯為_(kāi)foo,這樣CC++的函數(shù)了。5:n=2,移位后應(yīng)該是"hiabcdefgh"函數(shù)頭是這樣的:'\0'結(jié)尾的字符串的指針nvoidLoopMove(char*pStr,intsteps){//請(qǐng)?zhí)畛?..}解答:1:voidLoopMove(char*pStr,intsteps){intn=strlen(pStr)-steps;chartmp[MAX_LEN];*(tmp((+tmp,pStr+n);tmp+steps,pStr);strlen(pStr))='\0';strcpy(pStr,tmp);}2:voidLoopMove(char*pStr,intsteps){intn=strlen(pStr)-steps;chartmp[MAX_LEN];memcpy(tmp,pStr+n,steps);memcpy(pStr+steps,pStr,n);memcpy(pStr,tmp,steps);}剖析:程度上簡(jiǎn)化程序編寫(xiě)的工作量。最頻繁被使用的庫(kù)函數(shù)包括:庫(kù)函數(shù)可以很大(1)(2)(3)6:strcpymemcpymemset文件頭并WAVE文件格式說(shuō)明表文件頭00H4byteChar"RIFF"標(biāo)志04H4byteWAVE文件格式說(shuō)明表文件頭00H4byteChar"RIFF"標(biāo)志04H4byteint32文件長(zhǎng)度0CH4byteChar"fmt"標(biāo)志10H4byte過(guò)渡字節(jié)(內(nèi)容不定)14H2byteint1616H2byteint1618H2byteint16通道數(shù)采樣率每秒樣本數(shù),表示每個(gè)通道的速度1CH4byteint32波形音頻數(shù)據(jù)傳送速率20H2byteint16數(shù)據(jù)塊的調(diào)整數(shù)(按字節(jié)算的)22H2byte每樣本的數(shù)據(jù)位數(shù)24H4byteChar數(shù)據(jù)標(biāo)記符"data"28H4byteint32語(yǔ)音數(shù)據(jù)的長(zhǎng)度解答:typedefstructtagWaveFormat{charcRiffFlag[4];UIN32nFileLen;charcharcharUIN16UIN16UIN16UIN32UIN16UIN16cWaveFlag[4];cFmtFlag[4];nFormatTag;nChannels;nSamplesPerSec;nBlockAlign;nBitNumPerSample;charcDataFlag[4];UIN16nAudioLength;}WAVEFORMAT;簡(jiǎn)單,為:WAVEFORMATwaveFormat;memcpy(&waveFormat,buffer,sizeof(WAVEFORMAT));直接通過(guò)剖析:memcpy、memset等函數(shù)直接用于結(jié)構(gòu)7:String的原型為:classString{public:String(constString的原型為:classString{public:String(constchar*str=NULL);String(constString&other);//~String(void)析構(gòu)函數(shù)String&operate=(constStringprivate:char*m_data用于保存字符串};解答://普通構(gòu)造函數(shù)String::String(constchar*str){if(str==NULL){普通構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)&other)賦值函數(shù)m_datanewchar[1]得分點(diǎn):對(duì)空字符串自動(dòng)申請(qǐng)存放結(jié)束標(biāo)志'\0'的空m_dataNULL判斷*m_data='\0';}else{intlength=strlen(str);m_datanewchar[length+1]NULL判斷則更好strcpy(m_data,str);}}的析構(gòu)函數(shù)String::~String(void){deletem_data;}//拷貝構(gòu)造函數(shù)String::String(constString&other){intlength=strlen(other.m_data);const型m_data=newchar[length+1];strcpy(m_data,other.m_data);NULL判斷}//賦值函數(shù)&otherconst型{//得分點(diǎn):檢查自賦值if(this==&other)return*this;delete[]m_data;//得分點(diǎn):原有的內(nèi)存intlength=strlen(other.m_data);m_datanew{//得分點(diǎn):檢查自賦值if(this==&other)return*this;delete[]m_data;//得分點(diǎn):原有的內(nèi)存intlength=strlen(other.m_data);m_datanewchar[length+1]; NULL判斷strcpy(m_data,other.m_data);return*this;//得分點(diǎn):返回本對(duì)象的}剖析:C++60%以上!在這個(gè)類中包括了指針類成員變量m_data,當(dāng)類中包括指針類成員變量時(shí),一定要重C++EffectiveC++》中特別強(qiáng)調(diào)的條款。仔細(xì)學(xué)習(xí)這個(gè)類,特別注意加注釋的得分點(diǎn)和加分點(diǎn)的意義,這樣就具備了60%以上C++基本功!本人添加的說(shuō)明:一個(gè)string類型的實(shí)現(xiàn)示例:string.h#ifndef_STRING_H__STRING_H_#include<iostream>usingstd::istream;std::ostream;classstring{public:string(constchar*cstring="");string(charch);string(conststring&str);~string(){delete[]buffer;}//Constructor//Copyconstructorconststring&operator=(conststring&rhs);conststring&operator+=(conststring&rhs);//Copy//Appendconstchar*c_str()const{returnbuffer;}intlength()const{returnstrLength;}//ReturnC-stylestring//Returnstringlengthchar operator[](intk)const;//Accessoroperator[]char&operator[](intk);//Mutatoroperator[]private:char*buffer;intbufferLength;//storageforcharacters//lengthofstring(#ofcharacters)//capacityofbuffer};ostream&operator<<(ostream&out,conststring&str);istream&operator>>(istream&in,string&str);istream&getline(istream&in,string&str);istream&getline(istream&in,string&str,chardelim);//Output//Input//Readline//Readlinestringoperator+(conststring&lhs,conststringoperator+(conststring&lhs,conststring&rhs);//Concatenationbooloperator==(conststring&lhs,conststring&rhs);booloperator!=(conststring&lhs,conststring&rhs);booloperator<(conststring&lhs,conststring&rhs);booloperator<=(conststring&lhs,conststring&rhs);booloperator>(conststring&lhs,conststring&rhs);booloperator>=(conststring&lhs,conststring&rhs);//Compare==//Compare!=//Compare<//Compare<=//Compare>//Compare>=#endifExcept.h#ifndefEXCEPT_H_#defineEXCEPT_H_#include<string>usingstd::string;classDSException{public:DSException(conststring&msg=""):message(msg){}virtual~DSException(){}virtualstringtoString()const{return"Exception"+string(":")+what();}virtualstringwhat()const{returnmessage;}private:stringmessage;};:publicIndexOutOfBoundsException{public:StringIndexOutOfBoundsException(conststring&msg=""):IndexOutOfBoundsException(msg){}StringIndexOutOfBoundsException(intidx,intsz,conststring&msg=""):IndexOutOfBoundsException(idx,sz,msg){}};#endifstring.cpp#include<cstring>#include<cctype>#include"string.h"#include"Except.h"usingnamesapcestd;string::string(constchar*cstring){if(cstring==NULL)cstring="";strLength=strlen(cstring);bufferLength=strLength+1;buffer=newchar[bufferLength];strcpy(buffer,cstring);}string::string(conststring&str){strLength=str
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)交直流打鈴器市場(chǎng)調(diào)查研究報(bào)告
- 2025至2031年中國(guó)車頭標(biāo)志行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國(guó)黃粉蟲(chóng)蟲(chóng)蛹罐頭數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)玻璃香精油瓶數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)熱鍍鋅六角鐵絲網(wǎng)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025版消防工程勞務(wù)分包及消防安全教育培訓(xùn)合同3篇
- 二零二五年度品牌授權(quán)委托代理銷售協(xié)議3篇
- 二零二五年度個(gè)人反擔(dān)保保證合同(裝修貸款)2篇
- 大學(xué)生教育獎(jiǎng)學(xué)金捐贈(zèng)協(xié)議書(shū)
- 貨物交易協(xié)議書(shū)
- 南通市2025屆高三第一次調(diào)研測(cè)試(一模)地理試卷(含答案 )
- 2025年上海市閔行區(qū)中考數(shù)學(xué)一模試卷
- 2025中國(guó)人民保險(xiǎn)集團(tuán)校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 重癥患者家屬溝通管理制度
- 法規(guī)解讀丨2024新版《突發(fā)事件應(yīng)對(duì)法》及其應(yīng)用案例
- IF鋼物理冶金原理與關(guān)鍵工藝技術(shù)1
- 銷售提成對(duì)賭協(xié)議書(shū)范本 3篇
- 勞務(wù)派遣招標(biāo)文件范本
- EPC項(xiàng)目階段劃分及工作結(jié)構(gòu)分解方案
- 《跨學(xué)科實(shí)踐活動(dòng)4 基于特定需求設(shè)計(jì)和制作簡(jiǎn)易供氧器》教學(xué)設(shè)計(jì)
- 信息安全意識(shí)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論