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方法可以阻塞執行緒,直至結果返回。
參考資料:
- 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