BAT 某廠C++面經+口頭offer | 掘金技術徵文

fm_199n發表於2018-03-31
樓主8號內推,29號面完所有流程,一二面隔的時間有點遠了,有些問題記不太清,這裡把能想到的都寫下來吧。

一面(1小時):


前面10分鐘簡單聊了下研究方向。後面全程C++。
Q:主要語言是C++是吧,那我們先來考察一下C++的基礎。
A: 好的。


Q:C++裡是怎麼定義常量的?常量存放在記憶體的哪個位置?
A:常量在C++裡的定義就是一個top-level const加上物件型別,常量定義必須初始化。對於區域性物件,常量存放在棧區,對於全域性物件,常量存放在全域性/靜態儲存區。對於字面值常量,常量存放在常量儲存區。


Q:你剛剛說到了const,const修飾成員函式的目的是什麼?
A:const修飾的成員函式表明函式呼叫不會對物件做出任何更改,事實上,如果確認不會對物件做更改,就應該為函式加上const限定,這樣無論const物件還是普通物件都可以呼叫該函式。


Q:那如果同時定義了兩個函式,一個帶const,一個不帶,會有問題嗎?
A:不會,這相當於函式的過載。


Q:C++ 類內可以定義引用資料成員嗎?
A:可以,必須通過成員函式初始化列表初始化。


Q:new/delete與malloc/free的區別是什麼?
A:首先,new/delete是C++的關鍵字,而malloc/free是C語言的庫函式,後者使用必須指明申請記憶體空間的大小,對於類型別的物件,後者不會呼叫建構函式和解構函式。


Q:你部落格裡提到了隱式型別轉換,能簡單說說嗎?
A:首先,對於內建型別,低精度的變數給高精度變數賦值會發生隱式型別轉換,其次,對於只存在單個引數的建構函式的物件構造來說,函式呼叫可以直接使用該引數傳入,編譯器會自動呼叫其建構函式生成臨時物件。


Q:如何避免?
A:explicit關鍵字。


Q:說說你瞭解的型別轉換。
A:C++型別轉換有四種。(這四種請大家自己去查)


Q:說說reinterpret_cast.
A: 這種是不常用的,可以用於任意型別的指標之間的轉換,對轉換的結果不做任何保證,可能被用於雜湊(此處不確定)。


Q:說說dynamic_cast
A: 這種其實也是不被推薦使用的,更多使用static_cast,dynamic本身只能用於存在虛擬函式的父子關係的強制型別轉換,對於指標,轉換失敗則返回nullptr,對於引用,轉換失敗會丟擲異常。


Q:說說const_cast
A:事實上的用途還是很普遍的。對於未定義const版本的成員函式,我們通常需要使用const_cast來去除const引用物件的const,完成函式呼叫。另外一種使用方式,結合static_cast,可以在非const版本的成員函式內新增const,呼叫完const版本的成員函式後,再使用const_cast去除const限定。


Q:說說你瞭解的RTTI.
A:執行時型別檢查,在C++層面主要體現在dynamic_cast和typeid.


Q:具體是怎麼實現的。
A:VS中虛擬函式表的-1位置存放了指向type_info的指標。對於存在虛擬函式的型別,typeid和dynamic_cast都會去查詢type_info.


Q:你剛剛提到虛擬函式表,具體是怎樣實現執行時多型的。
A:簡單來講,子類若重寫父類虛擬函式,虛擬函式表中,該函式的地址會被替換,對於存在虛擬函式的類的物件,在VS中,物件的物件模型的頭部存放指向虛擬函式表的指標,通過該機制實現多型。


Q:C++函式棧空間的最大值 ?
A:預設是1M,不過可以調整。


Q:extern “C” ?
A:C++呼叫C函式需要extern C,因為C語言沒有函式過載。


Q:設計模式瞭解嗎,介紹一下單例模式。
A:C++的實現有兩種,一種通過區域性靜態變數,利用其只初始化一次的特點,返回物件。另外一種,則是定義全域性的指標,getInstance判斷該指標是否為空,為空時才例項化物件。


Q:你說的第二種就是所謂的懶載入。現在有一個問題,如果併發訪問,該怎麼做。
A:使用鎖機制,防止多次訪問。


Q:你的鎖是鎖住所有的程式碼嗎?
A:是。


Q:這樣會多次重複判斷是否為空,而每次都會加鎖,有什麼辦法改善?
A:可以這樣,第一次判斷為空不加鎖,若為空,再進行加鎖判斷是否為空,若為空則生成物件。


Q:你提到了鎖機制,那麼C++的鎖你知道幾種。
A:鎖包括互斥鎖,條件變數,自旋鎖和讀寫鎖(後兩個沒答出來)。


Q:說一說你用到的。
A:生產者消費者問題利用互斥鎖和條件變數可以很容易解決,條件變數這裡起到了替代訊號量的作用。balabala。


Q:C++兩種map。
A:unordered_map(雜湊表)和map(紅黑樹)。


Q:紅黑樹瞭解嗎?
A:只知道本質是一顆BST,插入O(logN)。


Q: 快排的時間複雜度最差是多少?
A:O(N2)


Q:什麼時候最差?
A:樞紐元左側元素都比樞紐元小(不確定)。


Q:穩定排序哪幾種?為什麼?
A:查課本吧,很簡單。


Q:聊聊計算機網路的內容吧,TCP三次握手是怎樣的?
A:這部分大家參考相關課本。


Q:為什麼兩次不可以?
A:伺服器端未收到客戶端的連線確認,因此必須三次。


Q:四次呢?
A:連線確認後第三次的握手已經包含了客戶端資料,不需要四次。


Q:TCP擁塞瞭解嗎。
A:沒看。(直接跳過了這部分)。


Q:死鎖產生的必要條件?
A: 四個必要條件。


Q:如何預防?
A:-請查書。


Q:最後幾個問題,你平時如何提升自己的,在語言方面?
A:一些經典的書籍,會認真去看,同時,也會看一些對語言新特性介紹的書籍,保持敏感。


Q:分別有哪些書?
A:C++ primer,經典的入門書,深入探索C++物件模型,幫助我很好的理解C++的物件模型。effective C++,經典的關於C++進階的使用經驗。effective modern C++:關於C++11/14新特性的深入探討。


Q:說說C++primer中你覺得感受最深刻的內容。
A:這本書是入門必讀,我感覺印象最深刻的就是C++ 11的新特性,比如自動型別推導,lambda,右值引用(這裡被打斷了)。


Q:現在在看哪些書?
A:正在看的是STL原始碼剖析。


Q:我的問題問完了,你有什麼要問我的嗎?
A:對我的面試評價。(C++掌握程度很深)

一面確實太久遠了,可能有些東西想不起來。當時全程基本都是C++的內容,稍微穿插了別的領域的問題。

二面:二面非常戲劇性,對大多數人不適用,全程跟面試官討論了做的研究,面試時間15分鐘結束。


三面(3.26):
首先就是問研究方向,扯了10分鐘,然後C++。
問題1:
Q:C語言是怎麼進行函式呼叫的?
A:每一個函式呼叫都會分配函式棧,在棧內進行函式執行過程。
Q:接著:C語言引數壓棧順序?
A:從右到左
Q:再來:C語言如何處理返回值?
A:C語言不知道,C++會生成一個臨時變數,把它的引用作為函式引數傳入函式內。

問題2:

Q:C++如何處理記憶體洩漏?
A:緊張地瞎說了一堆,提醒大家,不會的直接說不會。

問題3:
C++ 如何處理程式異常?
A:檢視對應的報錯程式碼,根據程式碼定位具體問題。(瞎扯)

問題4:

Q:工廠模式?優點?

A:優點就是解耦,程式碼複用,更改功能容易。


HR(3.29):HR面避免踩坑,主要是一些性格上的問題要小心,其它沒什麼。
OFFER確認(3.30):跟領導討論實習的工作內容和實習時間。
具體就是這些。樓主準備的內容大都是C++以及演算法,但最後面試的過程是基本沒有問到演算法,語言和研究經歷佔了很大一部分,總結就是一定要有自己特別擅長的一個方面去打動你的面試官。 

掘金技術徵文連結? https://juejin.im/post/5aaf2a95f265da239b413aa1


相關文章