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

樓主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網絡

相關文章
相關標籤/搜索