C C 的面試題

2021-07-25 06:00:02 字數 3475 閱讀 6774

1.new、

delete

、malloc

、free關係

它們都可用於申請動態記憶體和釋放記憶體。

malloc

與free

是c++/c

語言的標準庫函式,

new/delete

是c++

的運算子(關鍵字)。注意

new/delete

不是庫函式。

對於非內部資料型別的物件而言,光用

maloc/free

無法滿足動態物件的要求。

物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。

由於

malloc/free

是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加   於

malloc/free

因此

c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子

new,以及乙個能完成清理與釋放記憶體工作的運算   符

delete

delete與n

ew配套,

delete 

與new 

配套

delete

只會呼叫一次析構函式,而

delete

會呼叫每乙個成員的析構函式。

delete

操作符用於陣列時,它為每個陣列元素呼叫析構函式,然後呼叫

operator

delete來釋放記憶體。

memtest

*mtest1=new

memtest[10];

memtest

*mtest2=new

memtest;

int*pint1=new

int[10];

int*pint2=new

int;

deletepint1; //-1-

deletepint2; //-2-

deletemtest1;//-3-

deletemtest2;//-4-

在-4-

處報錯。

這就說明:對於內建簡單資料型別,delete

和delete

功能是相同的。對於自定義的複雜資料型別,

delete

和delete

不能互用。

delete

刪除乙個陣列,

delete

刪除乙個指標。簡單來說,用

new分配的記憶體用

delete

刪除;用

new分配的記憶體用

delete

刪除。delete

會呼叫陣列元素的析構函式。內部資料型別沒有析構函式,所以問題不大。如果你在用

delete

時沒用括號,

delete

就會認為指向的是單個物件,否則,它就會認為指向的是乙個陣列。

封裝,繼承和多型。

析構函式呼叫的次序是先派生類的析構後基類的析構,也就是說在基類的的析構呼叫的時候,

派生類的資訊已經全部銷毀了

。定義乙個物件時先呼叫基類的建構函式、然後呼叫派生類的建構函式;析構的時候恰好相反:先呼叫派生類的析構函式、然後呼叫基類的析構函式

多型:是對於不同物件接收相同訊息時產生不同的動作。c++

的多型性具體體現在執行和編譯兩個方面:在程式執行時的多型性通過繼承和虛函式來體現;

在程式編譯時多型性體現在函式和運算子的過載上;

虛函式:在基類中冠以關鍵字 virtual 

的成員函式。 它提供了一種介面介面。允許在派生類中對基類的虛函式重新定義。

純虛函式的作用:在基類中為其派生類保留乙個函式的名字,以便派生類根據需要對它進行定義。作為介面而存在 純虛函式不具備函式的功能,一般不能直接被呼叫。

從基類繼承來的純虛函式,在派生類中仍是虛函式。如果乙個類中至少有乙個純虛函式,那麼這個類被稱為抽象類(abstract class

)。

抽象類中不僅包括純虛函式,也可包括虛函式。抽象類必須用作派生其他類的基類,而不能用於直接建立物件例項。但仍可使用指向抽象類的指標支援執行時多型性。

(1). 結構和聯合都是由多個不同的資料型別成員組成

, 但在任何同一時刻

, 聯合中只存放了乙個被選中的成員(所有成員共用一塊位址空間)

, 而結構的所有成員都存在(不同成員的存放位址不同)。

(2). 對於聯合的不同成員賦值

, 將會對其它成員重寫

, 原來成員的值就不存在了

, 而對於結構的不同成員賦值是互不影響的。

1) 引用必須被初始化,指標不必。

2) 引用初始化以後不能被改變,指標可以改變所指的物件。

3) 不存在指向空值的引用,但是存在指向空值的指標

一、從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數。

二、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

三、從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

生命週期不同:

全域性變數隨主程式建立和建立,隨主程式銷毀而銷毀;區域性變數在區域性函式內部,甚至區域性迴圈體等內部存在,退出就不存在;

使用方式不同:通過宣告後全域性變數程式的各個部分都可以用到;區域性變數只能在區域性使用;分配在棧區。 

作業系統和編譯器通過記憶體分配的位置來知道的,全域性變數分配在全域性資料段並且在程式開始執行的時候被載入。區域性變數則分配在堆疊裡面 。

經典C C 面試題

1.介紹一下stl,詳細說明stl如何實現vector。answer stl 標準模版庫,standard template library 它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序等一系列的演算法 除錯程式時更加安全和方便 即使是人們用stl在uni...

經典C C 面試題

1.介紹一下stl,詳細說明stl如何實現vector。answer stl 標準模版庫,standard template library 它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序等一系列的演算法 除錯程式時更加安全和方便 即使是人們用stl在uni...

C C 面試題(四)

寫乙個函式返回1 2 3 n的值 假定結果不會超過長整型變數的範圍 int sum int n 剖析 對於這個題,只能說,也許最簡單的答案就是最好的答案。下面的解答,或者基於下面的解答思路去優化,不管怎麼 折騰 其效率也不可能與直接return 1 l n n 2相比!2,3,4一起解答 void ...