經(jīng)典C++筆試題目100例诅需,接近實(shí)際漾唉,值得一看睬关!

第一部分:C++與C語言的差異(1-18)

1、C 和 C++ 中 struct 有什么區(qū)別?


?Protection行為能否定義函數(shù)

C無否毅弧,但可以有函數(shù)指針

C++有可以诞外,默認(rèn)是public


2、C++中的 struct 和 class 有什么區(qū)別丐箩?

【參考答案】從語法上講,class和struct做類型定義時(shí)只有兩點(diǎn)區(qū)別:?

(一)默認(rèn)繼承權(quán)限恤煞。如果不明確指定屎勘,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理居扒;?

(二)成員的默認(rèn)訪問權(quán)限概漱。class的成員默認(rèn)是private權(quán)限,struct默認(rèn)是public權(quán)限喜喂。 除了這兩點(diǎn)瓤摧,class和struct基本就是一個東西。語法上沒有任何其它區(qū)別玉吁。

3照弥、如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的?

【標(biāo)準(zhǔn)答案】



#ifdef __cplusplus??

? ?? ???cout<<“c++";??

#else??

? ? ? ? printf("c");??

#endif??

復(fù)制代碼

4进副、 C和C++有什么不同?

【參考答案】

從機(jī)制上:C是面向過程的(但C也可以編寫面向?qū)ο蟮某绦颍┱獯В籆++是面向?qū)ο蟮模峁┝祟愑鞍摺5歉蓿珻++編寫面向?qū)ο蟮某绦虮菴容易。

從適用的方向:C適合要求代碼體積小的矫户,效率高的場合片迅,如嵌入式;C++適合更上層的吏垮,復(fù)雜的; llinux核心大部分是C寫的障涯,因?yàn)樗窍到y(tǒng)軟件,效率要求極高膳汪。

從名稱上也可以看出唯蝶,C++比C多了+,說明C++是C的超集遗嗽;那為什么不叫C+而叫C++呢粘我,是因?yàn)镃++比C來說擴(kuò)充的東西太多了,所以就在C后面放上兩個+;于是就成了C++征字。

C語言是結(jié)構(gòu)化編程語言都弹,C++是面向?qū)ο缶幊陶Z言。 C++側(cè)重于對象而不是過程匙姜,側(cè)重于類的設(shè)計(jì)而不是邏輯的設(shè)計(jì)畅厢。

5、“引用”與指針的區(qū)別是什么氮昧?

【參考答案】

指針通過某個指針變量指向一個對象后框杜,對它所指向的變量間接操作。程序中使用指針袖肥,程序的可讀性差咪辱;

而引用本身就是目標(biāo)變量的別名,對引用的操作就是對目標(biāo)變量的操作椎组。

6油狂、虛函數(shù)


class A??{? ?

? ?virtual void func1();? ?

? ?void func2();? ?

} 寸癌;??


class B: class A {? ?

? ?void func1() {??

? ?? ???cout < < "fun1 in class B" < < endl;??

? ? }? ?

? ? virtual void func2() {??

? ? cout < < "fun2 in class B" < < endl;??

? ? }? ?

}? ?

復(fù)制代碼

A专筷、A中的func1和B中的func2都是虛函數(shù)

B、A中的func1和B中的func2都不是虛函數(shù).?

C灵份、A中的func2是虛函數(shù).仁堪,B中的func1不是虛函數(shù).?

D、A中的func2不是虛函數(shù)填渠,B中的func1是虛函數(shù).?

【標(biāo)準(zhǔn)答案】A

7、int id[sizeof(unsigned long)]; 這個對嗎鸟辅?為什么氛什?

【標(biāo)準(zhǔn)答案】正確 這個 sizeof是編譯時(shí)運(yùn)算符,編譯時(shí)就確定了 可以看成和機(jī)器有關(guān)的常量匪凉。

8枪眉、某文件中定義的靜態(tài)全局變量(或稱靜態(tài)外部變量)其作用域是 () ?

A.只限某個函數(shù)??B.本文件? ??

C.跨文件 D.不限制作用域

【參考答案】B。靜態(tài)全局變量則限制了其作用域再层, 即只在定義該變量的源文件內(nèi)有效贸铜, 在同一源程序的其它源文件中不能使用它。

由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi)聂受,只能為該源文件內(nèi)的函數(shù)公用蒿秦, 因此可以避免在其它源文件中引起錯誤。

9蛋济、C++函數(shù)中值的傳遞方式有哪幾種棍鳖?

【標(biāo)準(zhǔn)答案】C++函數(shù)的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞碗旅。

10渡处、對于一個頻繁使用的短小函數(shù),在C語言中應(yīng)用什么實(shí)現(xiàn),在C++中應(yīng)用什么實(shí)現(xiàn)镜悉?

【標(biāo)準(zhǔn)答案】C用宏定義,C++用 inline

11医瘫、引用與指針有什么區(qū)別侣肄?

【參考答案】??

1) 引用必須被初始化,指針不必醇份。

2) 引用初始化以后不能被改變稼锅,指針可以改變所指的對象。

3) 不存在指向空值的引用被芳,但是存在指向空值的指針

12缰贝、C++中 virtual 與 inline 的含義分別是什么?

【參考答案】

在基類成員函數(shù)的聲明前加上virtual關(guān)鍵字畔濒,意味著將該成員函數(shù)聲明為虛函數(shù)剩晴。

inline與函數(shù)的定義體放在一起,使該函數(shù)稱為內(nèi)聯(lián)侵状。inline是一種用于實(shí)現(xiàn)的關(guān)鍵字赞弥,而不是用于聲明的關(guān)鍵字。

## 虛函數(shù)的特點(diǎn)趣兄;

如果希望派生類能夠重新定義基類的方法绽左,則在基類中將該方法定義為虛方法,這樣可以啟用動態(tài)聯(lián)編艇潭。

## 內(nèi)聯(lián)函數(shù)的特點(diǎn)拼窥;

使用內(nèi)聯(lián)函數(shù)的目的是為了提高函數(shù)的運(yùn)行效率。

內(nèi)聯(lián)函數(shù)體的代碼不能過長蹋凝,因?yàn)閮?nèi)聯(lián)函數(shù)省去調(diào)用函數(shù)的時(shí)間是以代碼膨脹為代價(jià)的鲁纠。

內(nèi)聯(lián)函數(shù)不能包含循環(huán)語句,因?yàn)閳?zhí)行循環(huán)語句要比調(diào)用函數(shù)的開銷大鳍寂。

13改含、VC 中,編譯工具條內(nèi)的 Debug 與 Release 選項(xiàng)是什么含義迄汛?

【參考答案】

Debug 通常稱為調(diào)試版本捍壤,它包含調(diào)試信息,并且不作任何優(yōu)化鞍爱,便于程序員調(diào)試程序鹃觉。

Release 稱為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化硬霍,使得程序在代碼大小和運(yùn)行速度上都是最優(yōu)的帜慢,以便用戶很好地使用。

Debug 帶有大量的調(diào)試代碼,運(yùn)行時(shí)需要相應(yīng)的運(yùn)行庫粱玲,發(fā)布模式程序緊湊不含有調(diào)試代碼和信息躬柬,直接可以運(yùn)行(如果不需要運(yùn)行庫)

14、函數(shù) assert 的用法?

【參考答案】

斷言assert是僅在debug版本起作用的宏抽减,用于檢查“不應(yīng)該“發(fā)生的情況允青。

程序員可以把a(bǔ)ssert看成一個在任何系統(tǒng)狀態(tài)下都可以安全使用的無害測試手段。

15卵沉、 const??與 #define 的比較 颠锉,const有什么優(yōu)點(diǎn)?

【參考答案】

(1) const 常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型史汗。編譯器可以對前者進(jìn)行類型安全檢查琼掠。

??而對后者只進(jìn)行字符替換,沒有類型安全檢查停撞,并且在字符替換可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng)) 瓷蛙。

(2)有些集成化的調(diào)試工具可以對 const 常量進(jìn)行調(diào)試,但是不能對宏常量進(jìn)行調(diào)試戈毒。

16艰猬、請你談?wù)勔煤椭羔樀膮^(qū)別。

【參考答案】

(1)引用被創(chuàng)建的同時(shí)必須被初始化(指針則可以在任何時(shí)候被初始化) 埋市。?

(2)不能有 NULL 引用冠桃,引用必須與合法的存儲單元關(guān)聯(lián)(指針則可以是 NULL) 。?

(3)一旦引用被初始化道宅,就不能改變引用的關(guān)系(指針則可以隨時(shí)改變所指的對象) 食听。

17、有了 malloc/free 為什么還要 new/delete??污茵?

【參考答案】

malloc 與 free 是 C++/C 語言的標(biāo)準(zhǔn)庫函數(shù)碳蛋,new/delete 是 C++的運(yùn)算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存省咨。?

對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用 maloc/free 無法滿足動態(tài)對象的要求玷室。對象在創(chuàng)建的同時(shí)要自動執(zhí)行構(gòu)造函數(shù)零蓉,對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。

由于malloc/free 是庫函數(shù)而不是運(yùn)算符穷缤,不在編譯器控制權(quán)限之內(nèi)敌蜂,不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于 malloc/free。

因此 C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運(yùn)算符 new津肛,以及一個能完成清理與釋放內(nèi)存工作的運(yùn)算符 delete章喉。

注意 new/delete 不是庫函數(shù)。

18、如果在申請動態(tài)內(nèi)存時(shí)找不到足夠大的內(nèi)存塊秸脱,malloc 和 new 將返回 NULL 指針落包,宣告內(nèi)存申請失敗。你是怎么處理內(nèi)存耗盡的摊唇?

【參考答案】

(1)判斷指針是否為 NULL咐蝇,如果是則馬上用 return 語句終止本函數(shù)。

(2)判斷指針是否為 NULL巷查,如果是則馬上用 exit(1) 終止整個程序的運(yùn)行?

(3)為 new 和 malloc 設(shè)置異常處理函數(shù)有序。例如 Visual C++可以用_set_new_hander 函數(shù)為 new 設(shè)置用戶自己定義的異常處理函數(shù),

也可以讓 malloc 享用與 new 相同的異常處理函數(shù)岛请。

第二部分:數(shù)據(jù)類型旭寿、關(guān)鍵字(19-37)

19、C++是不是類型安全的崇败?

【參考答案】不是盅称。兩個不同類型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpret cast)。

20僚匆、const 符號常量微渠;

(1)const char *p

(2)char const *p

(3)char * const p

說明上面三種描述的區(qū)別;

【參考答案】

(1) p是一個指向const char的指針咧擂,p是可以改變指向的逞盆,但是p指向的值是不能改變的;? ?? ?

(2) p指向的恰好是一個指向const的char的普通指針;

(3) p是一個指針松申,這個指針是指向char的const指針云芦。? ?? ?

(1)和(2)的定義是一樣的。

21贸桶、用C++寫個程序舅逸,如何判斷一個操作系統(tǒng)是16位還是32位的?

【標(biāo)準(zhǔn)答案】

定義一個指針p皇筛,打印出sizeof(p),如果節(jié)后是4琉历,則表示該操作系統(tǒng)是32位,打印結(jié)果是2水醋,表示是16位旗笔。

22、用C++寫個程序拄踪,如何判斷一個操作系統(tǒng)是16位還是32位的蝇恶?不能用 sizeof() 函數(shù)。

【參考答案】? ??


int a = ~0;

if(a > 65536) {

? ? cout<<"32 bit"<<endl;

} else {

? ? cout<<"16 bit"<<endl;

}

復(fù)制代碼

23惶桐、識別函數(shù)或指針

void * ( * (*fp1)(int))[10];?

float (*(* fp2)(int,int,int))(int);

int (* ( * fp3)())[10]();?

分別表示什么意思撮弧?

【標(biāo)準(zhǔn)答案】? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???

1潘懊、void * ( * (*fp1)(int))[10];??fp1是一個指針,指向一個函數(shù)贿衍,這個函數(shù)的參數(shù)為int型授舟,函數(shù)的返回值是一個指針,這個指針指向一個數(shù)組舌厨,

這個數(shù)組有10個元素岂却,每個元素是一個void*型指針。

2裙椭、float (*(* fp2)(int,int,int))(int);??fp2是一個指針躏哩,指向一個函數(shù),這個函數(shù)的參數(shù)為3個int型揉燃,函數(shù)的返回值是一個指針扫尺,這個指針指向一個函數(shù),

這個函數(shù)的參數(shù)為int型炊汤,函數(shù)的返回值是float型正驻。

3、int (* ( * fp3)())[10]();??fp3是一個指針抢腐,指向一個函數(shù)姑曙,這個函數(shù)的參數(shù)為空,函數(shù)的返回值是一個指針迈倍,這個指針指向一個數(shù)組伤靠,

這個數(shù)組有10個元素,每個元素是一個指針啼染,指向一個函數(shù)宴合,這個函數(shù)的參數(shù)為空,函數(shù)的返回值是int型迹鹅。? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?

24卦洽、多態(tài)類中的虛函數(shù)表是 Compile-Time,還是 Run-Time 時(shí)建立的斜棚?

【標(biāo)準(zhǔn)答案】

虛擬函數(shù)表是在編譯期就建立了,各個虛擬函數(shù)這時(shí)被組織成了一個虛擬函數(shù)的入口地址的數(shù)組.而對象的隱藏成員--虛擬函數(shù)表指針是

在運(yùn)行期--也就是構(gòu)造函數(shù)被調(diào)用時(shí)進(jìn)行初始化的,這是實(shí)現(xiàn)多態(tài)的關(guān)鍵阀蒂。

25、錯誤的轉(zhuǎn)義字符是弟蚀?

A脂新、'\091'?

B、'\\'

C粗梭、'\0' D.'\''

【標(biāo)準(zhǔn)答案】A

26、若數(shù)組名作實(shí)參而指針變量作形參级零,函數(shù)調(diào)用實(shí)參傳給形參的是断医?

A滞乙、數(shù)組的長度??B.數(shù)組第一個元素的值

C、數(shù)組所有元素的值

D鉴嗤、數(shù)組第一個元素的地址

【標(biāo)準(zhǔn)答案】D

27斩启、變量的指針含意是指變量的?

A.值? ? B.地址 C.存儲? ? D.名字

【標(biāo)準(zhǔn)答案】B

28醉锅、內(nèi)存的分配方式有幾種兔簇?

【參考答案】

一、從靜態(tài)存儲區(qū)域分配硬耍。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好垄琐,這塊內(nèi)存在程序的整個運(yùn)行期間都存在。例如全局變量经柴。

二狸窘、在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí)坯认,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建翻擒,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲單元自動被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中牛哺,效

率很高陋气,但是分配的內(nèi)存容量有限。

三引润、從堆上分配巩趁,亦稱動態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc或new申請任意多少的內(nèi)存椰拒,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存晶渠。動態(tài)內(nèi)存的生存期由我們

決定,使用非常靈活燃观,但問題也最多褒脯。

29、float a,b,c , 問等式 (a+b)+c==(b+a)+c 和 (a+b)+c==(a+c)+b 能否成立?

【參考答案】

兩者都不行预鬓。在比較float或double時(shí)诡必,不能簡單地比較。由于計(jì)算誤差颁督,相等的概率很低。應(yīng)判斷兩數(shù)之差是否落在區(qū)間(-e,e)內(nèi)浇雹。

這個e應(yīng)比浮點(diǎn)數(shù)的精度大一個數(shù)量級沉御。

30、全局變量和局部變量有什么區(qū)別昭灵?是怎么實(shí)現(xiàn)的吠裆?操作系統(tǒng)和編譯器是怎么知道的伐谈??

【參考答案】

生命周期不同:

全局變量隨主程序創(chuàng)建和創(chuàng)建,隨主程序銷毀而銷毀试疙;

局部變量在局部函數(shù)內(nèi)部诵棵,甚至局部循環(huán)體等內(nèi)部存在,退出就不存在祝旷; 內(nèi)存中分配在全局?jǐn)?shù)據(jù)

區(qū)履澳。?

使用方式不同:

通過聲明后全局變量程序的各個部分都可以用到;局部變量只能在局部使用怀跛;分配在棧區(qū)距贷。

操作系統(tǒng)和編譯器通過內(nèi)存分配的位置來知道的,全局變量分配在全局?jǐn)?shù)據(jù)段并且在程序開始運(yùn)行的時(shí)候被加載敌完。局部變量則分配在堆棧里面 储耐。

31、Heap 與 Stack 的差別

【參考答案】

Heap是堆滨溉,stack是棧什湘。 Stack的空間由操作系統(tǒng)自動分配/釋放,Heap上的空間手動分配/釋放晦攒。

Stack空間有限闽撤,Heap是很大的自由存儲區(qū) C中的malloc函數(shù)分配的內(nèi)存空間即在堆上,C++中對應(yīng)的是new操作符。

程序在編譯期對變量和函數(shù)分配內(nèi)存都在棧上進(jìn)行,且程序運(yùn)行過程中函數(shù)調(diào)用時(shí)參數(shù)的傳遞也在棧上進(jìn)行

32脯颜、In C++, what does "explicit" mean? what does "protected" mean??

【標(biāo)準(zhǔn)答案】

C++中的 explicit 關(guān)鍵字用來修飾類的構(gòu)造函數(shù)哟旗,表明該構(gòu)造函數(shù)是顯式的,在某些情況下栋操,我們要求類的使用者必須顯示調(diào)用類的構(gòu)造函數(shù)時(shí)就需要使用 explicit闸餐,反之默認(rèn)類型轉(zhuǎn)換可能會造成無法預(yù)期的問題。

protected 控制的是一個函數(shù)對一個類的成員(包括成員變量及成員方法)的訪問權(quán)限矾芙。protected成員只有該類的成員函數(shù)及其派生類的成員函數(shù)可以訪問舍沙。

33、重復(fù)多次 fclose 一個打開過一次的 FILE *fp 指針會有什么結(jié)果剔宪,并請解釋拂铡。?

【參考答案】

考察點(diǎn):導(dǎo)致文件描述符結(jié)構(gòu)中指針指向的內(nèi)存被重復(fù)釋放,進(jìn)而導(dǎo)致一些不可預(yù)期的異常葱绒。

34感帅、為什么數(shù)組名作為參數(shù),會改變數(shù)組的內(nèi)容地淀,而其它類型如int卻不會改變變量的值失球?

【參考答案】

當(dāng)數(shù)組名作為參數(shù)時(shí),傳遞的實(shí)際上是地址帮毁。

而其他類型如int作為參數(shù)時(shí)她倘,由于函數(shù)參數(shù)值實(shí)質(zhì)上是實(shí)參的一份拷貝璧微,被調(diào)函數(shù)內(nèi)部對形參的改變并不影響實(shí)參的值。

35硬梁、你覺得如果不使用常量,直接在程序中填寫數(shù)字或字符串胞得,將會有什么麻煩荧止??

【參考答案】

(1)??程序的可讀性(可理解性)變差。程序員自己會忘記那些數(shù)字或字符串是什么意思阶剑,用戶則更加不知它們從何處來跃巡、表示什么。?

(2)??在程序的很多地方輸入同樣的數(shù)字或字符串牧愁,難保不發(fā)生書寫錯誤素邪。?

(3)??如果要修改數(shù)字或字符串,則會在很多地方改動猪半,既麻煩又容易出錯兔朦。

36、為什么需要使用堆磨确,使用堆空間的原因沽甥?

【參考答案】

直到運(yùn)行時(shí)才知道一個對象需要多少內(nèi)存空間;不知道對象的生存期到底有多長乏奥。

37摆舟、 const關(guān)鍵字?有哪些作用邓了?

【參考答案】

const關(guān)鍵字至少有下列n個作用:

(1)欲阻止一個變量被改變恨诱,可以使用const關(guān)鍵字。在定義該const變量時(shí)骗炉,通常需要對它進(jìn)行初始化照宝,因?yàn)橐院缶蜎]有機(jī)會再去改變它了;

(2)對指針來說痕鳍,可以指定指針本身為const硫豆,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const笼呆;

(3)在一個函數(shù)聲明中熊响,const可以修飾形參,表明它是一個輸入?yún)?shù)诗赌,在函數(shù)內(nèi)部不能改變其值汗茄;

(4)對于類的成員函數(shù),若指定其為const類型铭若,則表明其是一個常函數(shù)洪碳,不能修改類的成員變量递览;

(5)對于類的成員函數(shù),有時(shí)候必須指定其返回值為const類型瞳腌,以使得其返回值不為“左值”绞铃。

注: 這個題可以考查面試者對程序設(shè)計(jì)知識的掌握程度是初級、中級還是比較深入嫂侍,沒有一定的知識廣度和深度儿捧,不可能對這個問題給出全面的解答。大多數(shù)人只能回答出 static 和 const 關(guān)鍵字的部分功能挑宠。

第三部分:C++面向?qū)ο蟮奶匦裕?8-61)

38菲盾、是不是一個父類寫了一個virtual 函數(shù),如果子類覆蓋它的函數(shù)不加virtual ,也能實(shí)現(xiàn)多態(tài)?

【參考答案】

virtual修飾符會被隱形繼承的各淀。virtual可加可不加懒鉴。子類的空間里有父類的所有變量(static除外)。同一個函數(shù)只存在一個實(shí)體(inline除外)碎浇。子類覆蓋它的函數(shù)不加virtual ,也能

實(shí)現(xiàn)多態(tài)临谱。在子類的空間里,有父類的私有變量南捂。私有變量不能直接訪問吴裤。

39、面向?qū)ο蟮娜齻€基本特征溺健,并簡單敘述之麦牺?

【參考答案】? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?

1. 封裝:將客觀事物抽象成類,每個類對自身的數(shù)據(jù)和方法實(shí)行protection(private, protected, public)? ?? ?? ?? ?? ?? ?

2. 繼承:廣義的繼承有三種實(shí)現(xiàn)形式:

實(shí)現(xiàn)繼承(指使用基類的屬性和方法而無需額外編碼的能力)鞭缭、

可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)剖膳、

接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn))岭辣。

前兩種(類繼承)和后一種(對象組合=>接口繼承以及純虛函數(shù))構(gòu)成了功能復(fù)用的兩種方式吱晒。? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?

3. 多態(tài):是將父對象設(shè)置成為和一個或更多的與他的子對象相等的技術(shù),賦值之后沦童,父對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作仑濒。

簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針偷遗。

40墩瞳、重載(overload)、重寫(override氏豌,有的書也叫做“覆蓋”)喉酌、重定義(redefinition)的區(qū)別?

【標(biāo)準(zhǔn)答案】

重載? ? 同一名字空間??是指允許存在多個同名函數(shù),而這些函數(shù)的參數(shù)表不同泪电。

重定義/隱藏??不同名字空間 用于繼承般妙,派生類與基類的函數(shù)同名,屏蔽基類的函數(shù)

重寫/覆蓋 不同名字空間

用于繼承相速,子類重新定義父類虛函數(shù)的方法

41碟渺、多態(tài)的作用?

【參考答案】

主要是兩個:

1. 隱藏實(shí)現(xiàn)細(xì)節(jié)突诬,使得代碼能夠模塊化止状;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用攒霹;

2. 接口重用:為了類在繼承和派生的時(shí)候,保證使用家族中任一類的實(shí)例的某一屬性時(shí)的正確調(diào)用浆洗。

42催束、當(dāng)一個類A 中沒有聲命任何成員變量與成員函數(shù),這時(shí)sizeof(A)的值是多少,如果不是零伏社,請解釋一下編譯器為什么沒有讓它為零抠刺。

【標(biāo)準(zhǔn)答案】

sizeof(A) = 1;

43摘昌、如果 ClassA 中定義并實(shí)現(xiàn)虛函數(shù) int func(void)速妖,ClassB 中也實(shí)現(xiàn)該函數(shù),那么上述變量 a->func() 將調(diào)用哪個類里面的函數(shù)聪黎?如果 int func(void) 不是虛函數(shù)罕容,情況又如何?為什么稿饰?

【參考答案】

第一問調(diào)用的是B的锦秒。第二問調(diào)用A的。

虛函數(shù)的一個典型應(yīng)用喉镰,虛函數(shù)只能借助于指針或者引用來達(dá)到多態(tài)的效果旅择。

44、 C++里面是不是所有的動作都是main()引起的侣姆?如果不是生真,請舉例。

【參考答案】

比如全局變量的初始化捺宗,就不是由 main 函數(shù)引起的柱蟀。舉例:? ?? ???


class? ?A{

};

A? ?a;? ?//a的構(gòu)造函數(shù)限執(zhí)行

int? ?main() {

}

復(fù)制代碼

45、 內(nèi)聯(lián)函數(shù)在編譯時(shí)是否做參數(shù)類型檢查

【參考答案】

內(nèi)聯(lián)函數(shù)要做參數(shù)類型檢查,? ?這是內(nèi)聯(lián)函數(shù)跟宏相比的優(yōu)勢偿凭。? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???

46产弹、請講一講析構(gòu)函數(shù)和虛函數(shù)的用法和作用??

【參考答案】

析構(gòu)函數(shù)是特殊的類成員函數(shù),它沒有返回類型痰哨,沒有參數(shù)胶果,不能隨意調(diào)用,也沒有重載斤斧,只有在類對象的生命期結(jié)束的時(shí)候早抠,由系統(tǒng)自動調(diào)用。

有適放內(nèi)存空間的作用撬讽。

虛函數(shù)是C++多態(tài)的一種表現(xiàn), 使用虛函數(shù)蕊连,我們可以靈活的進(jìn)行動態(tài)綁定,當(dāng)然是以一定的開銷為代價(jià)游昼。

47甘苍、“new”in c++ is a?

A. library function like malloc in c?

B. key word

C. operator

D. none of the above

【參考答案】C烘豌。

malloc是庫函數(shù)载庭,不在編譯器控制范圍之內(nèi);new是運(yùn)算符廊佩,在編譯器控制范圍之內(nèi)囚聚。? ?

調(diào)用malloc時(shí),從堆中申請內(nèi)存标锄;調(diào)用new時(shí)顽铸,從堆中申請內(nèi)存并為內(nèi)存調(diào)用構(gòu)造函數(shù)。

48料皇、對于C++中類(class) 與結(jié)構(gòu)(struct)的描述正確的為:

A谓松、類中的成員默認(rèn)是private的,但是可以聲明public,private 和 protected,結(jié)構(gòu)中定義的成員默認(rèn)的都是public;

B、結(jié)構(gòu)中不允許定義成員函數(shù),但是類中可以定義成員函數(shù);

C瓶蝴、結(jié)構(gòu)實(shí)例使用malloc() 動態(tài)創(chuàng)建,類對象使用new 操作符動態(tài)分配內(nèi)存;

D毒返、結(jié)構(gòu)和類對象都必須使用new 創(chuàng)建;

E、結(jié)構(gòu)中不可以定義虛函數(shù),但是類中可以定義虛函數(shù).

F舷手、結(jié)構(gòu)不可以存在繼承關(guān)系,但是類可以存在繼承關(guān)系.

【標(biāo)準(zhǔn)答案】A,D

49拧簸、兩個互相獨(dú)立的類:ClassA 和 ClassB,都各自定義了非靜態(tài)的公有成員函數(shù) PublicFunc() 和非靜態(tài)的私有成員函數(shù) PrivateFunc(); 現(xiàn)在要在ClassA 中增加定義一個成員函數(shù)ClassA::AdditionalPunction(ClassA a,ClassB b);則可以在AdditionalPunction(ClassA x,ClassB y)的實(shí)現(xiàn)部分(函數(shù)功能體內(nèi)部)出現(xiàn)的合法的表達(dá)是最全的是:

A男窟、x.PrivateFunc();x.PublicFunc();y.PrivateFunc();y.PublicFunc();

B盆赤、x.PrivateFunc();x.PublicFunc();y.PublicFunc();

C、x.PrivateFunc();y.PrivateFunc();y.PublicFunc();

D歉眷、x.PublicFunc();y.PublicFunc();

【標(biāo)準(zhǔn)答案】B

50牺六、C++程序下列說法正確的有:

A、對調(diào)用的虛函數(shù)和模板類都進(jìn)行遲后編譯.

B汗捡、基類與子類中函數(shù)如果要構(gòu)成虛函數(shù),除了要求在基??類中用virtual 聲名,而且必須名字相同且參數(shù)類型相同返回類型相同淑际。

C畏纲、重載的類成員函數(shù)都必須要:或者返回類型不同,或者參數(shù)數(shù)目不同,或者參數(shù)序列的類型不同.

D、靜態(tài)成員函數(shù)和內(nèi)聯(lián)函數(shù)不能是虛函數(shù),友員函數(shù)和構(gòu)造函數(shù)也不能是虛函數(shù),但是析構(gòu)函數(shù)可以是虛函數(shù).

【標(biāo)準(zhǔn)答案】A

51春缕、在C++中有沒有純虛構(gòu)造函數(shù)盗胀??

【標(biāo)準(zhǔn)答案】構(gòu)造函數(shù)不能是虛的。只能有虛的析構(gòu)函數(shù)锄贼。

52票灰、下面的 throw 表達(dá)式哪些是錯誤的?

(a) class exceptionType { };?

? ???throw exceptionType { };?

(b) enum mathErr { overflow, underflow, zeroDivide };?

? ? throw zeroDivide();?

【標(biāo)準(zhǔn)答案】

(a) class exceptionType { };?

? ???throw exceptionType();

(b) enum mathErr { overflow, underflow, zeroDivide };?

? ? throw zeroDivide;?

53宅荤、談?wù)勀闶窃趺凑J(rèn)識 C++ 中的模板的屑迂?

【參考答案】

模板使程序員能夠快速建立具有類型安全的類庫集合和函數(shù)集合,它的實(shí)現(xiàn)冯键,方便了大規(guī)模的軟件開發(fā)惹盼。(結(jié)合stl更好)

54、在 C++的一個類中聲明一個 static 成員變量有沒有用惫确?

【參考答案】

在C++類的成員變量被聲明為 static(稱為靜態(tài)成員變量)逻锐,意味著它為該類的所有實(shí)例所共享,也就是說當(dāng)某個類的實(shí)例修改了該靜態(tài)成員變量雕薪,

也就是說不管創(chuàng)建多少對象,static修飾的變量只占有一塊內(nèi)存晓淀。其修改值為該類的其它所有實(shí)例所見所袁;而類的靜態(tài)成員函數(shù)也只能訪問靜態(tài)成員(變量或函數(shù))。static是加了訪問控制的全局變量凶掰,不被繼承燥爷。

55、C++中為什么用模板類懦窘?

【參考答案】

(1)可用來創(chuàng)建動態(tài)增長和減小的數(shù)據(jù)結(jié)構(gòu)

(2)它是類型無關(guān)的前翎,因此具有很高的可復(fù)用性。

(3)它在編譯時(shí)而不是運(yùn)行時(shí)檢查數(shù)據(jù)類型畅涂,保證了類型安全(4)它是平臺無關(guān)的港华,可移植性(5)可用于基本數(shù)據(jù)類型

56、函數(shù)模板與類模板有什么區(qū)別午衰?

【參考答案】

函數(shù)模板的實(shí)例化是由編譯程序在處理函數(shù)調(diào)用時(shí)自動完成的立宜,而類模板的實(shí)例化必須由程序員在程序中顯式地指定。

58臊岸、請你談?wù)勀阍陬愔腥绾问褂?const 的橙数。

【參考答案】

有時(shí)我們希望某些常量只在類中有效。由于#define 定義的宏常量是全局的帅戒,不能達(dá)到目的灯帮,于是想當(dāng)然地覺得應(yīng)該用 const 修飾數(shù)據(jù)成員來實(shí)現(xiàn)。

const 數(shù)據(jù)成員的確是存在的,但其含義卻不是我們所期望的钟哥。const 數(shù)據(jù)成員只在某個對象生存期內(nèi)是常量迎献,而對于整個類而言卻是可變的,因?yàn)轭惪梢詣?chuàng)建多個對象瞪醋,不同的對象其 const 數(shù)據(jù)成員的值可以不同忿晕。 不能在類聲明中初始化 const 數(shù)據(jù)成員。

const 數(shù)據(jù)成員的初始化只能在類構(gòu)造函數(shù)的初始化表中進(jìn)行银受。

59践盼、函數(shù)重載,我們靠什么來區(qū)分調(diào)用的那個函數(shù)宾巍?靠返回值判斷可以不可以咕幻?

【參考答案】

如果同名函數(shù)的參數(shù)不同(包括類型、順序不同) 顶霞,那么容易區(qū)別出它們是不同的肄程。如果同名函數(shù)僅僅是返回值類型不同,有時(shí)可以區(qū)分选浑,有時(shí)卻不能蓝厌。例如:?

void Function(void);?

int??Function (void);?

上述兩個函數(shù),第一個沒有返回值古徒,第二個的返回值是 int 類型拓提。如果這樣調(diào)用函數(shù):?

int??x = Function ();?

則可以判斷出 Function 是第二個函數(shù)。問題是在 C++/C 程序中隧膘,我們可以忽略函數(shù)的返回值代态。在這種情況下,編譯器和程序員都不知道哪個 Function 函數(shù)被調(diào)用疹吃。 所以只能靠參數(shù)而不能靠返回值類型的不同來區(qū)分重載函數(shù)蹦疑。

60、所有的運(yùn)算符都能重載嗎萨驶?

【參考答案】

不能被重載的運(yùn)算符?

在 C++運(yùn)算符集合中歉摧,有一些運(yùn)算符是不允許被重載的。這種限制是出于安全方面的考慮腔呜,可防止錯誤和混亂琳疏。?

(1)不能改變 C++內(nèi)部數(shù)據(jù)類型(如 int,float 等)的運(yùn)算符须教。?

(2)不能重載‘.’,因?yàn)椤?’在類中對任何成員都有意義,已經(jīng)成為標(biāo)準(zhǔn)用法鲫剿。?

(3)不能重載目前 C++運(yùn)算符集合中沒有的符號万哪,如#,@,$等芒粹。原因有兩點(diǎn),一是難以理解娘侍,二是難以確定優(yōu)先級。?

(4)對已經(jīng)存在的運(yùn)算符進(jìn)行重載時(shí)泳炉,不能改變優(yōu)先級規(guī)則憾筏,否則將引起混亂。?

61花鹅、基類的析構(gòu)函數(shù)不是虛函數(shù)氧腰,會帶來什么問題?

【參考答案】

派生類的析構(gòu)函數(shù)用不上刨肃,會造成資源的泄漏古拴。

第四部分:程序閱讀題(62-90)

62、main 函數(shù)執(zhí)行以前真友,還會執(zhí)行什么代碼黄痪?

【參考答案】

全局對象的構(gòu)造函數(shù)會在main 函數(shù)之前執(zhí)行。

63盔然、 There are two int variables: a and b, don't use“if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.

【標(biāo)準(zhǔn)答案】

( ( a + b ) + abs( a - b ) ) / 2

64桅打、如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號?

【標(biāo)準(zhǔn)答案】

cout << __FILE__ ;

cout<<__LINE__ ;

__FILE__和__LINE__是系統(tǒng)預(yù)定義宏愈案,這種宏并不是在某個文件中定義的挺尾,而是由編譯器定義的。(C也有)

65站绪、下面兩種if語句判斷方式潦嘶。請問哪種寫法更好?為什么崇众???

int n;

if (n == 10) // 第一種判斷方式

if (10 == n) // 第二種判斷方式

【參考答案】

這是一個風(fēng)格問題,第二種方式如果少了個=號,編譯時(shí)就會報(bào)錯,減少了出錯的可能行,可以檢測出是否少了=航厚。

66顷歌、寫出運(yùn)行結(jié)果:


{

? ? // test1??char str[] = "world";

? ???cout << sizeof(str) << ": ";

? ? char *p = str;

? ? cout << sizeof(p) << ": ";

? ? char i = 10;

? ? cout << sizeof(i) << ": ";

? ? void *pp = malloc(10);

? ???cout << sizeof(pp) << endl;

}

復(fù)制代碼

【標(biāo)準(zhǔn)答案】6:4:1:4

67、在不用第三方參數(shù)的情況下幔睬,交換兩個參數(shù)的值眯漩。

【參考答案】

a = a + b;?

b = a – b; a = a – b;

68、以下代碼如果有錯麻顶,請?jiān)撜舛叮懗鲚敵鼋Y(jié)果??


void main(void)

{

? ? int nArrLength(400), i = 546;? ???

? ? for (int i = 0; i< 99999999999; i++);

? ?? ???cout << nArrLength << endl;

? ? cout << i << endl;

}

復(fù)制代碼

【標(biāo)準(zhǔn)答案】


void main(void)

{ ? ? ? ??

? ? ? ? int nArrLength(400), i = 546;? ?? ???

? ? ? ? ? ? ? ???/*主要是考看對C++的基礎(chǔ)知識是否了解這里的int nArrLength(400)是對整數(shù)的定義辅肾,當(dāng)然队萤,明名上有問題,這里是故意這樣的矫钓,

? ? ? ? ? ? ? ? 但是要尔,最好是變量名改為 ....[還是您自己看著辦了]*/


? ? ? ???for (int i = 0; i< 99999999999; i++);?

? ? ? ? ? ? ? ? /*這里是考對變量越界理解舍杜,同時(shí)....,所以赵辕,999...應(yīng)該改為 ~((int)0),也就是整數(shù)中0取反考對變量塊作用域的理解既绩,這里的i,在循環(huán)后就不存在了*/? ?? ? ? ??

? ? ? ? cout << nArrLength << endl;? ?? ?? ???// 這里輸出 400??? ? ? ??

? ? ? ? cout << i << endl;? ?? ?? ?? ?? ?? ???// 這里輸出 546?

??}

復(fù)制代碼

69还惠、int i = 5, b = 7; cout << (i+++b) <<endl; 不用調(diào)試饲握,請說出,以上代碼在gcc編譯過后的執(zhí)行結(jié)果蚕键!

【標(biāo)準(zhǔn)答案】結(jié)果是12救欧。

70、寫一個能做左值的函數(shù)(方法有很多)嚎幸。

如:max(x, y) += 2874 + 55; drwline(x, y)++;

【參考答案】??


int &max(int & x, int & y)

{

? ? return x > y? x : y;

}


int x = 55, y = 77;

max(x, y) += 12 + 11; // 此時(shí) y = 92;

cout << "x = "x << "; y = "<< y << endl; // 輸出 x = 55; y = 92;

復(fù)制代碼

71颜矿、程序輸出


class human

{

public:

? ? ? ? ~human()

? ? ? ? {

? ? ? ? ? ? ? ? cout << "human over......" << endl;

? ? ? ? }

? ? ? ? void Disp()

? ? ? ? {

? ? ? ? ? ? ? ? cout << "human disp ... ..." << endl;

? ? ? ? }

};


class man : public human

{

public:

? ? ? ? ~man()

? ? ? ? {

? ? ? ? ? ? ? ? cout << "man over......" << endl;

? ? ? ? }

? ? ? ? void Disp()

? ? ? ? {

? ? ? ? ? ? ? ? cout << "man disp ... ..." << endl;

? ? ? ? }

};


int main()

{

? ? ? ? human* p = new human;

? ? ? ? p->Disp();

? ? ? ? delete p;

? ? ? ? return 0;

}

復(fù)制代碼

【標(biāo)準(zhǔn)答案】?

human disp ... ...?

human over ......

72、下面的函數(shù)實(shí)現(xiàn)在一個固定的數(shù)上加上一個數(shù)嫉晶,有什么錯誤骑疆,改正:


int add_n(int n)

{? ??

? ? static int i = 100;

? ???i += n;

? ? return i;

}

復(fù)制代碼

【標(biāo)準(zhǔn)答案】?

因?yàn)閟tatic使得i的值會保留上次的值。以后的i會一直更新替废,使得第二次調(diào)用出現(xiàn)錯誤箍铭, 去掉static就可了

73、寫出打印結(jié)果

unsigned short array[]={1,2,3,4,5,6,7};

int i = 3;? ?

*(array + i) =??椎镣?

【標(biāo)準(zhǔn)答案】4

74诈火、寫一個函數(shù)計(jì)算當(dāng)參數(shù)為n(n很大)時(shí)的值 1-2+3-4+5-6+7......+n。

【參考答案】


long fn(long n)

{? ???

if(n <= 0)

{? ?? ?? ??

? ? printf("error: n must > 0);? ?? ???

? ? exit(1);? ?? ?

}


if(0 == n % 2)? ?? ???

? ? return (n / 2) * (-1);? ??

else? ?? ?? ??

? ? return (n / 2) * (-1) + n;

復(fù)制代碼

75状答、字符指針冷守、浮點(diǎn)數(shù)指針、以及函數(shù)指針這三種類型的變量哪個占用的內(nèi)存最大惊科?為什么拍摇?

【參考答案】

指針變量也占用內(nèi)存單元,而且所有指針變量占用內(nèi)存單元的數(shù)量都是相同的馆截。

就是說充活,不管是指向何種對象的指針變量,它們占用內(nèi)存的字節(jié)數(shù)都是一樣的蜡娶,并且要足夠把程序中所能用到的最大地址表示出來(通常是一個機(jī)器字長)混卵。

76、以下三條輸出語句分別輸出什么窖张?


char str1[]? ?? ? = "abc";??

char str2[]? ?? ? = "abc";??

const char str3[] = "abc";? ?

const char str4[] = "abc";? ?

const char* str5??= "abc";??

const char* str6??= "abc";??

cout << boolalpha << ( str1==str2 ) << endl; // 輸出什么幕随???

cout << boolalpha << ( str3==str4 ) << endl; // 輸出什么???

cout << boolalpha << ( str5==str6 ) << endl; // 輸出什么宿接???

復(fù)制代碼

【參考答案】

分別輸出 false,false,true合陵。

str1和str2都是字符數(shù)組枢赔,每個都有其自己的存儲區(qū),它們的值則是各存儲區(qū)首地址拥知,不等踏拜;

str3和str4同上,只是按const語義低剔,它們所指向的數(shù)據(jù)區(qū)不能修改速梗。

str5和str6并非數(shù)組而是字符指針,并不分配存儲區(qū)襟齿,其后的“abc”以常量形式存于靜態(tài)數(shù)據(jù)區(qū)姻锁,而它們自己僅是指向該區(qū)首地址的指針,相等猜欺。

77位隶、以下代碼有什么問題?? ???? ?


cout << (true?1:"1") << endl;

復(fù)制代碼

【參考答案】

三元表達(dá)式“开皿?:”問號后面的兩個操作數(shù)必須為同一類型涧黄。

78、以下代碼能夠編譯通過嗎赋荆,為什么笋妥?


unsigned int const size1 = 2;??

char str1[ size1 ];??

unsigned int temp = 0;??

cin >> temp;??

unsigned int const size2 = temp;??

char str2[ size2 ];

復(fù)制代碼

【標(biāo)準(zhǔn)答案】

str2定義出錯,size2非編譯器期間常量窄潭,而數(shù)組定義要求長度必須為編譯期常量春宣。

79、以下代碼中的輸出語句輸出0嗎嫉你,為什么月帝?


struct CLS??

{??

? ?? ?int m_i;??

? ?? ?CLS( int i ) : m_i(i) {}??

? ?? ?CLS()??

? ?? ?{??

? ?? ?? ? CLS(0);??

? ?? ?}??

};??

CLS obj;??

cout << obj.m_i << endl;

復(fù)制代碼

【標(biāo)準(zhǔn)答案】

不能。在默認(rèn)構(gòu)造函數(shù)內(nèi)部再調(diào)用帶參的構(gòu)造函數(shù)屬用戶行為而非編譯器行為幽污,亦即僅執(zhí)行函數(shù)調(diào)用嚷辅,而不會執(zhí)行其后的初始化表達(dá)式。

只有在生成對象時(shí)油挥,初始化表達(dá)式才會隨相應(yīng)的構(gòu)造函數(shù)一起調(diào)用。

80款熬、How do you code an infinite loop in Cplus plus ?

【參考答案】

while(1){} or for(;1;)

81深寥、What are the values of a, b, and c after the following instructions:?


int a=5, b=7, c;

c = a+++b;

復(fù)制代碼

【標(biāo)準(zhǔn)答案】a=6,b=7,c=12

82、在排序方法中贤牛,關(guān)鍵碼比較次數(shù)與記錄地初始排列無關(guān)的是()

A. Shell排序? ?? ?

B. 歸并排序

C. 直接插入排序? ???

D. 選擇排序?

【標(biāo)準(zhǔn)答案】D

83惋鹅、代碼:

void func()??{? ??

? ? static int val;

}

中,變量 val 的內(nèi)存地址位于:?

A. 已初始化數(shù)據(jù)段

B.未初始化數(shù)據(jù)段? ???

C.堆

D.棧?

【標(biāo)準(zhǔn)答案】A

84殉簸、一個棧的入棧序列是 A闰集,B沽讹,C,D武鲁,E爽雄,則棧的不可能的輸出序列是?

A沐鼠、EDCBA挚瘟;

B、DECBA饲梭;? ??

C乘盖、DCEAB;

D憔涉、ABCDE?

【標(biāo)準(zhǔn)答案】C

85订框、寫出判斷ABCD四個表達(dá)式的是否正確, 若正確, 寫出經(jīng)過表達(dá)式中 a 的值。



int a = 4;??

(A)兜叨、a += (a++);

(B)穿扳、a += (++a) ;??

(C)、(a++) += a;

(D)浪腐、(++a) += (a++);??

a = ?

復(fù)制代碼

【參考答案】

C錯誤纵揍,左側(cè)不是一個有效變量,不能賦值议街,可改為 (++a) += a; 改后答案依次為 9,10,10,11

86泽谨、請你談?wù)勀闶侨绾问褂?return 語句的。

【參考答案】

(1)return 語句不可返回指向“棧內(nèi)存”的“指針”或者“引用” 特漩,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)被自動銷毀吧雹。

(2)要搞清楚返回的究竟是“值”、“指針”還是“引用” 涂身。

(3)如果函數(shù)返回值是一個對象雄卷,要考慮 return 語句的效率。

87蛤售、① return String(s1 + s2); 和 ②String temp(s1 + s2); return temp; 一樣嗎丁鹉?

【參考答案】?

①這是臨時(shí)對象的語法,表示“創(chuàng)建一個臨時(shí)對象并返回它” 悴能。

②將發(fā)生三件事揣钦。首先,temp 對象被創(chuàng)建漠酿,同時(shí)完成初始化冯凹;然后拷貝構(gòu)造函數(shù)把 temp 拷貝到保存返回值的外部存儲單元中;

最后炒嘲,temp 在函數(shù)結(jié)束時(shí)被銷毀(調(diào)用析構(gòu)函數(shù)) 宇姚。然而“創(chuàng)建一個臨時(shí)對象并返回它”的過程是不同的匈庭,

編譯器直接把臨時(shí)對象創(chuàng)建并初始化在外部存儲單元中,省去了拷貝和析構(gòu)的化費(fèi)浑劳,提高了效率阱持。

88、下列程序的運(yùn)行結(jié)果是呀洲?


#include <iostream>? ??

const char *str = "vermeer";? ??

int main()? ?

{? ?

? ? const char *pstr = str;? ?

? ? cout << "The address of pstr is: " << pstr << endl;? ?

}

復(fù)制代碼

【標(biāo)準(zhǔn)答案】

The address of pstr is: vermeer

89紊选、下列程序輸出結(jié)果是?



inline void max_out( int val1, int val2 )

{??

? ? cout << ( val1 > val2 ) ? val1 : val2;

}


int main()

{

? ? int ix = 10, jx = 20;

? ? cout << "The larger of " << ix;

? ? cout << ", " << jx << " is ";

? ? max_out( ix, jx );

? ? cout << endl;

}

復(fù)制代碼

【標(biāo)準(zhǔn)答案】

The larger of 10, 20 is 0 道逗,

為什么不是20呢兵罢?問題在于輸出操作符的優(yōu)先級高于條件操作符 所以輸出 val1 和 val2 比較結(jié)果的 true/false

90、int max( int *ia, int sz );?

int max( int *, int = 10 );?

算函數(shù)重載滓窍?還是重復(fù)聲明卖词?

【標(biāo)準(zhǔn)答案】

如果在兩個函數(shù)的參數(shù)表中只有缺省實(shí)參不同則第二個聲明被視為第一個的重復(fù)聲明 。

第六部分:編程練習(xí)(比C要難)(91-100)

91吏夯、請編寫一個 C++函數(shù)此蜈,該函數(shù)給出一個字節(jié)中被置 1 的位的個數(shù)。

【參考答案】


unsigned int TestAsOne0(char log)

{

? ? ? ? int i;

? ? ? ? unsigned int num = 0, val;

? ? ? ? for (i = 0; i < 8; i++)

? ? ? ? {

? ? ? ? ? ? ? ? val = log >> i;? ???//移位? ?? ?? ?? ?? ?? ???

? ? ? ? ? ? ? ? val &= 0x01;? ???//與1相與? ?? ?? ?? ?? ?? ???

? ? ? ? ? ? ? ? if (val)

? ? ? ? ? ? ? ? ? ? ? ? num++;

? ? ? ? }


? ? ? ? return num;

}

復(fù)制代碼

92噪生、編寫一個函數(shù)裆赵,函數(shù)接收一個字符串,是由十六進(jìn)制數(shù)組成的一組字符串,函數(shù)的功能是把接到的這組字符串轉(zhuǎn)換成十進(jìn)制數(shù)字.并將十進(jìn)制數(shù)字返回。

【參考答案】


BOOL HexToDec(LPCTSTR shex, int& idec)

{

? ? ? ? int i, mid;

? ? ? ? int len = lstrlen(shex);

? ? ? ? if (len > 8)

? ? ? ? ? ? ? ? return FALSE;


? ? ? ? mid = 0;

? ? ? ? idec = 0;

? ? ? ? for (i = 0; i < len; i++)

? ? ? ? {

? ? ? ? ? ? ? ? if (shex[i] >= '0'&&shex[i] <= '9')

? ? ? ? ? ? ? ? ? ? ? ? mid = shex[i] - '0';

? ? ? ? ? ? ? ? else? ?if (shex[i] >= 'a'&&shex[i] <= 'f')

? ? ? ? ? ? ? ? ? ? ? ? mid = shex[i] - 'a' + 10;

? ? ? ? ? ? ? ? else? ?if (shex[i] >= 'A'&&shex[i] <= 'F')

? ? ? ? ? ? ? ? ? ? ? ? mid = shex[i] - 'A' + 10;

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? return? ?FALSE;

? ? ? ? ? ? ? ? mid <<= ((len - i - 1) << 2);? ?// 移位表示變?yōu)?的n次方倍??

? ? ? ? ? ? ? ? idec = idc + mid;

? ? ? ? }


? ? ? ? return TRUE;

}

復(fù)制代碼

93跺嗽、輸入一個字符串战授,將其逆序后輸出 。

【參考答案】


void main()

{

? ? ? ? char a[50];

? ? ? ? memset(a, 0, sizeof(a));

? ? ? ? int i = 0, j;

? ? ? ? char t;

? ? ? ? cin.getline(a, 50, '\n');

? ? ? ? for (i = 0, j = strlen(a) - 1; i < strlen(a) / 2; i++, j--)

? ? ? ? {

? ? ? ? ? ? ? ? t = a[i];

? ? ? ? ? ? ? ? a[i] = a[j];

? ? ? ? ? ? ? ? a[j] = t;

? ? ? ? }


? ? ? ? cout << a << endl;

}

復(fù)制代碼

94桨嫁、編寫一個算法frequency植兰,統(tǒng)計(jì)在一個輸入字符串中各個不同字符出現(xiàn)的頻度。用適當(dāng)?shù)臏y試數(shù)據(jù)來驗(yàn)證這個算法璃吧。

【參考答案】


void frequency(String& s, char& A[], int& C[], int &k)

{

? ? ? ? int i, j, len = s.length();

? ? ? ? if (!len) { cout << "The string is empty. " << endl;??k = 0;??return; }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? ? ? A[0] = s[0];??C[0] = 1;??k = 1;? ???/*語句s[i]是串的重載操作*/

? ? ? ? ? ? ? ? for (i = 1; i < len; i++) C[i] = 0;? ?? ?? ?? ?/*初始化*/

? ? ? ? ? ? ? ? for (i = 1; i < len; i++)

? ? ? ? ? ? ? ? {? ?? ?? ???/*檢測串中所有字符*/

? ? ? ? ? ? ? ? ? ? ? ? j = 0;? ?while (j < k && A[j] != s[i]) j++; /*檢查s[i]是否已在A[ ]中*/

? ? ? ? ? ? ? ? ? ? ? ? if (j == k)

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A[k] = s[i]; C[k]++; k++

? ? ? ? ? ? ? ? ? ? ? ? }? ?? ???/*s[i]從未檢測過*/

? ? ? ? ? ? ? ? ? ? ? ? else C[j]++;? ?? ?? ?? ?/*s[i]已經(jīng)檢測過*/

? ? ? ? ? ? ? ? }

? ? ? ? }

}

復(fù)制代碼

95楣导、假設(shè)以數(shù)組Q[m]存放循環(huán)隊(duì)列中的元素, 同時(shí)以rear和length分別指示環(huán)形隊(duì)列中的隊(duì)尾位置和隊(duì)列中所含元素的個數(shù)。試給出該循環(huán)隊(duì)列的隊(duì)空條件和隊(duì)滿條件, 并寫出相應(yīng)的插入(enqueue)和刪除(dlqueue)元素的操作畜挨。

【參考答案】循環(huán)隊(duì)列類定義


#include <assert.h>??

template <class Type> class Queue {? ?//循環(huán)隊(duì)列的類定義??

public:? ?

? ? Queue ( int=10 );??

? ? ~Queue ( ) { delete [ ] elements; }??

? ? void EnQueue ( Type & item );??

? ? Type DeQueue ( );??

? ? Type GetFront ( );??

? ? void MakeEmpty ( ) { length = 0; }? ?? ?//置空隊(duì)列??

? ? int IsEmpty ( ) const { return length == 0; }? ?//判隊(duì)列空否??

? ? int IsFull ( ) const { return length == maxSize; }??//判隊(duì)列滿否??

private:? ?? ?

? ? int rear, length;? ?? ?? ?? ?? ?//隊(duì)尾指針和隊(duì)列長度??

? ? Type *elements;? ?? ?? ?? ? //存放隊(duì)列元素的數(shù)組??

? ? int maxSize;? ?? ?? ?? ?? ? //隊(duì)列最大可容納元素個數(shù)??

}筒繁;

復(fù)制代碼


template <class Type>

Queue<Type>::Queue(int sz) : rear(maxSize - 1), length(0), maxSize(sz)

{

? ? ? ? //建立一個最大具有maxSize個元素的空隊(duì)列。

? ? ? ? elements = new Type[maxSize];//創(chuàng)建隊(duì)列空間

? ? ? ? assert(elements != 0);//斷言: 動態(tài)存儲分配成功與否

}


template<class Type>

void Queue<Type>::EnQueue(Type &item)

{

? ? ? ? assert(!IsFull());//判隊(duì)列是否不滿巴元,滿則出錯處理

? ? ? ? length++;//長度加1

? ? ? ? rear = (rear + 1) % maxSize;//隊(duì)尾位置進(jìn)1

? ? ? ? elements[rear] = item;//進(jìn)隊(duì)列

}


template<class Type>

Type Queue<Type> ::DeQueue()

{

? ? ? ? assert(!IsEmpty());//判斷隊(duì)列是否不空毡咏,空則出錯處理

? ? ? ? length--;//隊(duì)列長度減1

? ? ? ? return elements[(rear - length + maxSize) % maxSize];//返回原隊(duì)頭元素值

}


template<class Type>

Type Queue<Type> ::GetFront()

{

? ? ? ? assert(!IsEmpty());

? ? ? ? return elements[(rear - length + 1 + maxSize) % maxSize];//返回隊(duì)頭元素值

}

復(fù)制代碼

96、已知A[n]為整數(shù)數(shù)組务冕,試寫出實(shí)現(xiàn)下列運(yùn)算的遞歸算法:

(1) 求數(shù)組A中的最大整數(shù)血当。

(2) 求n個整數(shù)的和幻赚。

(3) 求n個整數(shù)的平均值禀忆。

【參考答案】


#include <iostream.h>? ?

class RecurveArray? ?

{? ?? ?? ?? ?? ?? ? //數(shù)組類聲明? ?

private:? ? int *Elements;? ?? ?//數(shù)組指針? ??

? ?? ???int ArraySize;? ?? ?//數(shù)組尺寸??

? ?? ???int CurrentSize;? ?? ???//當(dāng)前已有數(shù)組元素個數(shù)? ?

public :??

? ?? ???RecurveArray ( int MaxSize =10 ) :??

? ?? ???ArraySize ( MaxSize ), Elements ( new int[MaxSize] ){ }? ?

? ?? ???~RecurveArray ( ) { delete [ ] Elements; }? ?

? ?? ???void InputArray();? ?? ?//輸入數(shù)組的內(nèi)容? ?

? ?? ???int MaxKey ( int n );? ?? ? //求最大值? ?

? ?? ???int Sum ( int n );? ?? ?//求數(shù)組元素之和??

? ?? ???float Average ( int n );? ? //求數(shù)組元素的平均值??

};??



void RecurveArray :: InputArray ( )??

{? ?? ?? ?? ?? ?? ? //輸入數(shù)組的內(nèi)容??

? ?? ???cout << "Input the number of Array: \n";??

? ?? ???for ( int i = 0; i < ArraySize; i++ ) cin >> Elements[i];??

}??


int RecurveArray :: MaxKey ( int n )? ?

{? ?? ?? ???//遞歸求最大值??

? ?? ???if ( n == 1 ) return Elements[0];??

? ?? ???int temp = MaxKey ( n - 1 );??

? ?? ???if ( Elements[n-1] > temp ) return Elements[n-1];??

? ?? ???else return temp;??

}??

int RecurveArray :: Sum ( int n ) {? ?? ?? ?//遞歸求數(shù)組之和??

? ?? ???if ( n == 1) return Elements[0];??

? ?? ???else return Elements[n-1] + Sum (n-1);??

}??

float RecurveArray :: Average ( int n ) {? ?? ?? ???//遞歸求數(shù)組的平均值??

? ?? ???if ( n == 1) return (float) Elements[0];??

? ?? ???else return ( (float) Elements[n-1] + ( n - 1) * Average ( n - 1 ) ) / n;??

}??

int main ( int argc,??char* argv [ ] ) {? ?? ?

? ?? ?? ?? ?int size = -1;??

? ?? ?? ?? ?cout << "No. of the Elements : ";??

? ?? ?? ?? ?while ( size < 1 ) cin >> size;??

? ?? ?? ?? ?RecurveArray ra ( size );??

? ?? ?? ?? ?ra.InputArray();? ?? ?

? ?? ?? ?? ?cout<< "\nThe max is:??" << ra.MaxKey ( ra.MaxSize ) << endl;??

? ?? ?? ?? ?cout<< "\nThe sum is:??" << ra.Sum ( ra.MaxSize ) << endl;??

? ?? ?? ?? ?cout<< "\nthe avr is:??" << ra.Average ( ra.MaxSize ) << endl;??

? ?? ?? ?? ?return 0;??

}

復(fù)制代碼

97臊旭、已知f為單鏈表的表頭指針, 鏈表中存儲的都是整型數(shù)據(jù),試寫出實(shí)現(xiàn)下列運(yùn)算的遞歸算法:?

(1) 求鏈表中的最大整數(shù)箩退。

(2) 求鏈表的結(jié)點(diǎn)個數(shù)离熏。

(3) 求所有整數(shù)的平均值。

【標(biāo)準(zhǔn)答案】


#include <iostream.h>? ???//定義在頭文件"RecurveList.h"中??

class List;? ?? ??

class ListNode {? ?? ?? ?? ?? ?? ???//鏈表結(jié)點(diǎn)類??

friend class List;??

private:??

? ?? ???int data;? ?? ?? ???//結(jié)點(diǎn)數(shù)據(jù)??

? ?? ???ListNode *link;? ???//結(jié)點(diǎn)指針??

? ?? ???ListNode ( const int item ) : data(item), link(NULL) { }? ? //構(gòu)造函數(shù)??

};??

class List {? ?? ?? ?? ?//鏈表類??

private:??

? ?? ???ListNode *first, current;??

? ?? ???int Max ( ListNode *f );??

? ?? ???int Num ( ListNode *f );??

? ?? ???float Avg ( ListNode *f,??int& n );??

public:??

? ?? ???List ( ) : first(NULL), current (NULL) { }? ?? ?//構(gòu)造函數(shù)??

? ?? ???~List ( ){ }? ?? ?? ?? ?? ?? ???//析構(gòu)函數(shù)??

? ?? ???ListNode* NewNode ( const int item );? ?//創(chuàng)建鏈表結(jié)點(diǎn), 其值為item??

? ?? ???void NewList ( const int retvalue );? ? //建立鏈表, 以輸入retvalue結(jié)束??

? ?? ???void PrintList ( );? ?? ?? ?//輸出鏈表所有結(jié)點(diǎn)數(shù)據(jù)??

? ?? ???int GetMax ( ) { return Max ( first ); }? ?? ???//求鏈表所有數(shù)據(jù)的最大值??

? ?? ???int GetNum ( ) { return Num ( first ); }? ?? ???//求鏈表中數(shù)據(jù)個數(shù)??

? ?? ???float GetAvg ( ) { return Avg ( first ); }? ?? ?//求鏈表所有數(shù)據(jù)的平均值??

};? ??


ListNode* List :: NewNode ( const int item ) {? ?? ?? ? //創(chuàng)建新鏈表結(jié)點(diǎn)??

? ?? ???ListNode *newnode = new ListNode (item);??

? ?? ???return newnode;??

}??

void List :: NewList ( const int retvalue ) {? ?? ? //建立鏈表, 以輸入retvalue結(jié)束??

? ?? ???first = NULL;??int value;??ListNode *q;??

? ?? ???cout << "Input your data:\n";? ???//提示??

? ?? ???cin >> value;? ?? ?? ?//輸入??

? ?? ???while ( value != retvalue )? ?

{? ?? ?? ???//輸入有效??

? ?? ?? ?? ?q = NewNode ( value );??//建立包含value的新結(jié)點(diǎn)??

? ?? ?? ?? ?if ( first == NULL ) first = current = q;//空表時(shí), 新結(jié)點(diǎn)成為鏈表第一個結(jié)點(diǎn)??

? ?? ?? ?? ?else { current->link = q;??current = q; }? ? //非空表時(shí), 新結(jié)點(diǎn)鏈入鏈尾??

? ?? ?? ?? ?cin >> value;? ?? ?? ?//再輸入??

? ?? ???}??

? ?? ???current->link = NULL;? ?? ?? ?? ?//鏈尾封閉??

}??

void List :: PrintList ( )? ?

{? ?? ?? ?? ?? ?? ?? ?? ?? ?//輸出鏈表??

? ?? ???cout << "\nThe List is : \n";??

? ?? ???ListNode *p = first;??

? ?? ???while ( p != NULL ) {? ?cout << p->data << '??';??p = p->link;? ? }??

? ?? ???cout << ‘\n’;? ?

}??


? ? int List :: Max ( ListNode *f )? ?

? ? {? ?? ?? ?? ?? ?//遞歸算法 : 求鏈表中的最大值??

? ?? ???if ( f ->link == NULL ) return f ->data;??//遞歸結(jié)束條件??

? ?? ???int temp = Max ( f ->link );? ???//在當(dāng)前結(jié)點(diǎn)的后繼鏈表中求最大值??

? ?? ???if ( f ->data > temp )? ?

? ?? ?? ?? ?return f ->data; //如果當(dāng)前結(jié)點(diǎn)的值還要大, 返回當(dāng)前檢點(diǎn)值??

? ?? ???else return temp;? ?? ? //否則返回后繼鏈表中的最大值??

? ? }??

? ? int List :: Num ( ListNode *f )? ?

? ? {? ?? ?? ?? ?? ?//遞歸算法 : 求鏈表中結(jié)點(diǎn)個數(shù)??

? ?? ???if ( f == NULL ) return 0;??//空表, 返回0??

? ?? ???return 1+ Num ( f ->link );? ?? ?//否則, 返回后繼鏈表結(jié)點(diǎn)個數(shù)加1??

? ? }??

? ? float List :: Avg ( ListNode *f , int& n )? ?

? ? {? ?? ?? ?? ?? ?//遞歸算法 : 求鏈表中所有元素的平均值??

? ?? ???if ( f ->link == NULL )? ?? ?//鏈表中只有一個結(jié)點(diǎn), 遞歸結(jié)束條件??

? ?? ???{? ?

? ?? ?? ?? ?n = 1;??return ( float ) (f ->data );? ?

? ?? ???}??

? ?? ???else? ?

? ?? ???{ float Sum = Avg ( f ->link, n ) * n;??n++;??return ( f ->data + Sum ) / n; }??

? ? }??


#include "RecurveList.h"? ?? ?? ?? ?//定義在主文件中??

int main ( int argc, char* argv[ ] )? ?

{??

? ?? ???List test;? ?int finished;??

? ?? ???cout << “輸入建表結(jié)束標(biāo)志數(shù)據(jù) :”;??

? ?? ???cin >> finished;? ?? ?? ? //輸入建表結(jié)束標(biāo)志數(shù)據(jù)? ?

? ?? ???test.NewList ( finished );? ?? ?//建立鏈表??

? ?? ???test.PrintList ( );? ?? ?? ?//打印鏈表??

? ?? ???cout << "\nThe Max is : " << test.GetMax ( );??

? ?? ???cout << "\nThe Num is : " << test.GetNum ( );??

? ?? ???cout << "\nThe Ave is : " << test.GetAve () << '\n';??

? ?? ???printf ( "Hello World!\n" );??

? ?? ???return 0;??

}

復(fù)制代碼

98戴涝、字符串的替換操作 replace(String &s, String &t, String &v) 是指:

若t是s的子串滋戳,則用串v替換串t在串s中的所有出現(xiàn);若t不是s的子串啥刻,則串s不變奸鸯。例如,若串s為“aabbabcbaabaaacbab”可帽,串t為“bab”娄涩,串v為“abdc”,則執(zhí)行replace操作后映跟,串s中的結(jié)果為“aababdccbaabaaacabdc”蓄拣。試?yán)米址幕具\(yùn)算實(shí)現(xiàn)這個替換操作。

【參考答案】


String & String::Replace(String & t, String &v)

{

? ? ? ? if ((int id = Find(t)) == -1)? ? //沒有找到努隙,當(dāng)前字符串不改球恤,返回??

? ? ? ? {

? ? ? ? ? ? ? ? cout << “The(replace) operation failed.” << endl;??return *this;

? ? ? ? }

? ? ? ? String temp(ch);//用當(dāng)前串建立一個空的臨時(shí)字符串? ???

? ? ? ? ch[0] = '\0';??curLen = 0;??//當(dāng)前串作為結(jié)果串,初始為空??

? ? ? ? int j, k = 0, l;? ?? ???//存放結(jié)果串的指針? ?? ?? ?? ??

? ? ? ? while (id != -1)

? ? ? ? {

? ? ? ? ? ? ? ? for (j = 0; j < id; j++) ch[k++] = temp.ch[j];

? ? ? ? ? ? ? ? curLen += id + v.curLen;? ?? ? //修改結(jié)果串連接后的長度??

? ? ? ? ? ? ? ? if (curLen <= maxLen) l = v.curLen; //確定替換串v傳送字符數(shù)l??

? ? ? ? ? ? ? ? else { l = curLen - maxLen;??curLen = maxLen; }

? ? ? ? ? ? ? ? for (j = 0; j < l; j++) ch[k++] = v.ch[j];

? ? ? ? ? ? ? ? //連接替換串v到結(jié)果串ch后面??

? ? ? ? ? ? ? ? if (curLen == maxLen) break; //字符串超出范圍??

? ? ? ? ? ? ? ? for (j = id + t.curLen; j < temp.curLen; j++)

? ? ? ? ? ? ? ? ? ? ? ? temp.ch[j - id - t.curLen] = temp.ch[j]; //刪改原來的字符串? ?? ?temp.curLen -= ( id + t.curLen );??

? ? ? ? ? ? ? ? id = temp.Find(t);

? ? ? ? }

? ? ? ? return *this;

}

復(fù)制代碼

99荸镊、試編寫一個求解Josephus問題的函數(shù)咽斧。用整數(shù)序列1, 2, 3, ……, n表示順序圍坐在圓桌周圍的人,并采用數(shù)組表示作為求解過程中使用的數(shù)據(jù)結(jié)構(gòu)贷洲。然后使用n = 9, s = 1, m = 5收厨,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作為輸入數(shù)據(jù)优构,檢查你的程序的正確性和健壯性诵叁。

【參考答案】


void Josephus(int A[], int n, int s, int m)

{

? ? ? ? int i, j, k, tmp;

? ? ? ? if (m == 0)

? ? ? ? {

? ? ? ? ? ? ? ? cout << "m = 0是無效的參數(shù)!" << endl;

? ? ? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? for (i = 0; i < n; i++)

? ? ? ? ? ? ? ? A[i] = i + 1;? ?? ?/*初始化钦椭,執(zhí)行n次*/

? ? ? ? i = s - 1;? ?? ?? ?? ???/*報(bào)名起始位置*/

? ? ? ? for (k = n; k > 1; i--)

? ? ? ? {? ?? ?? ? /*逐個出局拧额,執(zhí)行n-1次*/

? ? ? ? ? ? ? ? if (i == k)

? ? ? ? ? ? ? ? ? ? ? ? i = 0;

? ? ? ? ? ? ? ? i = (i + m - 1) % k;? ?? ?/*尋找出局位置*/

? ? ? ? ? ? ? ? if (i != k - 1)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? tmp = A[i];? ???/*出局者交換到第k-1位置*/

? ? ? ? ? ? ? ? ? ? ? ? for (j = i; j < k - 1; j++)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A[j] = A[j + 1];

? ? ? ? ? ? ? ? ? ? ? ? A[k - 1] = tmp;

? ? ? ? ? ? ? ? }

? ? ? ? }


? ? ? ? for (k = 0; k < n / 2; k++)

? ? ? ? {? ?? ?/*全部逆置, 得到出局序列*/

? ? ? ? ? ? ? ? tmp = A[k]; A[k] = A[n - k + 1]; A[n - k + 1] = tmp;

? ? ? ? }

}

復(fù)制代碼

100、編寫類 String 的構(gòu)造函數(shù)彪腔、析構(gòu)函數(shù)和賦值函數(shù)已知類 String 的原型為:


class String

{

public:

? ? ? ? String(const char *str = NULL); // 普通構(gòu)造函數(shù)? ?

? ? ? ? String(const String &other);? ???// 拷貝構(gòu)造函數(shù)? ?

? ? ? ? ~String(void);? ?? ?? ?// 析構(gòu)函數(shù)? ?

? ? ? ? String & operate = (const String &other); // 賦值函數(shù)? ?

private:

? ? ? ? char? ?*m_data;? ? // 用于保存字符串? ?

};

復(fù)制代碼

請編寫 String 的上述 4 個函數(shù)侥锦。

【標(biāo)準(zhǔn)答案】


// String 的析構(gòu)函數(shù)? ?

String::~String(void)

{

? ? ? ? delete[] m_data;

? ? ? ? // 由于 m_data 是內(nèi)部數(shù)據(jù)類型,也可以寫成 delete m_data;??

}


// String 的普通構(gòu)造函數(shù)? ?? ?? ?? ?? ??

String::String(const char *str)

{

? ? ? ? if (str == NULL)

? ? ? ? {

? ? ? ? ? ? ? ? m_data = new char[1];? ? // 若能加 NULL 判斷則更好? ?

? ? ? ? ? ? ? ? *m_data = ‘\0’;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? ? ? int length = strlen(str);

? ? ? ? ? ? ? ? m_data = new char[length + 1];

? ? ? ? ? ? ? ? strcpy(m_data, str);

? ? ? ? }

}


// 拷貝構(gòu)造函數(shù)? ?

String::String(const String &other)

{

? ? ? ? int length = strlen(other.m_data);

? ? ? ? m_data = new char[length + 1];? ?? ?// 若能加 NULL 判斷則更好? ???

? ? ? ? strcpy(m_data, other.m_data);

}


// 賦值函數(shù)? ?

String & String::operate = (const String &other)

{

? ? ? ? if (this == &other)

? ? ? ? ? ? ? ? return *this;

? ? ? ? delete[] m_data;

? ? ? ? int length = strlen(other.m_data);

? ? ? ? m_data = new char[length + 1];

? ? ? ? strcpy(m_data, other.m_data);

? ? ? ? return *this;

}

重要的事說三遍~~~~

交流728483370德挣,一起學(xué)習(xí)加油恭垦!

交流728483370,一起學(xué)習(xí)加油!

交流728483370番挺,一起學(xué)習(xí)加油唠帝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玄柏,隨后出現(xiàn)的幾起案子襟衰,更是在濱河造成了極大的恐慌,老刑警劉巖粪摘,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瀑晒,死亡現(xiàn)場離奇詭異,居然都是意外死亡徘意,警方通過查閱死者的電腦和手機(jī)苔悦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椎咧,“玉大人间坐,你說我怎么就攤上這事∫赝耍” “怎么了竹宋?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長地技。 經(jīng)常有香客問我蜈七,道長,這世上最難降的妖魔是什么莫矗? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任飒硅,我火速辦了婚禮,結(jié)果婚禮上作谚,老公的妹妹穿的比我還像新娘三娩。我一直安慰自己,他們只是感情好妹懒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布雀监。 她就那樣靜靜地躺著,像睡著了一般眨唬。 火紅的嫁衣襯著肌膚如雪会前。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天匾竿,我揣著相機(jī)與錄音瓦宜,去河邊找鬼。 笑死岭妖,一個胖子當(dāng)著我的面吹牛临庇,可吹牛的內(nèi)容都是我干的反璃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼假夺,長吁一口氣:“原來是場噩夢啊……” “哼版扩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侄泽,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜻韭,沒想到半個月后悼尾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肖方,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年闺魏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俯画。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡析桥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艰垂,到底是詐尸還是另有隱情泡仗,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布猜憎,位于F島的核電站娩怎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胰柑。R本人自食惡果不足惜截亦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柬讨。 院中可真熱鬧崩瓤,春花似錦暂吉、人聲如沸匾灶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔗牡。三九已至肾扰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛋逾,已是汗流浹背集晚。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留区匣,地道東北人偷拔。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓蒋院,卻偏偏與公主長得像,于是被迫代替她去往敵國和親莲绰。 傳聞我的和親對象是個殘疾皇子欺旧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容