資源描述:
《C++面試題匯總》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、C++知識點整理?空指針與野指針的區(qū)別:空指針也就是通常指向為NULL的指針,野指針就是指向一塊未知的內(nèi)存區(qū)域(可以是通過malloc或new申請空間后,釋放后沒有將指針置為空),也有可能定義了一個指針沒有初始化,由于內(nèi)存空間中的值在未賦值之前是隨機數(shù),所以也有可能誕生野指針。??malloc函數(shù)為C語言中的標準函數(shù),標準中規(guī)定:在分配內(nèi)存失敗時會返回“NULLPointer”空指針,而非為初始化的指針。C++在分配內(nèi)存失敗時會拋出BAD_ALLOC異常。野指針:指向垃圾內(nèi)存的指針,而非空指針。野指針產(chǎn)生原因:??1.聲明的指針未被初始化,
2、指針默認值隨機產(chǎn)生。創(chuàng)建指針應該將其初始化為NULL或者指向某一內(nèi)存。??2.free和delete掉的指針未重置為NULL,free后的指針仍指向該內(nèi)存,但該內(nèi)存已變?yōu)槔鴥?nèi)存。??另:空指針不指向任何實際的對象或函數(shù),反過來說對象或函數(shù)的指針也不可能為空指針。,auto是默認類型,每次調(diào)用sum函數(shù)時auto類型的變量重新賦值為0,static是靜態(tài)變量,如果在函數(shù)內(nèi)部進行定義,則只在第一次調(diào)用時進行賦初值,其作用范圍是sum函數(shù)內(nèi)部,在函數(shù)內(nèi)部可以改靜態(tài)變量的值;先說宏和函數(shù)的區(qū)別:1.宏做的是簡單的字符串替換(注意是字符串的替換,不
3、是其他類型參數(shù)的替換),而函數(shù)的參數(shù)的傳遞,參數(shù)是有數(shù)據(jù)類型的,可以是各種各樣的類型.2.宏的參數(shù)替換是不經(jīng)計算而直接處理的,而函數(shù)調(diào)用是將實參的值傳遞給形參,既然說是值,自然是計算得來的.3.宏在編譯之前進行,即先用宏體替換宏名,然后再編譯的,而函數(shù)顯然是編譯之后,在執(zhí)行時,才調(diào)用的.因此,宏占用的是編譯的時間,而函數(shù)占用的是執(zhí)行時的時間.4.宏的參數(shù)是不占內(nèi)存空間的,因為只是做字符串的替換,而函數(shù)調(diào)用時的參數(shù)傳遞則是具體變量之間的信息傳遞,形參作為函數(shù)的局部變量,顯然是占用內(nèi)存的.5.函數(shù)的調(diào)用是需要付出一定的時空開銷的,因為系統(tǒng)在調(diào)用
4、函數(shù)時,要保留現(xiàn)場,然后轉(zhuǎn)入被調(diào)用函數(shù)去執(zhí)行,調(diào)用完,再返回主調(diào)函數(shù),此時再恢復現(xiàn)場,這些操作,顯然在宏中是沒有的.內(nèi)聯(lián)函數(shù)與宏的區(qū)別:1.內(nèi)聯(lián)函數(shù)在運行時可調(diào)試,而宏定義不可以;2.編譯器會對內(nèi)聯(lián)函數(shù)的參數(shù)類型做安全檢查或自動類型轉(zhuǎn)換(同普通函數(shù)),而宏定義則不會;?3.內(nèi)聯(lián)函數(shù)可以訪問類的成員變量,宏定義則不能;?4.在類中聲明同時定義的成員函數(shù),自動轉(zhuǎn)化為內(nèi)聯(lián)函數(shù)。external作用之一:當它與“C”一起連用時,如:extern“C”voidfun(inta,intb);會告訴C++編譯器在編譯fun這個函數(shù)名是按著C的規(guī)則去翻譯相
5、應的函數(shù)名而不是C++的,C++的規(guī)則在翻譯這個函數(shù)名時會把fun這個名字變得面目全非。。?;卣{(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。????如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。????回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方法直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應回調(diào)函數(shù)不能是特定的類成員函數(shù)。因為類成員函數(shù)含有this指針。核心就是類成員函數(shù)需要this指針訪問函數(shù),而全局或者靜態(tài)函數(shù)不需要this指針。簡言之,類的成員函數(shù)需要隱
6、含的this指針?而回調(diào)函數(shù)沒有辦法提供。int**a[3][4],則變量占有的內(nèi)存空間為每個元素存放的都是二級指針,每個指針在32位系統(tǒng)下占4個字節(jié)的內(nèi)存,共3*4=12個元素,則共占內(nèi)存12*4=48字節(jié)C++中使用模板類的原因:(1)可用來創(chuàng)建動態(tài)增長和減小的數(shù)據(jù)結(jié)構(gòu);(2)它是類型無關的,因此具有很高的可利用性;(3)它在編譯時檢查數(shù)據(jù)類型,保證了類型安全;(4)它是平臺無關的,具有可移植性;(5)可用于基本數(shù)據(jù)類型。A.由于編譯后的名字不同,C++程序不能直接調(diào)用C函數(shù)B.extern"C"既可以修飾函數(shù)也可以修飾變量C.c++提
7、供關鍵字extern“C”,被extern"C"修飾的是按照C語言方式編譯和連接的它是ifnotdefine的簡寫,是宏定義的一種,實際上確切的說,這應該是預處理功能三種(宏定義、文件包含、條件編譯)中的一種----條件編譯。在c語言中,對同一個變量或者函數(shù)進行多次聲明是不會報錯的。所以如果h文件里只是進行了聲明工作,即使不使用#ifndef宏定義,多個c文件包含同一個h文件也不會報錯。但是在c++語言中,#ifdef的作用域只是在單個文件中。所以如果h文件里定義了全局變量,即使采用#ifdef宏定義,多個c文件包含同一個h文件還是會出現(xiàn)全
8、局變量重定義的錯誤。使用#ifndef可以避免下面這種錯誤:如果在h文件中定義了全局變量,一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現(xiàn)變量重復定義的錯誤;