面試經驗(1)

今天去了騰訊面試,面試的是兩個師兄,感覺很和藹,環境也很隨和,但是自己的表現並不是特別的完美,面試官好像並不是特別滿意。爲了積累經驗,以後能做到更好,在這裏把問題記錄下來,爲以後做準備。

1、求逆序數對(使用歸併排序)

2、單鏈表翻轉(原有鏈表)

3、引用與指針區別

4、虛函數表
只要我們在類中定義了virtual函數,那麼我們在定義對象的時候,C++編譯器會在對象中存儲一個vptr指針,類中創建的虛函數的地址會存放在一個虛函數表中,vptr指針就是指針這個表的首地址。
這裏寫圖片描述
       

  在發生多態的地方,也就上面的,編譯器根本不會去區分,傳進來的是子類對象還是父類對象。而是關心print()是否爲虛函數,如果是虛函數,就根據不同對象的vptr指針找屬於自己的函數。而且父類對象和子類對象都會有vptr指針,傳入對象不同,編譯器會根據vptr指針,到屬於自己虛函數表中找自己的函數。即:vptr—>虛函數表——>函數的入口地址,從而實現了遲綁定(在運行的時候,纔會去判斷)。

  如果不是虛函數,那麼這種綁定關係在編譯的時候就已經確定的,也就是靜態聯編!

  這裏,關於虛函數表要說明兩點:

  說明1:通過虛函數表指針VPTR調用重寫函數是在程序運行時進行的,因此需要通過尋址操作才能確定真正應該調用的函數。而普通成員函數是在編譯時就確定了調用的函數。在效率上,虛函數的效率要低很多。

  說明2:出於效率考慮,沒有必要將所有成員函數都聲明爲虛函數

  說明3 :C++編譯器,執行play函數,不需要區分是子類對象還是父類對象

  最後,我們來總結一下多態的實現原理:   
當類中聲明虛函數時,編譯器會在類中生成一個虛函數表
虛函數表是一個存儲類成員函數指針的數據結構
虛函數表是由編譯器自動生成與維護的,virtual成員函數會被編譯器放入虛函數表中

5、static函數與普通函數的區別
用static修飾的函數,本限定在本源碼文件中,不能被本源碼文件以外的代碼文件調用。而普通的函數,默認是extern的,也就是說,可以被其它代碼文件調用該函數。
  在函數的返回類型前加上關鍵字static,函數就被定義成爲靜態函數。普通 函數的定義和聲明默認情況下是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其他文件所用。因此定義靜態函數有以下好處:
<1> 其他文件中可以定義相同名字的函數,不會發生衝突。
<2> 靜態函數不能被其他文件所用。

6、如何防止頭文件被include多次
一種是#ifndef方式,一種是#pragma once方式

7、進程間的通信方式

http://blog.csdn.net/wh_sjc/article/details/70283843

8、unordered_map的實現方式
unordered_map內部實現了一個哈希表,因此其元素的排列順序是雜亂的,無序的

9、vector容器如何釋放內存
swap()

10、tcp4次揮手中爲什麼要等待2MSL

http://blog.csdn.net/whuslei/article/details/6667471

11、socket套接字的通信流程

http://blog.csdn.net/dzw19911024/article/details/51321655

12、c++四種強制類型轉換

https://www.cnblogs.com/Allen-rg/p/6999360.html

13、從瀏覽器打開一個頁面的流程
a、根據域名訪問本地DNS緩存查找ip地址,本地沒有請求DNS服務
b、查找到ip地址後三次握手建立tcp連接
c、發起http請求,得到html、css等進行渲染加載頁面

14、c++內存泄漏的可能情況
a、new,delete不匹配
b、多態情況下沒有虛析構函數
c、缺少拷貝構造函數,造成淺拷貝,兩次釋放內存導致堆的崩潰

15、c++11auto關鍵字

https://www.cnblogs.com/QG-whz/p/4951177.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章