C++面試題整理 2

robot2017發表於2024-09-17

8. C++11新特性又哪些

自動型別推導auto,智慧指指標(share_ptr,unique_ptr等),for迴圈簡化,執行緒相關的(std::thread/std::mutex),空指標nullptr,lambda表示式,等等

9. share_ptr是執行緒安全的嗎

share_ptr裡包含引用計數和資料指標,引用計數是原子操作,執行緒安全的,但是改變資料指標的指向,後導致引用技術加減,並不是執行緒安全的。設想當一個share_ptr的引用計數為1,這時兩個執行緒同時對它賦值,改變其資料指向,則會引起引用計數減小2次,引起crash。

10. 執行緒間同步有哪些方法

主要有鎖/臨界區(lock/mutex),條件變數(condition variable)和future。

  • std::unique_lock<std::mutex>或 std::lock_guard<std::mutex>可以保證一次只有一個執行緒訪問臨界區
  • std::condition_variable 可以透過wait方法阻塞執行緒,另一個執行緒可以透過Notify方法進行通知
  • std::future配合std::async使用,可以非同步開啟執行緒,並儲存返回結果,另一執行緒透過future的wait或get方法可以阻塞執行緒,直至結果返回。

參考資料:

  1. C++11 執行緒同步介面std::condition_variable和std::future的簡單使用

11. 虛擬函式多型的實現機制

虛擬函式多型主要指的是基類指標(引用)呼叫虛擬函式,若基類指標(引用)指向的是派生類,則自動呼叫派生類的虛擬函式。其實現機制是透過虛擬函式表虛表指標。在含有虛擬函式的類編譯時,會自動生成相應的虛擬函式表和虛表指標,虛擬函式表裡對於派生類重寫的虛擬函式,會替換成重寫後的虛擬函式地址。這樣派生類賦值給基類時,實際上是基類之類指向的是派生類的虛表指標和虛擬函式表,呼叫的就是派生類的虛擬函式了。

12. 子類建構函式中呼叫虛擬函式會怎麼樣

子類在構造時會先呼叫父類構造,再呼叫子類構造,所以在子類中呼叫虛擬函式,如果子類重寫了,會呼叫重寫後的子類函式,沒有重寫的話,仍會呼叫父類函式。

  • 注意:如果在父類構造中呼叫虛擬函式,則子類繼承後總會呼叫父類的虛擬函式,如果虛擬函式為純虛,會產生連結錯誤。

另外儘量不要在構造中呼叫虛擬函式,參見《effective C++》條款9--絕不在構造和析構過程中呼叫virtual函式

13. 介紹下C++ 11中的移動語義

移動語義即std::move關鍵字的使用,配合移動構造,可以將臨時變數直接進行構造,節省一次賦值操作和臨時變數的析構,提高了效率。

14. std::vector中插入元素的push_back與embrace_back有什麼區別

embrace_back是C++11中新的介面,由於C++11有了移動語義,對於vector中插入元素,也用移動語義重寫了,對於臨時元素可以移動構造,節省了空間,提高了效率

更多

  • C++面試題整理 1

相關文章