CC++經(jīng)典面試50題_第1頁
CC++經(jīng)典面試50題_第2頁
CC++經(jīng)典面試50題_第3頁
CC++經(jīng)典面試50題_第4頁
CC++經(jīng)典面試50題_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、面試題3:sizeof和strlen的區(qū)別sizeof和strlen有以下區(qū)別:     sizeof是一個操作符,strlen是庫函數(shù)。     sizeof的參數(shù)可以是數(shù)據(jù)的類型,也可以是變量,而strlen只能以結(jié)尾為0的字符串作參數(shù)。    編譯器在編譯時就計算出了sizeof的結(jié)果。而strlen函數(shù)必須在運行時才能計算出來。并且sizeof計算的是數(shù)據(jù)類型占內(nèi)存的大小,而strlen計算的是字符串實際的長度。   數(shù)組做sizeof的

2、參數(shù)不退化,傳遞給strlen就退化為指針了。注意:有些是操作符看起來像是函數(shù),而有些函數(shù)名看起來又像操作符,這類容易混淆的名稱一定要加以區(qū)分,否則遇到數(shù)組名這類特殊數(shù)據(jù)類型作參數(shù)時就很容易出錯。最容易混淆為函數(shù)的操作符就是sizeof。strlen()與sizeof()考點,一步到位!看下msdn的官方解釋:StrlenGet the length of a string.size_t strlen( const char *string );Each ofthese functions returns the number of characters instring,

3、 notincluding the terminating null character.函數(shù)返回string里的字符數(shù),不包括終止字符0。sizeof Operator 運算符sizeofexpressionThe sizeofkeyword gives the amount of storage, in bytes, associated with a variable or atype (including aggregate types). This keyword returns a value of typesize_t./返回變量或類型(包括集合類型)存儲空間

4、的大小,The expressionis either an identifier or a type-cast expression (a type specifier enclosed inparentheses).When appliedto a structure type or variable,sizeof returns the actual size, whichmay include padding bytes inserted for alignment. When applied to a staticallydimensioned array,siz

5、eof returns the size of the entire array. The sizeofoperator cannot return the size of dynamically allocated arrays or externalarrays./應(yīng)用結(jié)構(gòu)體類型或變量的時候,sizeof()返回事實的大小,包括為對齊而填充字節(jié)。當應(yīng)用到靜態(tài)數(shù)組時,sizeof()返回整個數(shù)組的大小。sizeof()不會返回動態(tài)分配數(shù)組或擴展數(shù)組的大小。char str = “Hello” ;char *p = str ;int n = 10;請計算sizeof (st

6、r) =  /5+1=6 ,注意1代表'0'容易落下,代表結(jié)束符。 str所占據(jù)的存儲空間大小sizeof ( p )=  /4指針類型sizeof ( n )=  /4整形占據(jù)的存儲空間void Func ( char str100)請計算sizeof( str ) = /4此時str轉(zhuǎn)化為指針大小仍為4void *p = malloc( 100 );請計算sizeof ( p ) =  /4指針大小4面試題5:中的malloc和中的new有什么區(qū)別malloc和new有以下不同:(1)new、delete是操作符,可以重載,

7、只能在C+中使用。(2)malloc、free是函數(shù),可以覆蓋,C、C+中都可以使用。(3)new可以調(diào)用對象的構(gòu)造函數(shù),對應(yīng)的delete調(diào)用相應(yīng)的析構(gòu)函數(shù)。(4)malloc僅僅分配內(nèi)存,free僅僅回收內(nèi)存,并不執(zhí)行構(gòu)造和析構(gòu)函數(shù)(5)new、delete返回的是某種數(shù)據(jù)類型指針,malloc、free返回的是void指針。注意:malloc申請的內(nèi)存空間要用free釋放,而new申請的內(nèi)存空間要用delete釋放,不要混用。因為兩者實現(xiàn)的機理不同。面試題8:a和&a有什么區(qū)別請寫出以下代碼的打印結(jié)果,主要目的是考察a和&a的區(qū)別。#include<stdio.h&

8、gt;void main( void)  inta5=1,2,3,4,5;  int*ptr=(int *)(&a+1); /此處&a是數(shù)組的指針,1實際1個數(shù)組長度 1*5*4 = 20個字節(jié);  int*ptr2 = (int *)(a+1);  printf("%d,%dn",*(a+1),*(ptr-1);  /  printf("%d,%dn",*(a+1),*(ptr2-1);     注意:數(shù)組名a可以作數(shù)

9、組的首地址,而&a是數(shù)組的指針。對比上兩式子的不同。&a+1,&a為代表a數(shù)組的指針,1根據(jù)&a變化代表了int a5數(shù)組的大小,為4*5=20個字節(jié)。a+1,  a代表數(shù)組a的首地址,1代表數(shù)組a中1個元素的長度,為4個字節(jié)。int *ptr = (int *)(&a + 1),代表ptr指向a數(shù)組20個字節(jié)后的一塊內(nèi)存區(qū)域,顯然,該內(nèi)存區(qū)域未定義,為一個隨機值。而*(ptr-1),此處ptr減去1*4個字節(jié)長度,ptr-1指向a5,*(ptr-1)=a5;而int *ptr2 = (int *)(a+1),代表指向數(shù)組首地址1*4個字節(jié)后元

10、素,即a1 = 2;即ptr2指向a2,此處的*a = *(a+0) = a0, *(a+1) = a1,依次類推。面試題9:簡述C、C+程序編譯的內(nèi)存分配情況C、C+中內(nèi)存分配方式可以分為三種:(1)從靜態(tài)存儲區(qū)域分配:內(nèi)存在程序編譯時就已經(jīng)分配好,這塊內(nèi)存在程序的整個運行期間都存在。速度快、不容易出錯,因為有系統(tǒng)會善后。例如全局變量,static變量等。(2)在棧上分配:在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。工作中討論問題都叫棧變量。(3)從堆上分配:即動態(tài)內(nèi)存分配。

11、程序在運行的時候用malloc或new申請任意大小的內(nèi)存,程序員自己負責在何時用free或delete釋放內(nèi)存。動態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活。如果在堆上分配了空間,就有責任回收它,否則運行的程序會出現(xiàn)內(nèi)存泄漏,另外頻繁地分配和釋放不同大小的堆空間將會產(chǎn)生堆內(nèi)碎塊。一個C、C+程序編譯時內(nèi)存分為5大存儲區(qū):堆區(qū)、棧區(qū)、全局/靜態(tài)區(qū)、文字常量(字符常量)區(qū)、程序代碼區(qū)。面試題11:設(shè)置地址為0x67a9的整型變量的值為0xaa66int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa66;說明:這道題就是強制類型轉(zhuǎn)換的典型例子,無論在什么平臺地址長度和整型數(shù)

12、據(jù)的長度是一樣的,即一個整型數(shù)據(jù)可以強制轉(zhuǎn)換成地址指針類型,只要有意義即可。但是,此處的轉(zhuǎn)換,編譯沒有問題,但是運行的時候可能會出錯。因為Ox67a9這塊地址可能被占用面試題13:C+的空類有哪些成員函數(shù)       1)缺省構(gòu)造函數(shù)。       2)缺省拷貝構(gòu)造函數(shù)。       3)缺省析構(gòu)函數(shù)。       4)缺省賦值運算符。  

13、;     5)缺省取址運算符。       6)缺省取址運算符 const。注意:有些書上只是簡單的介紹了前四個函數(shù)。沒有提及后面這兩個函數(shù)。但后面這兩個函數(shù)也是空類的默認函數(shù)。另外需要注意的是,只有當實際使用這些函數(shù)的時候,編譯器才會去定義它們。面試題14:談?wù)勀銓截悩?gòu)造函數(shù)和賦值運算符的認識拷貝構(gòu)造函數(shù)和賦值運算符重載有以下兩個不同之處:(1)拷貝構(gòu)造函數(shù)生成新的類對象,而賦值運算符不能。(2)由于拷貝構(gòu)造函數(shù)是直接構(gòu)造一個新的類對象,所以在初始化這個對象之前不用檢驗源對象是否

14、和新建對象相同。而賦值運算符則需要這個操作,另外賦值運算中如果原來的對象中有內(nèi)存分配要先把內(nèi)存釋放掉注意:當有類中有指針類型的成員變量時,一定要重寫拷貝構(gòu)造函數(shù)和賦值運算符,不要使用默認的。面試題15:用C+設(shè)計一個不能被繼承的類class Aprivate:A() A() ;class B : virtual public Apublic:        B()        B();class C : virtual public Bpublic:&#

15、160; C()   C() ;void main( void )B b;/C c;return;注意:構(gòu)造函數(shù)是繼承實現(xiàn)的關(guān)鍵,每次子類對象構(gòu)造時,首先調(diào)用的是父類的構(gòu)造函數(shù),然后才是自己的。此處,如果將父類構(gòu)造函數(shù)寫成私有的,便不能完成繼承操作。這是考察點。面試題17:簡述類成員函數(shù)的重寫、重載和隱藏的區(qū)別(1)重寫和重載主要有以下幾點不同。范圍的區(qū)別:被重寫的和重寫的函數(shù)在兩個類中,而重載和被重載的函數(shù)在同一個類中。參數(shù)的區(qū)別:被重寫函數(shù)和重寫函數(shù)的參數(shù)列表一定相同,而被重載函數(shù)和重載函數(shù)的參數(shù)列表一定不同。 virtual的區(qū)別:重寫的基類中被重寫的函數(shù)必須要有vi

16、rtual修飾,而重載函數(shù)和被重載函數(shù)可以被virtual修飾,也可以沒有。(2)隱藏和重寫、重載有以下幾點不同。與重載的范圍不同:和重寫一樣,隱藏函數(shù)和被隱藏函數(shù)不在同一個類中。參數(shù)的區(qū)別:隱藏函數(shù)和被隱藏的函數(shù)的參數(shù)列表可以相同,也可不同,但是函數(shù)名肯定要相同。當參數(shù)不相同時,無論基類中的參數(shù)是否被virtual修飾,基類的函數(shù)都是被隱藏,而不是被重寫。說明:雖然重載和覆蓋都是實現(xiàn)多態(tài)的基礎(chǔ),但是兩者實現(xiàn)的技術(shù)完全不相同,達到的目的也是完全不同的,覆蓋是動態(tài)態(tài)綁定的多態(tài),而重載是靜態(tài)綁定的多態(tài)。面試題18:簡述多態(tài)實現(xiàn)的原理編譯器發(fā)現(xiàn)一個類中有虛函數(shù),便會立即為此類生成虛函數(shù)表 

17、vtable。虛函數(shù)表的各表項為指向?qū)?yīng)虛函數(shù)的指針。編譯器還會在此類中隱含插入一個指針vptr(對vc編譯器來說,它插在類的第一個位置上)指向虛函數(shù)表。調(diào)用此類的構(gòu)造函數(shù)時,在類的構(gòu)造函數(shù)中,編譯器會隱含執(zhí)行vptr與vtable的關(guān)聯(lián)代碼,將vptr指向?qū)?yīng)的vtable,將類與此類的vtable聯(lián)系了起來。另外在調(diào)用類的構(gòu)造函數(shù)時,指向基礎(chǔ)類的指針此時已經(jīng)變成指向具體的類的this指針,這樣依靠此this指針即可得到正確的vtable。如此才能真正與函數(shù)體進行連接,這就是動態(tài)聯(lián)編,實現(xiàn)多態(tài)的基本原理。注意:一定要區(qū)分虛函數(shù),純虛函數(shù)、虛擬繼承的關(guān)系和區(qū)別。牢記虛函數(shù)實現(xiàn)原理,因為多態(tài)C+

18、面試的重要考點之一,而虛函數(shù)是實現(xiàn)多態(tài)的基礎(chǔ)。 面試題19:鏈表和數(shù)組有什么區(qū)別數(shù)組和鏈表有以下幾點不同:(1)存儲形式:數(shù)組是一塊連續(xù)的空間,聲明時就要確定長度。鏈表是一塊可不連續(xù)的動態(tài)空間,長度可變,每個結(jié)點要保存相鄰結(jié)點指針。(2)數(shù)據(jù)查找:數(shù)組的線性查找速度快,查找操作直接使用偏移地址。鏈表需要按順序檢索結(jié)點,效率低。(3)數(shù)據(jù)插入或刪除:鏈表可以快速插入和刪除結(jié)點,而數(shù)組則可能需要大量數(shù)據(jù)移動。(4)越界問題:鏈表不存在越界問題,數(shù)組有越界問題。說明:在選擇數(shù)組或鏈表數(shù)據(jù)結(jié)構(gòu)時,一定要根據(jù)實際需要進行選擇。數(shù)組便于查詢,鏈表便于插入刪除。數(shù)組節(jié)省空間但是長度固定,鏈表雖然變

19、長但是占了更多的存儲空間。 面試題 21:簡述隊列和棧的異同隊列和棧都是線性存儲結(jié)構(gòu),但是兩者的插入和刪除數(shù)據(jù)的操作不同,隊列是“先進先出”,棧是“后進先出”。注意:區(qū)別棧區(qū)和堆區(qū)。堆區(qū)的存取是順序隨意,而棧區(qū)是后進先出。棧由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。堆一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收。分配方式類似于鏈表。它與本題中的堆和棧是兩回事。堆棧只是一種數(shù)據(jù)結(jié)構(gòu),而堆區(qū)和棧區(qū)是程序的不同內(nèi)存存儲區(qū)域。在面試題9有講述。 面試題32:C+的引用和C語言的指針有什么區(qū)別指針和引用主要

20、有以下區(qū)別:(1)引用必須被初始化,但是不分配存儲空間。指針不聲明時初始化,在初始化的時候需要分配存儲空間。/引用未初始化,編譯器會報錯!referencesmust be initialized(2)引用初始化以后不能被改變,指針可以改變所指的對象。(3)不存在指向空值的引用,但是存在指向空值的指針。注意:引用作為函數(shù)參數(shù)時,會引發(fā)一定的問題,因為讓引用作參數(shù),目的就是想改變這個引用所指向地址的內(nèi)容,而函數(shù)調(diào)用時傳入的是實參,看不出函數(shù)的參數(shù)是正常變量,還是引用,因此可能會引發(fā)錯誤。所以使用時一定要小心謹慎。 面試題35:typedef和define有什么區(qū)別(1)用法不同:typ

21、edef用來定義一種數(shù)據(jù)類型的別名,增強程序的可讀性。define主要用來定義常量,以及書寫復(fù)雜使用頻繁的宏。(2)執(zhí)行時間不同:typedef是編譯過程的一部分,有類型檢查的功能。define是宏定義,是預(yù)編譯的部分,其發(fā)生在編譯之前,只是簡單的進行字符串的替換,不進行類型的檢查。(3)作用域不同:typedef有作用域限定。define不受作用域約束,只要是在define聲明后的引用都是正確的。(4)對指針的操作不同:typedef和define定義的指針時有很大的區(qū)別。注意:typedef定義是語句,因為句尾要加上分號。而define不是語句,千萬不能在句尾加分號。  

22、;面試題36:關(guān)鍵字const是什么const用來定義一個只讀(不能修改其值)的變量或?qū)ο?。主要?yōu)點:便于類型檢查、同宏定義一樣可以方便地進行參數(shù)的修改和調(diào)整、節(jié)省空間,避免不必要的內(nèi)存分配、可為函數(shù)重載提供參考。const 應(yīng)用表現(xiàn)在:常量定義;類的成員變量為常量;類的成員函數(shù)為常量(表示該函數(shù)不能修改成員變量的值);函數(shù)傳遞的時候參數(shù)為常量。說明:const修飾函數(shù)參數(shù),是一種編程規(guī)范的要求,便于閱讀,一看即知這個參數(shù)不能被改變,實現(xiàn)時不易出錯。 面試題37:static有什么作用static在C中主要用于定義全局靜態(tài)變量、定義局部靜態(tài)變量、定義靜態(tài)函數(shù)。在C+中新增了

23、兩種作用:定義靜態(tài)數(shù)據(jù)成員、靜態(tài)函數(shù)成員。注意:因為static定義的變量分配在靜態(tài)區(qū),所以其定義的變量的默認值為0,普通變量的默認值為隨機數(shù),在定義指針變量時要特別注意。 面試題38:extern有什么作用extern標識的變量或者函數(shù)聲明其定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其它模塊中尋找其定義。 面試題40:簡述指針常量與常量指針區(qū)別指針常量是指定義了一個指針,這個指針的值只能在定義時初始化,其他地方不能改變。常量指針是指定義了一個指針,這個指針指向一個只讀的對象,不能通過常量指針來改變這個對象的值。指針常量強調(diào)的是指針的不可改變性,而常量指針強調(diào)的是指針

24、對其所指對象的不可改變性。注意:無論是指針常量還是常量指針,其最大的用途就是作為函數(shù)的形式參數(shù),保證實參在被調(diào)用函數(shù)中的不可改變特性。舉例如下:int main()       int ival =55;       int jval =38;        /pa為指向常量的指針,不能通過pa改變其指向的ival的值;但pa可以指向其他變量.常量指針=指針指向的值為常量   

25、    const int *pa= &ival;       /*pa =88;           /報錯:l-valuespecifies const object        pa =&jval;       cout <<*pa <&

26、lt; endl;  /正確. 38        /pb為常量,指向變量的指針,pb不能修改,但可以修改pb指向的值。指針常量=指針本身是個常量       int* const pb= &ival;       /     pb = &jval;       / 

27、60;   cout << *pb << endl;  /l-value specifies const object       *pb = 2012;       cout <<*pb << "t" << ival << endl; /2012 2012        /pc針對上述

28、兩種修改都不可以。       const int*const pc = &ival;       cout <<*pc << endl;      /2012        return 0; 面試題41:數(shù)組名和指針的區(qū)別請寫出以下代碼的打印結(jié)果:void main(void)   

29、    charstr13="Hello world!"       char*pStr="Hello world!"        cout<<sizeof(str)<<endl;  /13       cout<<sizeof(pStr)<<endl;/4  

30、;     cout<<strlen(str)<<endl;  /12       cout<<strlen(pStr)<<endl;/12        return;注意:一定要記得數(shù)組名并不是真正意義上的指針,它的內(nèi)涵要比指針豐富的多。但是當數(shù)組名當做參數(shù)傳遞給函數(shù)后,其失去原來的含義,變作普通的指針。另外要注意sizeof不是函數(shù),只是操作符。 面試題

31、42:如何避免“野指針”“野指針”產(chǎn)生原因及解決辦法如下:(1)指針變量聲明時沒有被初始化。解決辦法:指針聲明時初始化,可以是具體的地址值,也可讓它指向NULL。(2)指針p 被 free或者delete之后,沒有置為NULL。解決辦法:指針指向的內(nèi)存空間被釋放后指針應(yīng)該指向NULL。(3)指針操作超越了變量的作用范圍。解決辦法:在變量的作用域結(jié)束前釋放掉變量的地址空間并且讓指針指向NULL。注意:“野指針”的解決方法也是編程規(guī)范的基本原則,平時使用指針時一定要避免產(chǎn)生“野指針”,在使用指針前一定要檢驗指針的合法性。 面試題43:常引用有什么作用常引用的引入主要是

32、為了避免使用變量的引用時,在不知情的情況下改變變量的值。常引用主要用于定義一個普通變量的只讀屬性的別名、作為函數(shù)的傳入形參,避免實參在調(diào)用函數(shù)中被意外的改變。說明:很多情況下,需要用常引用做形參,被引用對象等效于常對象,不能在函數(shù)中改變實參的值,這樣的好處是有較高的易讀性和較小的出錯率。voidmain(void)       int ival = 58;       void refFun(const int& xval);   

33、60;   refFun(ival);       cout << ival << endl; /不加const會返回59,加const會報錯!       return; voidrefFun(const int& xval)       xval = xval +1; /l-value specifies constobject報錯面試題45:簡述strcpy、sprintf與memcpy的區(qū)別三者主要有以下不同之處:(1)操作對象不同,strcpy的兩個操作對象均為字符串,sprintf的操作源對象可以是多種數(shù)據(jù)類型,目的操作對象是字符串,memcpy 的兩個對象就是兩個任意可操作的內(nèi)存地址,并不限于何種數(shù)據(jù)類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論