C++常見面試題(轉)


轉載於:
c++常見面試題30道
常見C++筆試面試題整理

1.new、delete、malloc、free關系

new會調用構造函數,delete會調用析構函數,和new對應free只會釋放對象本身內存。

malloc與free是C++/C語言的標准庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存。

對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。

由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。

因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。

2.delete與 delete []區別

delete只會調用一次析構函數,而delete[]會調用每一個成員的析構函數。

在More Effective C++中有更為詳細的解釋:“當delete操作符用於數組時,它為每個數組元素調用析構函數,然后調用operator delete來釋放內存。”delete與new配套,delete []與new []配套

例如:

MemTest *mTest1 = new MemTest[10];
MemTest *mTest2 = new MemTest;
int *pInt1 = new int [10];
int *pInt2 = new int;

delete[] pInt1;  //-1-
delete[] pInt2;  //-2-
delete[] mTest1; //-3-
delete[] mTest2; //-4-

在-4-處報錯。這就說明:

對於內建簡單數據類型,delete和delete[]功能是相同的。對於自定義的復雜數據類型,delete和delete[]不能互用。delete[]刪除一個數組,delete刪除一個指針。

簡單來說,用new分配的內存用delete刪除;用new[]分配的內存用delete[]刪除。delete[]會調用數組元素的析構函數。內部數據類型沒有析構函數,所以問題不大。如果你在用delete時沒用括號,delete就會認為指向的是單個對象,否則,它就會認為指向的是一個數組。

3.子類析構時要調用父類的析構函數嗎?

析構函數調用的次序是先派生類的析構后基類的析構,也就是說在基類的的析構調用的時候,派生類的信息已經全部銷毀了。

定義一個對象時先調用基類的構造函數、然后調用派生類的構造函數;析構的時候恰好相反:先調用派生類的析構函數、然后調用基類的析構函數。

4.多態,虛函數,純虛函數

多態:是對於不同對象接收相同消息時產生不同的動作。C++的多態性具體體現在運行和編譯兩個方面:

在程序運行時的多態性通過繼承和虛函數來體現;

在程序編譯時多態性體現在函數和運算符的重載上;

虛函數:在基類中冠以關鍵字 virtual 的成員函數。 它提供了一種接口界面。允許在派生類中對基類的虛函數重新定義。

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

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

抽象類中不僅包括純虛函數,也可包括虛函數。抽象類必須用作派生其他類的基類,而不能用於直接創建對象實例。但仍可使用指向抽象類的指針支持運行時多態性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM