C和C++經(jīng)典面試題(面試必備)_第1頁(yè)
C和C++經(jīng)典面試題(面試必備)_第2頁(yè)
C和C++經(jīng)典面試題(面試必備)_第3頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C/C+經(jīng)典面試題(面試必備)面試題 1:變量的聲明和定義有什么區(qū)別 為變量分配地址和存儲(chǔ)空間的稱為定義, 不分配地址的稱為聲明。 一 個(gè)變量可以在多個(gè)地方聲明,但是只在一個(gè)地方定義。參加 extern 修飾的是變量的聲明, 說(shuō)明 此變量將在文件以外或在文件后面局部定義。說(shuō)明:很多時(shí)候一個(gè)變量, 只是聲明不分配內(nèi)存空間,直到具體使用 時(shí)才初始化,分配內(nèi)存空間,如外部變量。 面試題 2:寫出 bool 、 int、 float 、指針變量與“零 值 比擬的 if 語(yǔ)句bool 型數(shù)據(jù):if( flag )A;elseB;int 型數(shù)據(jù):if( 0 != flag )A;elseB;指針型數(shù):if

2、( NULL = flag )A;elseB;float 型數(shù)據(jù):if ( ( flag = NORM ) & ( flag = NORM ) )A; 2注意:應(yīng)特別注意在int、指針型變量和“零值比擬的時(shí)候,把“零值放在左邊,這樣當(dāng)把“=誤寫成“ =時(shí),編譯器可以報(bào)錯(cuò),否那么這種邏輯錯(cuò)誤不容易發(fā)現(xiàn), 并且可能導(dǎo)致很嚴(yán)重的后果。 面試題 3: sizeof 和 strlen 的區(qū)別 sizeof 和 strlen 有以下區(qū)別:是一個(gè)操作符,是庫(kù)函數(shù)。 的參數(shù)可以是數(shù)據(jù)的類型,也可以是變量,而只能以結(jié)尾為0的字符串作參數(shù)。編譯器在編譯時(shí)就計(jì)算出了 sizeof 的結(jié)果。而 strlen 函數(shù)必須

3、在運(yùn) 行時(shí)才能計(jì)算出來(lái)。并且 sizeof計(jì)算的是數(shù)據(jù)類型占內(nèi)存的大小,而 strlen 計(jì)算的是字符串實(shí)際的 長(zhǎng)度。數(shù)組做 sizeof 的參數(shù)不退化,傳遞給 strlen 就退化為指針了。 注意:有些是操作符看起來(lái)像是函數(shù), 而有些函數(shù)名看起來(lái)又像操作 符,這類容易混淆的名稱一定 要加以區(qū)分,否那么遇到數(shù)組名這類特殊數(shù)據(jù)類型作參數(shù)時(shí)就很容易出 錯(cuò)。最容易混淆為函數(shù)的操作符就是 sizeof。面試題 4: C 語(yǔ)言的關(guān)鍵字 static 和 C+ 的關(guān)鍵字 static 有什么區(qū)別在 C 中 static 用來(lái)修飾局部靜態(tài)變量和外部靜態(tài)變量、函數(shù)。而C+中除了上述功能外,還用來(lái)定義類的成員變

4、量和函數(shù)。即靜態(tài)成員和靜態(tài)成員函數(shù)。注意:編程時(shí) static 的記憶性,和全局性的特點(diǎn)可以讓在不同時(shí)期 調(diào)用的函數(shù)進(jìn)行通信,傳遞信息,而C+勺靜態(tài)成員那么可以在多個(gè)對(duì)象實(shí)例間進(jìn)行通信,傳遞信息。 面試題5: C中的malloc和C + +中的new有什么區(qū)別 malloc 和 new 有以下不同:(1) new、delete是操作符,可以重載,只能在 C+沖使用。(2) malloc、free是函數(shù),可以覆蓋,C、C+中都可以使用。( 3) new 可以調(diào)用對(duì)象的構(gòu)造函數(shù),對(duì)應(yīng)的 delete 調(diào)用相應(yīng)的 析構(gòu)函數(shù)。( 4) malloc 僅僅分配內(nèi)存, free 僅僅回收內(nèi)存,并不執(zhí)行構(gòu)造

5、 和析構(gòu)函數(shù)( 5) new、 delete 返回的是某種數(shù)據(jù)類型指針,malloc、 free 返回的是 void 指針。注意: malloc 申請(qǐng)的內(nèi)存空間要用 free 釋放,而 new 申請(qǐng)的內(nèi) 存空間要用 delete 釋放,不要混用。因?yàn)閮烧邔?shí)現(xiàn)的機(jī)理不同。 面試題 6: 寫一個(gè)“ 標(biāo)準(zhǔn) 宏 MIN #define min(a,b)(a)=(b)(a):(b) 注意:在調(diào)用時(shí)一定要注意這個(gè)宏定義的副作用,如下調(diào)用: (+*p)=(x)(+*p):(x)。p 指針就自加了兩次,違背了 MIN 的本意。3 面試題 7: 一個(gè)指針可以是 volatile 嗎可以,因?yàn)橹羔樅推胀ㄗ兞恳粯樱?/p>

6、有時(shí)也有變化程序的不可控性。常 見例:子中斷效勞子程序修改一個(gè)指向一個(gè) buffer 的指針時(shí),必須用 volatile 來(lái)修飾這個(gè)指針。 說(shuō)明:指針是一種普通的變量, 從訪問上沒有什么不同于其他變量的 特性。其保存的數(shù)值是個(gè)整型 數(shù)據(jù),和整型變量不同的是,這個(gè)整型數(shù)據(jù)指向的是一段內(nèi)存地址。 面試題 8: a 和 &a 有什么區(qū)別 請(qǐng)寫出以下代碼的打印結(jié)果,主要目的是考察 a 和 &a 的區(qū)別。 #include void main( void )int a5=1,2,3,4,5;int *ptr=(int *)(&a+1); printf(%d,%d,*(a+1),*(ptr-1); ret

7、urn; 輸出結(jié)果: 2, 5。注意:數(shù)組名 a 可以作數(shù)組的首地址,而 &a 是數(shù)組的指針。思考, 將原式的 int *ptr=(int *)(&a+1);改為int *ptr=(int *)(a+1);時(shí)輸出結(jié)果將是什么呢面試題9:簡(jiǎn)述C、C+程序編譯的內(nèi)存分配情況C、C+沖內(nèi)存分配方式可以分為三種: 1 從靜態(tài)存儲(chǔ)區(qū)域分配: 內(nèi)存在程序編譯時(shí)就已經(jīng)分配好, 這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都 存在。 速度快、 不容易出錯(cuò),因?yàn)橛邢到y(tǒng)會(huì)善后。 例如全局變量, static 變量等。 2 在棧上分配:在執(zhí)行函數(shù)時(shí), 函數(shù)內(nèi)局部變量的存儲(chǔ)單元都在棧上創(chuàng)立, 函數(shù)執(zhí)行 結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋 放

8、。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配 的內(nèi)存容量有限。 3 從堆上分配:即動(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)存的生存期由程序員決定, 使用非常靈活。 如果在堆上分配了空間, 就有責(zé)任回收它,否那么運(yùn)行的程序會(huì)出現(xiàn)內(nèi)存泄漏, 另外頻繁地分 配和釋放不同大小的堆空間將會(huì)產(chǎn)生堆內(nèi)碎塊。一個(gè)C、C+程序編譯時(shí)內(nèi)存分為 5大存儲(chǔ)區(qū):堆區(qū)、棧區(qū)、全局 區(qū)、文字常量區(qū)、程序代碼區(qū)。4 面試題 10: 簡(jiǎn)述 strcpy、 sprintf 與 memcpy 的區(qū)別 三者主要

9、有以下不同之處: 1 操作對(duì)象不同, strcpy 的兩個(gè)操作對(duì)象均為字符串, sprintf 的操作源對(duì)象可以是多種數(shù)據(jù)類型,目的操作對(duì)象是字符串, memcpy 的兩個(gè)對(duì)象就是兩個(gè)任意可操作 的內(nèi)存地址,并不限于何種數(shù)據(jù)類型。 2 執(zhí)行效率不同, memcpy 最高, strcpy 次之, sprintf 的 效率最低。 3 實(shí)現(xiàn)功能不同, strcpy 主要實(shí)現(xiàn)字符串變量間的拷貝, sprintf 主要實(shí)現(xiàn)其他數(shù)據(jù)類型格式到字符串的轉(zhuǎn)化, memcpy 主要是內(nèi)存塊間的拷貝。說(shuō)明: strcpy、 sprintf 與 memcpy 都可以實(shí)現(xiàn)拷貝的功能,但是 針對(duì)的對(duì)象不同,根據(jù)實(shí)際需求

10、,來(lái) 選擇適宜的函數(shù)實(shí)現(xiàn)拷貝功能。 面試題 11: 設(shè)置地址為 0x67a9 的 整型變量的值為 0xaa66int *ptr;ptr = int *0x67a9;*ptr = 0xaa66;說(shuō)明:這道題就是強(qiáng)制類型轉(zhuǎn)換的典型例子, 無(wú)論在什么平臺(tái)地址長(zhǎng) 度和整型數(shù)據(jù)的長(zhǎng)度是一樣的, 即一個(gè)整型數(shù)據(jù)可以強(qiáng)制轉(zhuǎn)換成地址指針類型, 只要有意義即可。 面 試題 12: 面向?qū)ο蟮娜筇卣?面向?qū)ο蟮娜筇卣魇欠庋b性、繼承性和多態(tài)性: 封裝性:將客觀事物抽象成類,每個(gè)類對(duì)自身的數(shù)據(jù)和方法實(shí)行protection ( private, protected, public。繼承性:廣義的繼承有三種實(shí)現(xiàn)形式

11、: 實(shí)現(xiàn)繼承 使用基類的屬性 和方法而無(wú)需額外編碼的能力 、可 視繼承子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼 、接口繼承 僅使用屬性 和方法 ,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn) 。多態(tài)性:是將父類對(duì)象設(shè)置成為和一個(gè)或更多它的子對(duì)象相等的技 術(shù)。用子類對(duì)象給父類對(duì)象賦值 之后,父類對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方 式運(yùn)作。說(shuō)明:面向?qū)ο蟮娜齻€(gè)特征是實(shí)現(xiàn)面向?qū)ο蠹夹g(shù)的關(guān)鍵, 每一個(gè)特征 的相關(guān)技術(shù)都非常的復(fù)雜,程序員應(yīng)該多看、多練。 面試題13: C+啲空類有哪些成員函數(shù) 缺省構(gòu)造函數(shù)。缺省拷貝構(gòu)造函數(shù)。 缺省析構(gòu)函數(shù)。缺省賦值運(yùn)算符。 缺省取址運(yùn)算符。缺省取址運(yùn)算符 const。 注意:有些書上只

12、是簡(jiǎn)單的介紹了前四個(gè)函數(shù)。 沒有提及后面這兩個(gè) 函數(shù)。但后面這兩個(gè)函數(shù)也是空類的默認(rèn)函數(shù)。 另外需要注意的是, 只有當(dāng)實(shí)際使用這些函數(shù)的時(shí) 候,編譯器才會(huì)去定義它們。5 面試題 14: 談?wù)勀銓?duì)拷貝構(gòu)造函數(shù)和賦值運(yùn)算符的認(rèn)識(shí) 拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載有以下兩個(gè)不同之處:( 1)拷貝構(gòu)造函數(shù)生成新的類對(duì)象,而賦值運(yùn)算符不能。( 2)由于拷貝構(gòu)造函數(shù)是直接構(gòu)造一個(gè)新的類對(duì)象, 所以在初始化 這個(gè)對(duì)象之前不用檢驗(yàn)源對(duì)象是否和新建對(duì)象相同。 而賦值運(yùn)算符那么需要這個(gè)操作, 另外賦值運(yùn)算 中如果原來(lái)的對(duì)象中有內(nèi)存分配要先把內(nèi)存釋放掉注意:當(dāng)有類中有指針類型的成員變量時(shí), 一定要重寫拷貝構(gòu)造函數(shù) 和賦

13、值運(yùn)算符,不要使用默認(rèn)的。面試題15:用C+設(shè)計(jì)一個(gè)不能被繼承的類template class Afriend T;private:A() A() ;class B : virtual public Apublic:B() B() ;class C : virtual public B public:C() C() ;void main( void )B b;n);9return NULL; S-data = 0; n);return S;if( NULL = S-next)p-next = NULL;elsep-next = S-next; p-data = data; LEN自 下向上掃描

14、if( ARRAYj+1 0)d /= 10;temp +;if( temp m )m = temp;temp = 0;return m;QueueLink Push( QueueLink &Q , node node ) ata);printf(n);Max = lenData( Array, LEN ); ata /power - (Arrayi.data/(power * d) * d;Push( Queuek, Arrayi );for(int l = 0, k = 0; l next = NULL; 樹結(jié)點(diǎn)入棧函數(shù): void push_path(pPath H, pBTree T)

15、 pPath p = H-next;pPath q = H;while( NULL != p )20 q = p;p = p-next;p = ( pPath )malloc( sizeof( PATH ) ); 申/ 請(qǐng)新結(jié)點(diǎn) p-next = NULL; /初始化新結(jié)點(diǎn) p-tree = T;q-next = p; / 新結(jié)點(diǎn)入棧 樹結(jié)點(diǎn)打印函數(shù): void print_path( pPath L )pPath p = L-next;while( NULL != p ) /打印當(dāng)前棧中所有數(shù)據(jù) printf(%d, , p-tree-data);p = p-next; 樹結(jié)點(diǎn)出棧函數(shù): v

16、oid pop_path( pPath H )pPath p = H-next;pPath q = H;if( NULL = p ) /檢驗(yàn)當(dāng)前棧是否為空 printf(Stack is null!n); return;p = p-next;while( NULL != p ) /出棧q = q-next;p = p-next;free( q-next ); / 釋放出棧結(jié)點(diǎn)空間q-next = NULL;判斷結(jié)點(diǎn)是否為葉子結(jié)點(diǎn):int IsLeaf(pBTree T)return ( T-lchild = NULL )&( T-rchild=NULL );查找符合條件的路徑:int find

17、_path(pBTree T, int sum, pPath L)21push_path( L, T);record += T-data;if( ( record = sum ) & ( IsLeaf( T ) ) ) /打/ 印符合條件的當(dāng)前路徑 print_path( L );printf( n );if( T-lchild != NULL ) /遞歸查找當(dāng)前節(jié)點(diǎn)的左孩子find_path( T-lchild, sum, L);if( T-rchild != NULL ) /遞歸查找當(dāng)前節(jié)點(diǎn)的右孩子find_path( T-rchild, sum, L);record -= T-data;

18、 pop_path(L);return 0;注意:數(shù)據(jù)結(jié)構(gòu)一定要活學(xué)活用, 例如此題,把所有的結(jié)點(diǎn)都?jí)喝霔#?而不符合條件的結(jié)點(diǎn)彈出棧,很容易實(shí)現(xiàn)了有效路徑的查找。 雖然用鏈表也可以實(shí)現(xiàn), 但是用棧更 利于理解這個(gè)問題,即適當(dāng)?shù)臄?shù)據(jù) 結(jié)構(gòu)為更好的算法設(shè)計(jì)提供了有利的條件。 面試題 34: 寫一個(gè)“標(biāo) 準(zhǔn) 宏 MIN寫一個(gè)“標(biāo)準(zhǔn)宏 MIN,這個(gè)宏輸入兩個(gè)參數(shù)并且返回較小的一個(gè)。答案】#define min(a,b)(a)=(b)(a):(b) 注意:在調(diào)用時(shí)一定要注意這個(gè)宏定義的副作用,如下調(diào)用: (+*p)=(x)(+*p):(x)。p 指針就自加了兩次, 違背了 MIN 的本意。 面試題 3

19、5: typedef 和 define 有什么區(qū)別( 1)用法不同: typedef 用來(lái)定義一種數(shù)據(jù)類型的別名,增強(qiáng)程 序的可讀性。 define 主要用來(lái)定義 常量,以及書寫復(fù)雜使用頻繁的宏。( 2) 執(zhí)行時(shí)間不同: typedef 是編譯過程的一局部,有類型檢查 的功能。 define 是宏定義,是預(yù)編 譯的局部,其發(fā)生在編譯之前,只是簡(jiǎn)單的進(jìn)行字符串的替換,不進(jìn) 行類型的檢查。( 3)作用域不同: typedef 有作用域限定。 define 不受作用域約 束,只要是在 define 聲明后的引用都是正確的。( 4)對(duì)指針的操作不同: typedef 和 define 定義的指針時(shí)有很

20、大 的區(qū)別。注意: typedef 定義是語(yǔ)句,因?yàn)榫湮惨由戏痔?hào)。而 define 不是 語(yǔ)句,千萬(wàn)不能在句尾加分號(hào)。22 面試題 36: 關(guān)鍵字 const 是什么 const 用來(lái)定義一個(gè)只讀的變量或?qū)ο蟆V饕獌?yōu)點(diǎn):便于類型檢查、同宏定義一樣可以方便地進(jìn)行參數(shù)的修改和調(diào)整、 節(jié)省空間, 防止不必要的內(nèi)存分配、 可為函數(shù) 重載提供參考。說(shuō)明: const 修飾函數(shù)參數(shù),是一種編程標(biāo)準(zhǔn)的要求,便于閱讀, 一看即知這個(gè)參數(shù)不能被改變,實(shí)現(xiàn)時(shí)不易出錯(cuò)。 面試題 37: static 有什么作用static 在 C 中主要用于定義全局靜態(tài)變量、 定義局部靜態(tài)變量、 定 義靜態(tài)函數(shù)。在C+中新增了兩

21、種作用:定義靜態(tài)數(shù)據(jù)成員、 靜態(tài)函數(shù)成員。注意:因?yàn)?static 定義的變量分配在靜態(tài)區(qū),所以其定義的變量的 默認(rèn)值為 0,普通變量的默認(rèn)值 為隨機(jī)數(shù),在定義指針變量時(shí)要特別注意。 面試題 38: extern 有 什么作用extern 標(biāo)識(shí)的變量或者函數(shù)聲明其定義在別的文件中, 提示編譯器遇 到此變量和函數(shù)時(shí)在其它模塊中尋找其定義。 面試題 39: 流操作符重載為什么返回引用 在程序中,流操作符 和經(jīng)常連續(xù)使用。 因此這兩個(gè)操作符的返回 值應(yīng)該是一個(gè)仍舊支持這兩個(gè) 操作符的流引用。其他的數(shù)據(jù)類型都無(wú)法做到這一點(diǎn)。注意:除了在賦值操作符和流操作符之外的其他的一些操作符中, 如 +、 -、 *

22、、 / 等卻千萬(wàn)不能返回 引用。因?yàn)檫@四個(gè)操作符的對(duì)象都是右值,因此,它們必須構(gòu)造一個(gè) 對(duì)象作為返回值。 面試題 40: 簡(jiǎn)述指針常量與常量指針區(qū)別 指針常量是指定義了一個(gè)指針,這個(gè)指針的值只能在定義時(shí)初始化, 其他地方不能改變。常量指針是指定義了一個(gè)指針, 這個(gè)指針指向一個(gè)只讀的對(duì)象, 不能通過常量 指針來(lái)改變這個(gè)對(duì)象的值。指針常量強(qiáng)調(diào)的是指針的不可改變性, 而常量指針強(qiáng)調(diào)的是指針對(duì)其 所指對(duì)象的不可改變性。注意:無(wú)論是指針常量還是常量指針, 其最大的用途就是作為函數(shù)的 形式參數(shù),保證實(shí)參在被調(diào)用函數(shù)中的不可改變特性。 面試題 41: 數(shù)組名和指針的區(qū)別 請(qǐng)寫出以下代碼的打印結(jié)果:#incl

23、ude #include void main(void)char str13=Hello world!;23char *pStr=Hello world!;coutsizeof(str)endl;coutsizeof(pStr)endl;coutstrlen(str)endl;coutstrlen(pStr)endl;return;【答案】 打印結(jié)果:1341212注意:一定要記得數(shù)組名并不是真正意義上的指針, 它的內(nèi)涵要比指 針豐富的多。但是當(dāng)數(shù)組名當(dāng) 做參數(shù)傳遞給函數(shù)后,其失去原來(lái)的含義,變作普通的指針。另外要 注意 sizeof 不是函數(shù),只是操作符。 面試題 42: 如何防止“野指 針“野指針產(chǎn)生原因及解決方法如下:( 1) 指針變量聲明時(shí)沒有被初始化。 解決方法: 指針聲明時(shí)初始 化,可以是具體的地址值,也可讓它指向 NULL。(2)指針p被free或者delete之后, 沒有置為NULL。解決 方法:指針指向的內(nèi)存空間被釋放后指針應(yīng)該指向 NULL。( 3) 指針操作超越了變量的作用范圍。解決方法:在變量的作用 域結(jié)束前釋放掉變量的地址空間并且讓指針指向 NULL。 注意:“野指針的解決方法也是編程標(biāo)準(zhǔn)的根本原那么,平時(shí)使用指 針時(shí)一定要防止產(chǎn)生“野指針 , 在使用指針前一定

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論