1. 首頁
  2. 筆試

IT公司筆試面試題系列

IT公司筆試面試題系列

C++筆試題

1.多型類中的虛擬函式表是Compile-Time,還是Run-Time時建立的?

答案:虛擬函式表是在編譯期就建立了,各個虛擬函式這時被組織成了一個虛擬函式的入口地址的陣列.而物件的隱藏成員--虛擬函式表指標是在執行期--也就是建構函式被呼叫時進行初始化的,這是實現多型的關鍵.

2.一個父類寫了一個virtual 函式,如果子類覆蓋它的函式不加virtual ,也能實現多型?

在子類的空間裡,有沒有父類的這個函式,或者父類的私有變數? (華為筆試題)

答案:只要基類在定義成員函式時已經聲明瞭virtue關鍵字,在派生類實現的時候覆蓋該函式時,virtue關鍵字可加可不加,不影響多型的實現。子類的空間裡有父類的所有變數(static除外)。

3.完成字串複製可以使用 sprintf、strcpy 及 memcpy 函式,請問這些函式有什麼區別,你喜歡使用哪個,為什麼?

答案:這些函式的區別在於實現功能以及操作物件不同。

1.strcpy 函式操作的物件是字串,完成從源字串到目的字串的複製功能。

2.snprintf 函式操作的物件不限於字串:雖然目的物件是字串,但是源物件可以是字串、也可以是任意基本型別的資料。這個函式主要用來實現(字串或基本資料型別)向字串的轉換功能。如果源物件是字串,並且指定 %s 格式符,也可實現字串複製功能。

3.memcpy 函式顧名思義就是記憶體複製,實現將一個記憶體塊的內容複製到另一個記憶體塊這一功能。記憶體塊由其首地址以及長度確定。程式中出現的`實體物件,不論是什麼型別,其最終表現就是在記憶體中佔據一席之地(一個記憶體區間或塊)。因此,memcpy 的操作物件不侷限於某一類資料型別,或者說可適用於任意資料型別,只要能給出物件的起始地址和記憶體長度資訊、並且物件具有可操作性即可。鑑於 memcpy 函式等長複製的特點以及資料型別代表的物理意義,memcpy 函式通常限於同種型別資料或物件之間的複製,其中當然也包括字串複製以及基本資料型別的複製。

對於字串複製來說,用上述三個函式都可以實現,但是其實現的效率和使用的方便程度不同:

1.strcpy 無疑是最合適的選擇:效率高且呼叫方便。

2.snprintf 要額外指定格式符並且進行格式轉化,麻煩且效率不高。

3.memcpy 雖然高效,但是需要額外提供複製的記憶體長度這一引數,易錯且使用不便;並且如果長度指定過大的話(最優長度是源字串長度 + 1),還會帶來效能的下降。其實 strcpy 函式一般是在內部呼叫 memcpy 函式或者用匯編直接實現的,以達到高效的目的。因此,使用 memcpy 和 strcpy 複製字串在效能上應該沒有什麼大的差別。