C++ one hundred 面試題

題目類(lèi)型

a.C++與C差異(1-18)

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

C沒(méi)有Protection行為,不能定義函數(shù),但可以有函數(shù)指針。

C++有Protection行為,默認(rèn)是public(class默認(rèn)private),可以定義函數(shù);

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

struct可以class所有功能,本質(zhì)上是一個(gè)東西,struct成員和繼承默認(rèn)是public,class成員和繼承默認(rèn)是private。

3.如何判斷一個(gè)程序是由c編譯程序還是由C++編譯程序編譯的?

判斷:檢測(cè)宏

#ifdef __cpluspluc

cout<<"c++";

#else

printf("c“);

#endif

4.C和C++有什么不同?

機(jī)制上:C面向過(guò)程的(但也可編寫(xiě)面向?qū)ο螅?;C++編寫(xiě)面向?qū)ο蟮某绦虮菴容易

適用的方向:c適合要求代碼體積小的,效率高的場(chǎng)合,如嵌入式;C++更適合上層的,復(fù)雜的

C語(yǔ)言是結(jié)構(gòu)化編程語(yǔ)言,C++是面向?qū)ο缶幊陶Z(yǔ)言。

C++側(cè)重于對(duì)象而不是過(guò)程,側(cè)重于類(lèi)的設(shè)計(jì)而不是邏輯的設(shè)計(jì)。

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

指針通過(guò)某個(gè)指針變量指向一個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。

6.虛函數(shù)

虛函數(shù)是可以通過(guò)接口繼承的

7.int id[sizeof(unsigned long)];這個(gè)對(duì)嗎?

對(duì)

8.某文件定義靜態(tài)全局變量,他的作用域。

靜態(tài)全局變量只在源文件內(nèi)有效,避免引用出錯(cuò)。類(lèi)里面的靜態(tài)變量可以不用實(shí)例化。C++沒(méi)有靜態(tài)類(lèi)。

9.C++值的傳遞

三種:值傳遞,指針傳遞,引用傳遞

10.頻繁使用的短小函數(shù),C語(yǔ)言和C++?

C用宏定義#define,C++用inline函數(shù)(一般函數(shù)浪費(fèi)的是調(diào)用和返回的時(shí)間)

11.引用和指針的差別?

引用須被初始化,指針不必。(C++11引用是可以改變的)

引用初始化不能被改變,但指針可以改變所指對(duì)象。

不存在指向空值的引用,但是存在指向空值的指針。

12.virtual與inline的含義分別是什么?

virtual意味著聲明為虛函數(shù),inline與函數(shù)定義體放在一起,使該函數(shù)稱(chēng)為內(nèi)聯(lián)。inline是一種用于實(shí)現(xiàn)的關(guān)鍵字,而不是用于聲明的關(guān)鍵字。

虛函數(shù)的特點(diǎn):如果希望派生類(lèi)能夠重新定義基類(lèi)的方法,則在基類(lèi)中將該方法定義為虛方法,這樣可以啟用動(dòng)態(tài)聯(lián)編。(多繼承下只產(chǎn)生一個(gè)虛基類(lèi))

動(dòng)態(tài)聯(lián)編 和 靜態(tài)聯(lián)編

http://blog.csdn.net/gaoxin1076/article/details/8298279

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

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

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

13.VC中,編譯工具Debug與Release選項(xiàng)是什么含義?

Debug通常稱(chēng)為調(diào)試版本,包含調(diào)試信息,不做優(yōu)化,便于程序員調(diào)試進(jìn)程。Release稱(chēng)為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化,使得程序在代碼大小和運(yùn)行速度上都是最優(yōu)的,以便用戶(hù)很好地使用。Debug帶有大量的挑調(diào)試代碼和信息,運(yùn)行需要相應(yīng)的庫(kù),發(fā)布模式程序緊湊不含有調(diào)試代碼和信息,可以直接運(yùn)行(不需要運(yùn)行庫(kù))。

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

斷言assert是僅在debug版本起作用的宏,用于檢查“不應(yīng)該”發(fā)生的情況。程序員可以把a(bǔ)ssert看成是一個(gè)任何系統(tǒng)狀態(tài)下都可以安全使用的無(wú)害測(cè)試手段。

15.const與#define的比較,const有什么優(yōu)點(diǎn)?

const常量有數(shù)據(jù)類(lèi)型(定義不讀內(nèi)存),而宏常量沒(méi)有數(shù)據(jù)類(lèi)型,編譯器可以對(duì)前者進(jìn)行類(lèi)型安全檢查。而對(duì)后者只進(jìn)行字符替換,沒(méi)有類(lèi)型安全檢查,并且在字符替換可能會(huì)產(chǎn)生意料不到的錯(cuò)誤(邊際效應(yīng))

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

16.談?wù)勔煤椭羔樀膮^(qū)別:

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

不能有NULL引用,左值引用必須與合法的存儲(chǔ)單元關(guān)聯(lián)(指針可以是NULL)內(nèi)存,右值引用引用寄存器。

一旦引用被初始化,就不能改變引用的關(guān)系(指針可以隨時(shí)改變所指的對(duì)象)

17.有了malloc/free為什么還要new/delete?

malloc/free是C/C++語(yǔ)言的標(biāo)準(zhǔn)函數(shù)庫(kù),new/delete是C++ 的運(yùn)算符,它們都可以申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存。

由于對(duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù),消亡之前要自動(dòng)執(zhí)行析構(gòu)函數(shù),因?yàn)閙alloc/free是庫(kù)函數(shù)而不是運(yùn)算符,不在編譯器的控制權(quán)之內(nèi),不能把任務(wù)強(qiáng)加于malloc/free。因此需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化的運(yùn)算符new,以及一個(gè)能清理和釋放內(nèi)存工作的運(yùn)算符delete。

new可以把內(nèi)存開(kāi)在靜態(tài)區(qū),防止內(nèi)存泄漏。

18.如果再申請(qǐng)動(dòng)態(tài)內(nèi)存找不到足夠大的內(nèi)存塊,malloc和new將返回NULL指針,宣告內(nèi)存申請(qǐng)失敗。你是怎么處理內(nèi)存耗盡的?

判斷指針是否為NULL,是則馬上return語(yǔ)句終止函數(shù)

判斷指針是否為NULL,是則馬上用exit(1)終止程序運(yùn)行

為new和malloc設(shè)置異常處理函數(shù)。 例如Visual C++可以用_set_new_hander函數(shù)為new設(shè)置用戶(hù)自己定義的異常處理函數(shù),也可以讓malloc享用與new 相同的異常處理函數(shù)。

#include big *p; p = new(std::nothrow) big[1000];

b.數(shù)據(jù)類(lèi)型、關(guān)鍵字(19-37)

19.C++是不是類(lèi)型安全的?

不是,兩個(gè)不同類(lèi)型的指針是可以強(qiáng)制轉(zhuǎn)換的(用reinterpret cast)

20.const符號(hào)常量(1)const char *p(2)char const *p(3)char * const p 區(qū)別

(1)p是一個(gè)指向const char 的指針,p是可以改變指向的,但是p指向的值時(shí)不能改變的。

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

(3)p是一個(gè)指針,這個(gè)指針是指向char的const指針,

(1)和(2)的定義是一樣的,*左邊值不能改變,*右邊指針不能改變

21.用C++寫(xiě)個(gè)程序,如何判斷一個(gè)操作系統(tǒng)是16位、32位?

定義一個(gè)指針,sizeof(p),4是32位,2是16位,如果64位系統(tǒng)兼容32位的話(huà)也是4字節(jié)

22.用C++寫(xiě)個(gè)程序,如何判斷一個(gè)操作系統(tǒng)是16位、32位?不用sizeof()函數(shù)

int a = ~0;

if(a>65535){ cout<<"32"bit<

else{ cout<<"16"bit<

23.void *(*(*fp1)(int))[10]; float(*(* fp2)(int,int,int))(int); int(*(*fp3)())[10]();

(1)void *(*(*fp1)(int))[10]; fp1是一個(gè)指針,指向一個(gè)函數(shù),這個(gè)函數(shù)的參數(shù)為int型,函數(shù)的返回值是一個(gè)指針,這個(gè)指針指向一個(gè)數(shù)組,這個(gè)數(shù)組有10個(gè)元素,每個(gè)元素是一個(gè)void*型指針。

(2)float(*(* fp2)(int,int,int))(int); fp2是一個(gè)指針,指向一個(gè)函數(shù),這個(gè)函數(shù)的參數(shù)為3個(gè)int型,函數(shù)的返回值是一個(gè)指針,這個(gè)指針指向一個(gè)函數(shù),這個(gè)函數(shù)的參數(shù)為int型,函數(shù)的返回值是float型。

(3)int(*(*fp3)())[10]();fp3是一個(gè)指針,指向一個(gè)函數(shù),這個(gè)函數(shù)的參數(shù)為空,函數(shù)的返回值是一個(gè)指針,這個(gè)指針指向一個(gè)數(shù)組,這個(gè)數(shù)組有10個(gè)元素,每個(gè)元素是一個(gè)指針,指向一個(gè)函數(shù),這個(gè)參數(shù)為空,函數(shù)的返回值是int型。

24.多態(tài)類(lèi)中的虛函數(shù)表示Compile-Time,還是Run-Time時(shí)建立的?

虛擬函數(shù)表是在編譯期就建立了,各個(gè)虛擬函數(shù)這時(shí)被組織成了一個(gè)虛擬函數(shù)的入口地址的數(shù)組。而對(duì)象的隱藏成員--虛擬函數(shù)表指針是在運(yùn)行期--也就是構(gòu)造函數(shù)被調(diào)用時(shí)進(jìn)行初始化,這是實(shí)現(xiàn)多態(tài)的關(guān)鍵。(動(dòng)態(tài)聯(lián)編)

25.錯(cuò)誤的轉(zhuǎn)義字符'\091'八進(jìn)制不能有9

26。數(shù)組名做實(shí)參,指針變量做形參,傳數(shù)組名傳過(guò)去的是數(shù)組的第一個(gè)元素地址

27.變量的指針指的是變量的地址

28.內(nèi)存的分配方式有幾種?

在四個(gè)地方分配內(nèi)存1.靜態(tài)存儲(chǔ)區(qū)域。2.棧上創(chuàng)建。3.堆上動(dòng)態(tài)內(nèi)存分配。4.代碼區(qū)

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

b在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)部局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。

c在堆上分配,亦稱(chēng)動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc或new申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由我們決定,使用非常靈活,但問(wèn)題也多。

棧連續(xù),堆不連續(xù)(鏈表)

29.float a,b,c,問(wèn)等式(a+b)+c==(b+a)+c 和 (a+b)+c==(a+c)+b能否成立?

兩者都不行。在比較float或double時(shí),不能簡(jiǎn)單地比較。由于計(jì)算誤差,相等的概率很低。應(yīng)判斷兩數(shù)之差是否落在區(qū)間(-e,e)內(nèi)。這個(gè)e應(yīng)比浮點(diǎn)數(shù)的精度大一個(gè)數(shù)量級(jí)。

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

生命周期不同:全局變量隨主程序創(chuàng)建而創(chuàng)建,隨主程序的銷(xiāo)毀而銷(xiāo)毀;

局部變量在局部函數(shù)內(nèi),甚至局部循環(huán)體等內(nèi)部存在,退出就不存在;

內(nèi)存中分配在全局?jǐn)?shù)據(jù)區(qū)

使用方式不同:通過(guò)聲明后全局變量程序的各個(gè)部分都可以用到;

局部變量只能在局部使用;

分配在棧區(qū)。

操作系統(tǒng)和編譯器通過(guò)內(nèi)存分配的位置來(lái)知道的,

全局變量分配在全局?jǐn)?shù)據(jù)段并且在程序開(kāi)始運(yùn)行的時(shí)候被加載。

局部變量則分配在堆棧里面。

31.Heap與Stack 的差別

Heap是堆,Stack是棧(高效地節(jié)約內(nèi)存,用完就馬上釋放)。

Stack的空間由操作系統(tǒng)自動(dòng)分配/釋放,Heap上的空間手動(dòng)分配/釋放

Stack空間有限,Heap是很大的只有存儲(chǔ)區(qū)

C中的malloc函數(shù)分配的內(nèi)存空間即在堆上,C++中對(duì)應(yīng)的是new操作符

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

32.explict protected

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

protected控制的是一個(gè)函數(shù)對(duì)一個(gè)類(lèi)的成員(包括成員變量及成員方法)的訪(fǎng)問(wèn)權(quán)限。protected成員只有該類(lèi)的成員函數(shù)及其派生類(lèi)的成員可以訪(fǎng)問(wèn)。

33.重復(fù)多次fclose一個(gè)打開(kāi)過(guò)一次的FILE *fp指針會(huì)有什么后果,解釋

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

34.為什么數(shù)組名作為參數(shù),會(huì)改變數(shù)組的內(nèi)容,而其他類(lèi)型如int卻不會(huì)改變變量的值?

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

35.你覺(jué)得如果不使用常量,直接在程序中填寫(xiě)數(shù)字或字符串,將會(huì)有什么麻煩?

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

(2)在程序的很多地方輸入同樣的數(shù)字或字符串,難保不發(fā)生書(shū)寫(xiě)錯(cuò)誤。

(3)如果要修改數(shù)字或字符串,則會(huì)在很多地方改動(dòng),既麻煩又容易出錯(cuò)。

36.為什么需要使用堆,使用堆空間的原因?

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

37.const關(guān)鍵字?有哪些作用?

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

(2)對(duì)指針來(lái)說(shuō),可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const;

(3)在一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;(4)對(duì)于類(lèi)的成員函數(shù),若指定其為const類(lèi)型,則表明其實(shí)一個(gè)常函數(shù),不能修改類(lèi)的成員變量;

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

c.面型對(duì)象的特性(38-61)

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

virtual修飾符會(huì)被隱形繼承的。virtual可加不可加。子類(lèi)的空間里有父類(lèi)的所有變量(static除外)。同一個(gè)函數(shù)只存在一個(gè)實(shí)體(inline除外)。子類(lèi)覆蓋它的函數(shù)不加virtual,也能實(shí)現(xiàn)多態(tài)。在子類(lèi)的空間里,有父類(lèi)的私有變量。私有變量不能直接訪(fǎng)問(wèn)。

39.面向?qū)ο蟮娜齻€(gè)基本特征,并簡(jiǎn)單敘述?

(1)封裝:將客觀(guān)事物抽象成類(lèi),每個(gè)類(lèi)對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private,protected,public)

(2)繼承:廣義的繼承有三種形式:實(shí)現(xiàn)繼承(指使用基類(lèi)的屬性和方法而無(wú)需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀(guān)和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類(lèi)實(shí)現(xiàn))。

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

(3)多態(tài):是將父對(duì)象設(shè)置成為和一個(gè)或更多的與他的子對(duì)象的特性以不同的方式運(yùn)作。簡(jiǎn)單的說(shuō),就是一句話(huà):允許將子類(lèi)類(lèi)型的指針賦值給父類(lèi)類(lèi)型的指針。

40.重載(overload)、重寫(xiě)(override,有的叫覆蓋)、重定義(redefinition)的區(qū)別?

名稱(chēng)名字空間區(qū)別

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

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

重寫(xiě)/覆蓋不同名字空間用于繼承,子類(lèi)重新定義父類(lèi)虛函數(shù)的方法

41.多態(tài)的作用?

主要的是兩個(gè):

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

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

42.當(dāng)一個(gè)類(lèi)A中沒(méi)有聲明任何成員變量與成員函數(shù),這時(shí)sizeof(A)的值時(shí)多少?如果不是零,請(qǐng)解釋一下編譯器為什么沒(méi)有讓它為零?

sizeof(A)=1

一個(gè)空類(lèi)對(duì)象的大小是1byte。這是被編譯器安插進(jìn)去的一個(gè)字節(jié),這樣就使得這個(gè)空類(lèi)的兩個(gè)實(shí)例得以在內(nèi)存中配置獨(dú)一無(wú)二的地址。

43.如果ClassA中定義并實(shí)現(xiàn)虛函數(shù)int func(void),ClassB中也實(shí)現(xiàn)該函數(shù),那么上述變量a->func()將調(diào)用哪個(gè)類(lèi)里面的函數(shù)?如果int func(void)不是虛函數(shù),情況又如何?為什么?

第一問(wèn)是調(diào)用B的。第二問(wèn)是調(diào)用A的。虛函數(shù)的一個(gè)典型應(yīng)用,虛函數(shù)只能借助于指針或者引用來(lái)達(dá)到多態(tài)的效果

44.C++里面是不是所有的動(dòng)作都是main()函數(shù)引起的?如果不是請(qǐng)舉例

class A{};

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

int main(){}

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

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

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

析構(gòu)函數(shù)是特殊的類(lèi)成員函數(shù),它沒(méi)有返回類(lèi)型,沒(méi)有參數(shù),不能隨意調(diào)用,也沒(méi)有重載,只有在類(lèi)對(duì)象的生命期結(jié)束的時(shí)候,系統(tǒng)自動(dòng)調(diào)用。有釋放內(nèi)存空間的作用。(析構(gòu)函數(shù)可以是虛函數(shù),構(gòu)造函數(shù)不行)

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

47.“new" in C++ is a: operator

malloc是庫(kù)函數(shù),不在編譯器的控制范圍之內(nèi);

new是運(yùn)算符,從堆中申請(qǐng)內(nèi)存;調(diào)用new時(shí),從堆中申請(qǐng)內(nèi)存并為內(nèi)存調(diào)用構(gòu)造函數(shù)。

48. 對(duì)于C++中類(lèi)(class)與結(jié)構(gòu)(struct)的描述正確的為:

D 結(jié)構(gòu)和類(lèi)對(duì)象都可以用new創(chuàng)建

49.類(lèi)內(nèi)部成員函數(shù)可以用private函數(shù)。

50.A對(duì)調(diào)用的虛函數(shù)和模板類(lèi)都進(jìn)行遲后編譯,調(diào)用需要時(shí)間

B virtual,派生類(lèi)必須要求名字相同,參數(shù)類(lèi)型相同,但是返回類(lèi)型可以不同

C inline內(nèi)聯(lián)函數(shù)可以是虛函數(shù)。靜態(tài)成員函數(shù)不能是虛函數(shù)(因?yàn)椴恍枰獙?shí)例化就可以調(diào)用),友元函數(shù),構(gòu)造函數(shù)不能是虛函數(shù),析構(gòu)函數(shù)可以。

51.C++中有沒(méi)有純虛構(gòu)造函數(shù)?

構(gòu)造函數(shù)不能是虛的,只能有虛的析構(gòu)函數(shù)。

52.throw表達(dá)式

(1)class? exception Type{};

throw exception Type();//函數(shù)需要括號(hào)

(2)enum mathErr { overflow, underflow, zeroDivide };

throw zeroDivide;//枚舉不需要括號(hào)

53.談?wù)勀阍趺凑J(rèn)識(shí)C++ 的模板的?

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

54.在C++的一個(gè)類(lèi)中聲明一個(gè)static成員變量有沒(méi)有用?

在C++類(lèi)的成員變量被聲明為static(稱(chēng)為靜態(tài)成員變量),意味著它為該類(lèi)的所有實(shí)例所共享,也就是說(shuō)當(dāng)某個(gè)類(lèi)的實(shí)例修改了該靜態(tài)成員變量,也就是說(shuō)不管創(chuàng)建多少對(duì)象,static修飾的變量只占有一塊內(nèi)存。其修改值為該類(lèi)的其他所有實(shí)例所見(jiàn);而類(lèi)的靜態(tài)成員 函數(shù)也只能訪(fǎng)問(wèn)靜態(tài)成員(變量或函數(shù))。static是加了訪(fǎng)問(wèn)控制的全局變量,不被繼承。

55.C++中為什么要用模板類(lèi)。

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

(2)它是類(lèi)型無(wú)關(guān)的,因此具有很高的可復(fù)用性。

(3)它在編譯時(shí)而不是運(yùn)行時(shí)檢查數(shù)據(jù)類(lèi)型,保證了類(lèi)型安全

(4)它是平臺(tái)無(wú)關(guān)的,可移植性

(5)可用于基本數(shù)據(jù)類(lèi)型

56.函數(shù)模板與類(lèi)模板有什么區(qū)別?聯(lián)系?

函數(shù)模板的實(shí)例化是由編譯程序在處理函數(shù)調(diào)用時(shí)自動(dòng)完成的

類(lèi)模板的實(shí)例化必須由程序員在程序中顯示地指定

57.

58.談?wù)?在類(lèi)中如何使用const的?

有時(shí)我們希望某些常量只在類(lèi)中有效。由于#define定義的宏常量是全局的,不能達(dá)到目的,于是想當(dāng)然地覺(jué)得應(yīng)該用const修飾數(shù)據(jù)成員來(lái)實(shí)現(xiàn)。const數(shù)據(jù)成員的確是存在的,但其含義卻不是我們所期望的。const數(shù)據(jù)成員只在某個(gè)對(duì)象生存期內(nèi)是常量,而對(duì)于整個(gè)類(lèi)而言卻是可變的,因?yàn)轭?lèi)可以創(chuàng)建多個(gè)對(duì)象,不同的對(duì)象其const數(shù)據(jù)成員的值可以不同。不能在類(lèi)聲明中初始化const數(shù)據(jù)成員。

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

59.函數(shù)重載,靠什么來(lái)區(qū)分調(diào)用的哪個(gè)函數(shù),靠返回值判斷可以不可以?

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

void func(void);與int func(void);

C/C++程序中,可以忽略函數(shù)的返回值,但是這種情況下,編譯器和程序員都不知道哪個(gè)func函數(shù)被調(diào)用,所以只能靠參數(shù)而不能靠返回值類(lèi)型的不同來(lái)區(qū)分重載函數(shù)。

60.所有運(yùn)算符都能重載嗎?

有一些不行。這種限制是出于安全方面的考慮,可防止錯(cuò)誤和混亂。

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

(2)不能重載'.',因?yàn)?.'在類(lèi)中對(duì)任何成員都有意義,已經(jīng)成為標(biāo)準(zhǔn)用法。

(3)不能重載目前C++運(yùn)算符集合中沒(méi)有的符號(hào),如#,@,$等。

原因有兩點(diǎn),一是難以理解,二是難以確定優(yōu)先級(jí)。

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

61.基類(lèi)的析構(gòu)函數(shù)不是虛函數(shù),會(huì)帶來(lái)什么問(wèn)題?

派生類(lèi)的西溝函數(shù)用不上,會(huì)造成資源的泄漏。

d.程序閱讀題(62-90)

62.main函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼?

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

63.不使用判斷,找出a和b中最大值。

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

64.如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號(hào)?

cout << __FILE__;

cout << __LINE__;

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

65下面有兩種if語(yǔ)句判斷方式。請(qǐng)問(wèn)哪種寫(xiě)法更好?為什么?

int n;

if(n==10)//第一種

if(10==n)//第二種

這是一個(gè)風(fēng)格問(wèn)題,第二種方式如果少了個(gè)=號(hào),編譯時(shí)就會(huì)報(bào)錯(cuò),減少了出錯(cuò)的可能性,可以檢測(cè)出是否少了=。

66.寫(xiě)出運(yùn)行結(jié)果:

{char str[]="word";cout<

char *p=str;cout<

char i=10;cout<

void *pp=malloc(10);cout<

6:4:1:4

67.不用第三方參數(shù)的情況下,交換兩個(gè)參數(shù)的值。

(1)異或

(2)a=a+b; b=a-b; a=a-b;

68.以下代碼如果有錯(cuò),請(qǐng)改正,并寫(xiě)出輸出結(jié)果?

main(void)

{int nArrLength(400), i=546;//命名上有問(wèn)題

for(int i=0;i<99999999999;i++);//考對(duì)變量的越界理解,改為unsigned int a=~((int)0)/2,整數(shù)0取反,

cout<

cout<

69.int i=5,b=7;

cout<<(i+++b)<

不用調(diào)試,說(shuō)出在gcc編譯后的結(jié)果;

(i++ +b) 12

70.寫(xiě)一個(gè)能作為左值的函數(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;

cout<<"x="<

71.

class human{

public:

~human(){cout<<"human over...."<

void Disp(){cout<<"human disp...."<

};

class man:public human{

public:

~man(){cout<<"man over...."<

void Disp(){cout<<"man disp...."<

};

int main(){

human *p = new man;

p->Disp();

delete p;

return 0;

}

human disp....

human over....

72.下面的函數(shù)實(shí)現(xiàn)在一個(gè)固定的數(shù)上加上一個(gè)數(shù),有什么錯(cuò)誤,改正:

int add_n(int n){

static int i=100;

i+=n;

return i;}

因?yàn)閟tatic使得i的值會(huì)保留上次的值。以后的i會(huì)一直更新,使得第二次調(diào)用出現(xiàn)錯(cuò)誤。

去掉static即可

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

int i=3;

cout<<*(array+i)<

4

74.寫(xiě)一個(gè)函數(shù)當(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;}

75.字符指針、浮點(diǎn)數(shù)指針、以及函數(shù)指針這三種類(lèi)型的變量哪個(gè)占用內(nèi)存最大?為什么?

指針變量也占用內(nèi)存單元,而且所有指針變量占用內(nèi)存單元的數(shù)量都是相同的。就是說(shuō),不管是指向何種對(duì)象的指針變量,它們占用內(nèi)存的字節(jié)數(shù)都是一樣的,并且要足夠把程序中所能用到的最大地址表示出來(lái)(通常是一個(gè)機(jī)器字長(zhǎng))。4

76.以下三條輸出語(yǔ)句輸出

char str1[] = "abc";

char str2[] = "abc";

const char str3[] = "abc";

const char str4[] = "abc";

const char* str5 = "abc";

const char* str6 = "abc";

cout<

cout<

cout<

分別輸出false,false,true。

str1和str2都是字符數(shù)組,每個(gè)都有其自己的存儲(chǔ)區(qū),它們的值則是各存儲(chǔ)區(qū)首地址,不等;

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

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

77.以下代碼有什么問(wèn)題?

(true?1:“1”)<

三元表達(dá)式“?:” 問(wèn)號(hào)后面的兩個(gè)操作數(shù)必須為同一類(lèi)型。

78.能夠編譯

unsigned int const size1 = 2;

char str1[size1];

unsigned int temp = 0;

cin >> temp;

unsigned int const size2 = temp;

char str2[size2];

str2定義出錯(cuò),size2非編譯器期間常量,而數(shù)組定義要求長(zhǎng)度必須為編譯器常量。

79.以下代碼輸出語(yǔ)句為0嗎?為什么?

struct CLS{

int m_i;

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

// m_i沒(méi)有初始化

CLS()

{

CLS(0);

}

};

CLS obj;

cout<

不能。在默認(rèn)構(gòu)造函數(shù)內(nèi)部再調(diào)用帶參的構(gòu)造函數(shù)屬用戶(hù)行為而非編譯器行為, 亦即僅執(zhí)行函數(shù)調(diào)用,而不會(huì)執(zhí)行其后的初始化表達(dá)式。只有在生成對(duì)象時(shí),初始化表達(dá)式才會(huì)隨相應(yīng)的構(gòu)造函數(shù)調(diào)用。

80.死循環(huán)

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

81.

int a=5,b=7,c;

c = a+++b;

a=6,b=7,c=12

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

83.代碼

void func(){static int val; ...}中,變量val的內(nèi)存地址位于:A。已初始化數(shù)據(jù)段

84 入棧

85.判斷表達(dá)式,寫(xiě)出a的值

int a = 4;

A.a+=(a++); B.a+=(++a); C.(a++)+=a;D.(++a)+=(a++);

a++是個(gè)右值,C錯(cuò); 可改成(++a)=+a;答案:9,10,10,11

86.談?wù)勅绾问褂胷eturn語(yǔ)句

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

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

(3)如果函數(shù)返回值是一個(gè)對(duì)象,要考慮return語(yǔ)句的效率。

87.(1)return String(s1+s2); 和(2)String temp(s1+s2);return temp;一樣嗎?

(1)是臨時(shí)對(duì)象的語(yǔ)法,表示“創(chuàng)建一個(gè)臨時(shí)對(duì)象并返回它”。

(2)將發(fā)生三件事:

首先,temp對(duì)象被創(chuàng)建,同時(shí)完成初始化;

然后拷貝構(gòu)造函數(shù)把temp拷貝到保存返回值的外部存儲(chǔ)單元中;

最后,temp在函數(shù)結(jié)束時(shí)被銷(xiāo)毀(調(diào)用析構(gòu)函數(shù))。

然而“創(chuàng)建一個(gè)臨時(shí)對(duì)象并返回它”的過(guò)程是不同的,編譯器直接把臨時(shí)對(duì)象創(chuàng)建并初始化在外部存儲(chǔ)單元中,省去了拷貝和析構(gòu)的花費(fèi),提高了效率

88.下列程序的運(yùn)行結(jié)果

const char *str="vermeer";

int main()

{const char *pstr=str;

cout<<pstr<<endl;}

vermeer

89.inline void max_out(int val1,int val2)

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

int main(){

int ix=10,jx=20;

cout<

cout<

max_out(ix,jx);}

<<優(yōu)先級(jí)大于??jī)?yōu)先級(jí),所以輸出的是(val1>val2)

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

int max(int *,int =10);

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

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

e.編程練習(xí)(91-100)

91.被置1的位的個(gè)數(shù)。

unsigned int One0(char log)

{

int? il

unsigned int num=0,val;

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

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

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

if(val) num++;}

return num;}

92.十六進(jìn)制組成的字符串轉(zhuǎn)換成十進(jìn)制數(shù)字并返回

bool HexToDec(char* shex,int& idec)

{

int i,mid;

int len = strlen(shex);

if(len>8) return false;

mid=0, idec=0;

for(i=0;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 =idec+mid;

}

return true;

}

93.字符串逆序輸出

第一種:

void main()

{

char a[50];

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

int i=0,j;

char t;

cin.geiline(a,50,'\n');

for(i=0,j=strlen(a)-1;i

{ t=a[i];a[i]=a[j];a[j]=t;}

}

第二種:

string str;

cin>>str;

str.replace;

cout<

94.編寫(xiě)一個(gè)算法frequency,統(tǒng)計(jì)在一個(gè)輸入字符串中各個(gè)不同字符出現(xiàn)的頻度。用適當(dāng)?shù)臏y(cè)試數(shù)據(jù)來(lái)驗(yàn)證這個(gè)算法。

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

{

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

if(!len){cout<<"empty"<

else{

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

for(i=1;i

for(i=1;i

{ //檢測(cè)串中所有字符

j=0;while(j

if(j==k)

{A[k]=s[i];C[k]++;k++;}? //s[i]從未檢測(cè)過(guò)

else C[j]++; //s[i]已經(jīng)檢測(cè)過(guò)

}

}

}

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

#include

template class Queue {? ? //循環(huán)隊(duì)列的類(lèi)定義

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ì)列滿(mǎn)否

private:

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

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

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

}

template

Queue:: Queue ( int sz ) : rear (maxSize-1), length (0), maxSize (sz) {

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

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

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

}

template

void Queue :: EnQueue ( Type &item ) {

assert ( ! IsFull ( ) );? ? //判隊(duì)列是否不滿(mǎn),滿(mǎn)則出錯(cuò)處理

length++;? ? ? //長(zhǎng)度加1

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

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

}

template

Type Queue :: DeQueue ( ) {

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

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

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

}

讀取隊(duì)頭元素值函數(shù)

template

Type Queue :: GetFront ( ) {

assert ( ! IsEmpty ( ) );

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

}

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

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

(2) 求 n 個(gè)整數(shù)的和。

(3) 求 n 個(gè)整數(shù)的平均值。

#include

class RecurveArray? //數(shù)組類(lèi)聲明

{

private:

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

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

int CurrentSize; //當(dāng)前已有數(shù)組元素個(gè)數(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;

}

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

#include //定義在頭文件中

class List;

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

{

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? //鏈表類(lèi)

{

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ù)個(gè)數(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)成為鏈表第一個(gè)結(jié)點(diǎn)

else

{

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

current = q;

}

cin >>value; //再輸入

}

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

}

void List :: PrintList ( )? //輸出鏈表

{

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

ListNode *p = first;

while ( p != NULL )

{

cout <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)個(gè)數(shù)

{

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

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

}

float List :: Avg ( ListNode *f , int& n )? //遞歸算法 : 求鏈表中所有元素的平均值

{

if ( f -> link == NULL ) //鏈表中只有一個(gè)結(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 :"<

cout <<"\nThe Num is :"<

cout <<"\nThe Ave is :"<

printf ( "Hello World!\n" );

return 0;

}

}

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)這個(gè)替換操作。

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

{

if ( ( int id = Find ( t ) ) == -1 ) //沒(méi)有找到,當(dāng)前字符串不改,返回

{

cout << "The (replace) operation failed." << endl;

return *this;

}

String temp( ch ); //用當(dāng)前串建立一個(gè)空的臨時(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é)果串連接后的長(zhǎng)度

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]; //刪改原來(lái)的字符串

temp.curLen -= ( id + t.curLen );

id = temp.Find ( t );

}

return *this;

}

99.試編寫(xiě)一個(gè)求解Josephus問(wèn)題的函數(shù)。用整數(shù)序列1, 2, 3, ……, n表示順序圍坐在圓桌周?chē)娜?,并采用?shù)組表示作為求解過(guò)程中使用的數(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, s, m )

{

int i, j, k, tmp;

if ( m == 0 )

{

cout << "m = 0是無(wú)效的參數(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-- ){/*逐個(gè)出局,執(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;

}

}

100.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; // 用于保存字符串

};

請(qǐng)編寫(xiě)String的上述4個(gè)函數(shù)。

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

String::~String(void)

{

delete [] m_data;

// 由于m_data 是內(nèi)部數(shù)據(jù)類(lèi)型,也可以寫(xiě)成 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]; // 若能加 NULL 判斷則更好

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)

{

// (1) 檢查自賦值

if(this == &other)

return *this;

// (2) 釋放原有的內(nèi)存資源

delete [] m_data;

// (3)分配新的內(nèi)存資源,并復(fù)制內(nèi)容

int length = strlen(other.m_data);

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

strcpy(m_data, other.m_data);

// (4)返回本對(duì)象的引用

return *this;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容