C++面試題整理 2
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方法可以阻塞線程,直至結果返回。
參考資料:
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中插入元素,也用移動語義重寫了,對于臨時元素可以移動構造,節省了空間,提高了效率
更多
出處:http://www.rzrgm.cn/stephen2023/p/18417048
版權:本文版權歸作者和博客園共有
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
浙公網安備 33010602011771號