C++面試中考官隨意問到的比較問題

 在一些面試中,還有當你投簡歷時考官可能問到一些比較簡單,但容易出錯的問題,給人的第一印象。下面有總結了一些關於區別的問題 
1
請說出const#define 相比,有何優點?
答案:1 const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對後者只進行字符替換,沒有類型安全檢查,並且在字符替換可能會產生意料不到的錯誤。
      2
有些集成化的調試工具可以對const 常量進行調試,但是不能對宏常量進行調試。

2.
inline函數和用macro定義的函數之間有什麼區別?
答案:由於inline函數具有內部鏈接,因此數個文件定義相同名字的內聯函數不會發生衝突,而類函數宏就不行,會產生重複定義。      
  inline
函數是真正的函數,可以由語句組成;但類函數宏所作的只是替換,不是真正的函數,當然也不能有語句。
macro
定義    
 
只是很初級的一種代換,實現的功能很單一而且安全性很差,比如類型錯誤、括號漏寫都會造成很大的錯誤, 而且錯誤不容易被發現,隱患很大。    
  inline
函數     
內聯函數要比前者好很多功能也要全面很多!最主要的是:內聯函數能夠進行安全檢查(比如參數類型 等)  

3. 簡述數組與指針的區別?
答案:數組要麼在靜態存儲區被創建(如全局數組),要麼在棧上被創建。指針可以隨時指向任意類型的內存塊。
(1)
修改內容上的差別
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; //
注意p 指向常量字符串
p[0] = ‘X’; //
編譯器不能發現該錯誤,運行時錯誤
(2)
用運算符sizeof 可以計算出數組的容量(字節數)。sizeof(p),p 爲指針得到的是一個指針變量的字節數,而不是p 所指的內存容量C++/C 語言沒有辦法知道指針所指的內存容量,除非在申請內存時記住它。注意當數組作爲函數的參數進行傳遞時,該數組自動退化爲同類型的指針。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12
字節
cout<< sizeof(p) << endl; // 4
字節
計算數組和指針的內存容量
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4
字節而不是100 字節
}

 
4. 重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區別?
常考的題目。從定義上來說:
重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
重寫:是指子類重新定義復類虛函數的方法。
從實現原理上來說:
重載:編譯器根據函數不同的參數表,對同名函數的名稱做修飾,然後這些同名函數就成了不同的函數(至少對於編譯器來說是這樣的)。如,有兩個同名函數:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函數名稱可能是這樣的:int_func、str_func。對於這兩個函數的調用,在編譯器間就已經確定了,是靜態的。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態無關
重寫:和多態真正相關。當子類重新定義了父類的虛函數後,父類指針根據賦給它的不同的子類指針,動態的調用屬於子類的該函數,這樣的函數調用在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。因此,這樣的函數地址是在運行期綁定的(晚綁定)。
   
       5. New delete 
malloc free 的聯繫與區別?
答案:都是在堆(heap)上進行動態的內存操作。用malloc函數需要指定內存分配的字節數並且不能初始化對象,new 會自動調用對象的構造函數。delete 會調用對象的destructor,而free 不會調用對象的destructor.

    6.
struct 和 class 的區別
答案:struct 的成員默認是公有的,而類的成員默認是私有的。struct 和 class 在其他方面是功能相當的。 
從感情上講,大多數的開發者感到類和結構有很大的差別。感覺上結構僅僅象一堆缺乏封裝和功能的開放的內存位,而類就象活的並且可靠的社會成員,它有智能服務,有牢固的封裝屏障和一個良好定義的接口。既然大多數人都這麼認爲,那麼只有在你的類有很少的方法並且有公有數據(這種事情在良好設計的系統中是存在的!)時,你也許應該使用 struct 關鍵字,否則,你應該使用 class 關鍵字。

    7
結構與聯合有和區別?
答案:1).結構和聯合都是由多個不同的數據類型成員組成,但在任何同一時刻,聯合中只存放了一個被選中的成員(所有成員共用一塊地址空間),而結構的所有成員都存在(不同成員的存放地址不同)。
2).對於聯合的不同成員賦值,將會對其它成員重寫,原來成員的值就不存在了,而對於結構的不同成員賦值是互不影響的。

8
i nclude 與#i nclude "file.h"的區別?
答:前者是從Standard Library的路徑尋找和引用file.h,而後者是從當前工作路徑搜尋並引用file.h
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章