古詩詞大全網 - 成語大全 - C++面試題匯總

C++面試題匯總

某個文件中定義的靜態全局變量(或稱靜態局部變量)作用域是------本文件內

①:默認繼承權限:

class的繼承按照private繼承處理,struct的繼承按照public繼承處理

②:成員的默認訪問權限

class的成員默認是private權限, struct默認是public權限

註:C++有內置的宏__cplusplus -------有個習慣帶“__”表示內部變量,只供內部使用;不帶雙下劃線的,表示外部接口的變量(標識符)

C++函數的三種傳遞方式為:值傳遞。指針傳遞 和 引用傳遞

註:值傳遞和指針傳遞,本質上就是指針傳遞。

在A類中fun1是虛函數;B類中fun2是虛函數。

①:機制上:c是面向過程的(c也可以是面向對象發的程序); C++是面向對象,提供了類。C++的面向對象的程序比c容易。

②:使用方向:c適合代碼體積小的,效率高的場合,如嵌入式;C++更適合上層的,復雜的;Linux核心大部分是c寫的,因為他是系統軟件,效率要求極高

③:C++是c的超集;

④:C語言是結構化編程語言,C++是面向對象編程語言。

⑤:C++側重於對象而不是過程,側重於類的設計而不是邏輯設計。

C中struct主要提供的是自定義類型,和構造壹種新的類型出來;

壹致的地方:

不壹致的地方:

C語言: 無Protection行為; 不能定義函數,但可以有函數指針;

C++: 有Procetion行為,默認是private; 可以定義函數。

註: 就是訪問權限,struct對於外部是完全訪問的,C++是有訪問 權限 設置的;

正確, sizeof 是編譯時運算符,編譯時就確定了 可以看成是和及其有關的常量

註:定義數組的時候,數組的長度必須是壹個確定的常量;

形參:是在定義函數時指定的參數,在未調用時他們並不占用內存中的存儲單元。只有在調用的時候才會被分配內存,調用結束後,形參所占用的內存單元會被釋放

實參:即妳調用函數時傳遞的參數;

重載: 同壹個名字空間--- -函數名相同,參數列表不同 ; 註釋:理解成壹個類裏面的多個同名函數

重寫/覆蓋: 不同名字空間-----用於繼承,子類重新定義父類中 函數名相同,參數列表也相同 虛函數 的方法

重定義/隱藏:重定義(隱藏)是指派生類的函數屏蔽了與其同名的基類函數,規則如下:

a 如果派生類的函數和基類的 函數同名,但是參數不同 ,此時,不管有無virtual,基類的函數被隱藏。

b 如果派生類的函數與基類 的函數同名,並且參數也相同 ,但是基類函數沒有vitual關鍵字,此時,基類的函數被隱藏。

①: 隱藏 實現 細節 ,使得代碼能夠模塊化;擴展代碼模塊, 實現代碼重寫

②: 接口重用 :為了使用多個派生類中某個派生類的屬性正確調用

用sizeof的方法:

定義壹個指針P,打印出sizeof(P),如果結果是4,怎麽標識改操作系統是32位,如果打印結果是2,則標識是16位、。

虛函數 ,是在 編譯 期就建立了。各個虛函數被組織成壹個虛函數的入口地址的數組(簡而言之,就是組成了壹個存放虛函數地址的數組)

虛函數表 指針 是在 運行 時建立的,也就是構造函數被調用時進行初始化的。

封裝,繼承,多態 是什麽?怎那麽用?為什麽使用它?

封裝:將客觀事物抽象成類,每個類對自身的 數據 方法 實行 protection ; 註釋 : 保護內部成員

繼承:廣義的繼承有三種實現形式:

實現繼承:指使用基類的屬性和方法,而無需額外編碼的能力;

可視繼承:子窗體使用父窗體的外觀和實現代碼

接口繼承:僅使用屬性和方法,實現之後到子類實現

前兩種和後壹種構成了功能復用的兩種方法

多態: 主要是為了抽象

只要是函數都會做類型檢查。

這是內聯函數跟宏觀比的優勢。

①:靜態存儲區域分配; 內存在編譯的時候就已經分配好了,這塊內存在程序的整個運行期間都存在。例如全局變量。

②:在展區創建;在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時,自動被釋放。效率高,但是內存容量有限。

③:從堆上分配:或者叫:動態內存分配。程序員自己負責在何時用free或delete釋放內存。

C語言中用帶參數的宏定義,C++中用inline

生命周期不同 空間 周期

局部變量 函數調用時創建,結束時銷毀。static除外

局部變量不具有外部鏈接,全局變量

全局變量 靜態數據區

局部變量: 放在棧區

malloc、free是C++/C語言標準庫,new、delete是C++運算符。

註意:new、delete不是庫函數;

malloc/free 無法 滿足 對象在創建的時候要自動 執行 構造函 數,對象消亡之前要自動執行 析構函數 。他們是庫函數,而不是運算符,不在編譯器的控制權限內,。

new、delete 能完成內存的分配和釋放,已經初始化和清理工作。

判斷指針是否為空,如果空,則打印錯誤log,並且return,終止本函數。

不是,兩個不同類型的指針可以強制轉換。

動態申請;

知道運行時才知道壹個對象需要多少存儲空間,不需要知道對象的生存周期有多長。

Debug調試版本,它包含調試信息,比如assert的適用,並且不作任何優化,便於程序員調試程序。

Release稱為發布版本,他往往時進行了各種優化,

析構函數時特殊的類成員函數,沒有返回類型,沒有參數,不能隨意調用,也沒有重載,只有在類對象的生命周期結束時,有系統自己調用。優勢方內存空間的作用。

虛函數是C++多態的壹種表現,使用虛函數,我們可以靈活的進行動態綁定,當然是以壹定的開銷為代價

(這裏虛函數的適用還是不太懂,需要進壹步學習,比如怎麽調用子類的壹切啊)

導致文件描述符結構中指針指向的內存背重復釋放,進而導致壹些不可預期的異常。

比如全局變量的初始化,就不是有main函數引起的。例如:

全局對象的構造函數,會在main函數之前執行。

多態,純虛函數,抽象類

內聯函數

虛函數的特點:如果希望派生類能夠重新定義基類的方法,則在基類中將該方法定義為虛方法,這樣可以啟用動態聯編。

內聯函數的特點:使用內聯函數的目的屎我了提高函數的運行俠侶。內聯函數的代碼不能過長,因為內聯函數省去調用函數的時間是以代碼膨脹為代價的。內聯函數不能包含循環語句。因為執行循環語句要比調用函數的開銷大。

函數模板的實例化是由編譯程序在處理函數嗲用時自動完成的,

類模板的實例化必須由程序員在程序中顯示的指定

函數名和參數列表

不能被重載的運算符:

①:不能改變C++內部數據類型(如int float 等)的運算符

②:不能重載“.”,因為.在類中對任何成員都有意義,已經成為標準用法

③:不能重載目前C++運算符集合中沒有的符號,如:@, 等。願意:壹是難以理解,二是無法確定優先級

④:對已經存在的運算符重載不能改變優先級規則,否則將引起混亂。

有可能是派生類無法調用析構函數

模板可以說比較古老了,但是當前的泛型編程實質上就是模板編程。他體現了壹種通用和泛化的思想。

STL有7中容器:

vector(零食進行存儲數據的訪問),list(經常進行數據的增刪改查),deque(隊列結構),map,multimap,set(構造棧形的數據使用),multiset.

容器是壹種特定用途的類;

淺拷貝 知識拷貝了指針沒有拷貝資源

深拷貝進行了資源的拷貝

三元表達式“?:”問好後面的兩個操作數必須為同壹個類型。否則會出問題。

總的來說,堆是C語言和操作系統的術語,是操作系統維護的壹塊動態分配內存;自由存儲是C++中通過 new與delete動態分配和釋放對象的抽象概念。 他們並不是完全壹樣。

從技術上來說,堆(heap)是C語言和操作系統的術語。堆是操作系統所維護的壹塊特殊內存,它提供了動態分配的功能,當運行程序調用malloc()時就會從中分配,稍後調用free可把內存交還。而自由存儲是C++中通過new和delete動態分配和釋放對象的抽象概念,通過new來申請的內存區域可稱為自由存儲區。基本上,所有的C++編譯器默認使用堆來實現自由存儲,也即是缺省的全局運算符new和delete也許會按照malloc和free的方式來被實現,這時藉由new運算符分配的對象,說它在堆上也對,說它在自由存儲區上也正確。

程序編譯的過程中就是將用戶的文本形式的源代碼(c/c++)轉化成計算機可以直接執行的機器代碼的過程。主要經過四個過程:預處理、編譯、匯編和鏈接。具體示例如下。

壹個hello.c的c語言程序如下。

其編譯過程如下: