常見C++筆試面試題整理

常見C++筆試面試題整理

常見C++筆試面試題整理


資料來源: https://mp.weixin.qq.com/s/hONnHSkR8Qk4doIK0aYHiQ


C和C++的區別

1)C是面向過程的語言,是一個結構化的語言,考慮如何通過一個過程對輸入進行處理得到輸出;C++是面向對象的語言,主要特徵是“封裝、繼承和多態”。封裝隱藏了實現細節,使得代碼模塊化;派生類可以繼承父類的數據和方法,擴展了已經存在的模塊,實現了代碼重用;多態則是“一個接口,多種實現”,通過派生類重寫父類的虛函數,實現了接口的重用。

2)C和C++動態管理內存的方法不一樣,C是使用malloc/free,而C++除此之外還有new/delete關鍵字。

3)C++支持函數重載,C不支持函數重載

4)C++中有引用,C中不存在引用的概念


C++中指針和引用的區別

1)指針是一個新的變量,存儲了另一個變量的地址,我們可以通過訪問這個地址來修改另一個變量;

引用只是一個別名,還是變量本身,對引用的任何操作就是對變量本身進行操作,以達到修改變量的目的

2)引用只有一級,而指針可以有多級

3)指針傳參的時候,還是值傳遞,指針本身的值不可以修改,需要通過解引用才能對指向的對象進行操作

引用傳參的時候,傳進來的就是變量本身,因此變量可以被修改


結構體struct和共同體union(聯合)的區別

結構體:將不同類型的數據組合成一個整體,是自定義類型

共同體:不同類型的幾個變量共同佔用一段內存

1)結構體中的每個成員都有自己獨立的地址,它們是同時存在的;

共同體中的所有成員佔用同一段內存,它們不能同時存在;

2)sizeof(struct)是內存對齊後所有成員長度的總和,sizeof(union)是內存對齊後最長數據成員的長度


#define和const的區別

1)#define定義的常量沒有類型,所給出的是一個立即數;const定義的常量有類型名字,存放在靜態區域

2)處理階段不同,#define定義的宏變量在預處理時進行替換,可能有多個拷貝,const所定義的變量在編譯時確定其值,只有一個拷貝。

3)#define定義的常量是不可以用指針去指向,const定義的常量可以用指針去指向該常量的地址

4)#define可以定義簡單的函數,const不可以定義函數


重載overload,覆蓋(重寫)override,隱藏(重定義)overwrite,這三者之間的區別

1)overload,將語義相近的幾個函數用同一個名字表示,但是參數列表(參數的類型,個數,順序不同)不同,這就是函數重載,返回值類型可以不同

特徵:相同範圍(同一個類中)、函數名字相同、參數不同、virtual關鍵字可有可無

2)override,派生類覆蓋基類的虛函數,實現接口的重用,返回值類型必須相同

特徵:不同範圍(基類和派生類)、函數名字相同、參數相同、基類中必須有virtual關鍵字(必須是虛函數)

3)overwrite,派生類屏蔽了其同名的基類函數,返回值類型可以不同

特徵:不同範圍(基類和派生類)、函數名字相同、參數不同或者參數相同且無virtual關鍵字


new、delete、malloc、free之間的關係

new/delete,malloc/free都是動態分配內存的方式

1)malloc對開闢的空間大小嚴格指定,而new只需要對象名

2)new為對象分配空間時,調用對象的構造函數,delete調用對象的析構函數

既然有了malloc/free,C++中為什麼還需要new/delete呢?

運算符是語言自身的特性,有固定的語義,編譯器知道意味著什麼,由編譯器解釋語義,生成相應的代碼。

庫函數是依賴於庫的,一定程度上獨立於語言的。編譯器不關心庫函數的作用,只保證編譯,調用函數參數和返回值符合語法,生成call函數的代碼。

malloc/free是庫函數,new/delete是C++運算符。對於非內部數據類型而言,光用malloc/free無法滿足動態對像都要求。new/delete是運算符,編譯器保證調用構造和析構函數對對象進行初始化/析構。但是庫函數malloc/free是庫函數,不會執行構造/析構。


delete和delete[]的區別

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

用new分配的內存用delete釋放,用new[]分配的內存用delete[]釋放


堆和棧的區別

1)棧stack 存放函數的參數值、局部變量,由編譯器自動分配釋放

堆heap,是由new分配的內存塊,由應用程序控制,需要程序員手動利用delete釋放,如果沒有,程序結束後,操作系統自動回收

2)因為堆的分配需要使用頻繁的new/delete,造成內存空間的不連續,會有大量的碎片

3)堆的生長空間向上,地址越大,棧的生長空間向下,地址越小

關鍵字static的作用

1)函數體內:static修飾的局部變量作用範圍為該函數體,不同於auto變量,其內存只被分配一次,因此其值在下次調用的時候維持了上次的值

2)模塊內:static修飾全局變量或全局函數,可以被模塊內的所有函數訪問,但是不能被模塊外的其他函數訪問,使用範圍限制在聲明它的模塊內

3)類中:修飾成員變量,表示該變量屬於整個類所有,對類的所有對像只有一份拷貝

4)類中:修飾成員函數,表示該函數屬於整個類所有,不接受this指針,只能訪問類中的static成員變量

注意和const的區別!!!const強調值不能被修改,而static強調唯一的拷貝,對所有類的對象

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *