看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《ibmibmibm (BestSteve)》之銘言: : ※ 引述《littleshan (我要加入劍道社!)》之銘言: : : 隨便想的幾個題目 : : 1. 若在 class 中定義了 destructor,則通常還需要定義另外兩個 function。 : : 為什麼? : : 2. mutable 這個關鍵字應該用在什麼地方? : : 3. 為什麼 C++ 有四種不同的 cast operator? : : 4. exception 有什麼優點和缺點? : : 5. C++ 提供多重繼承,但 C# 或 Java 都採用 interface 與單一繼承。 : : 允許多重繼承有什麼缺點? : : 6. 為什麼我們要避免使用 global variable? : : Singleton 是 global variable 嗎?為什麼? : : 第一題算送分的,答不出來可以直接請他回家 : : 愈後面就愈沒有標準答案,屬於讓對方自由發揮的申論題 : : 從對方回答的內容其實很容易看出他的經驗以及觀念 : : 啊我好像沒提到 template...其實是因為我也不太熟 : 來提供一些多形、template和stl相關的題目 : 1. std::vector<bool> 有什麼優缺點?如何避免缺點? std::vector<bool>並不符合標準對container的需求, 它為了省空間而將所有的值pack在一起,然後透過某種proxy來存取它 : 2. 為什麼不建議讓class繼承 STL 內的容器? 應該只有不建議public繼承, 因為這些container沒有virtual destructor : 3. 在template class內宣告成員時,何時要用typename關鍵字? : 何時要用template關鍵字? 當你的dependent name是一個type/template而不是value時, 需使用typename/template做disambiguation struct foo { struct bar { }; template<typename T> struct baz { }; }; template<typename T> void f() { // Error: compiler assumes that T::bar is a value. // T::bar<int> x; // OK: typename T::bar<int> is a type. typename T::bar<int> x; // Error: compiler assumes baz<int> is an expression. // typename T::baz<int> y; // OK: typename T::template baz<int> is a type. typename T::template baz<int> y; } f<foo>(); : 4. 什麼是auto_ptr?他有哪兩個缺點而不建議使用?替代方案是? auto_ptr沒辦法分辨copy和move的語意,(第二個缺點是? 替代方案是std::unique_ptr : 5. nullptr 是為了解決什麼問題而產生的? void f(int); // 1 void f(int*); // 2 f(0); // Call 1 f(NULL); // Error: ambiguious f(nullptr); // Call 2 : 6. type traits 是為了解決什麼問題而產生的?通常與哪些東西一起用? 簡單來說就是當你在寫template的程式碼時, 需要獲得type的一些性質(例如兩個type一不一樣,是不是pod...), 或是需要對type做一些轉換(增加rvalue reference,decay...), 就需要使用到type traits : 7. 為了讓大家方便使用,overloading會開啟一個後門,請問是什麼後門? 不太清楚你想問什麼? : 8. 請寫出一份不含marco的程式碼, : 而使用c編譯器與c++編譯器都能編譯, : 但是程式的執行結果不一樣。 sizeof('a') : 題目是照我個人感覺排難易度的XD : 能回答到越後面表示對stl跟template越熟 : 最後一題就很刁鑽了,不知道有多少解法 再來給幾個題目好了XD 1. 請解釋標準容器的allocator的用途? (加分題:allocator中的rebind template是幹嘛用的?) 2. 何時會用到operator->*? 3. 請解釋std::bind如何使用以及用途為何? 4. 承上題,請舉例如何用std::bind將參數綁定在一個member function上。 5. 承上題,請解釋std::ref和std::cref的用途為何? 6. 在template的宣告中,class和typename通常是可以互換的, 但在哪一個情況下只能使用class這個keyword而不能使用typename? 7. 請解釋input/output/forward/bidirectional/random access iterator的差異為何, 他們各支援哪些operation?什麼是std::iterator_traits? 8. std::unordered_{set,map}和std::{set,map}有何差別? 9. 請舉例如何使用variadic template與template aliases,並實現std::tuple。 10. 請解釋何謂copy-and-swap idiom。 11. 為何T** -> const T**與derived** -> base**皆不合法? 12. 請解釋以下的這個&的作用,它可以幫助我們避免什麼錯誤? auto foo::operator=(const foo&) & -> foo& ^ 13. 試問以下的lambda為何不合法?要加入什麼才正確? int i = 0; auto l = [=](){ return ++i; }; assert(l() == i + 1); (大家有沒有發現littleshan大大的第二題其實不只一個答案XD) 14. 請寫一個scopeguard,達到以下的使用方式: { auto sg1 = scopeguard([](){ std::cout << "1"; }); auto sg2 = scopeguard([](){ std::cout << "2"; }); auto sg3 = std::move(sg1); // sg3 takes sg1's responsibility // to print 1 on destruction sg2.dismiss(); // sg2 no longer prints 2 on destruction } // print "1" here 15. 承上題,請使用scopeguard實作出類似其他語言中finally的功能出來,例如: at_scope_exit([](){ // ... }); (提示:可使用許多編譯器提供的__COUNTER__ macro) 16. 試問decltype和std::declval的用途和用法為何? 17. boost::variant與boost::any有何差別? 18. boost::function與boost::any皆中有用到type erasure的技巧,請解釋? 19. 請用constexpr寫出在compile-time計算factorial的function。 20. 請解釋何謂facet?它與locale的關係是? 加分題:有無使用其它boost、loki等函式庫的經驗?用在哪些地方? 其實我覺得題目有點刁鑽...(無誤,裡面3、4、5、7、8、10應該算是比較簡單的題目, C++11的新功能幾乎每個都可以拿來考:user-defined string literal、random... 用來測驗programmer對C++11新功能的熟悉度, 如果能夠面試的時候非常快速精準的回答這些問題根本就是神了 m(_ _)m 很多題目也是稍微去翻一下才記得... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.235.102 ※ 編輯: PkmX 來自: 140.113.235.102 (01/09 15:12) ※ 編輯: PkmX 來自: 140.113.235.102 (01/09 15:14)
loveme00835:15 中的 at_scope_exit 是 typename? 01/09 15:38
loveme00835:1. 加分報雷一下好了, 想想 list<int> 跟內部節點型態 01/09 15:42
loveme00835: 的關係 01/09 15:42
QQ29:sizeof('a')會不一樣喔@@ 為啥阿 01/09 16:19
legnaleurc:C 的標準規定 char literal 的 type 是 int 01/09 16:31
loveme00835:補充一題: 解釋 template < typename T > f( T&& t ); 01/09 16:35
ibmibmibm:我也給另一個答案:struct X{}; sizeof(struct X); 01/09 16:41
PkmX:14、15我個人的作法是:https://gist.github.com/4491652 01/09 16:48
loveme00835:你的 Note 有點怪怪的 @_@ 01/09 16:59
PkmX:語意的確有點問題 應該是有move ctor就不會自動產生copy ctor 01/09 17:04
ibmibmibm:4. 無法與stl並用(雖然就是因為move語意的原因) 01/09 17:06
ibmibmibm:7. ADL 01/09 17:07
loveme00835:ya 我答對了耶~~ \(//▽//)\\ 01/09 17:10
PkmX:原來是在指ADL...orz 01/09 17:10
PkmX:讓我想到一題 請解釋何謂two-phase lookup XD 01/09 17:10
loveme00835:不過那應該是指operator的使用上, 但是 ADL 也適用函 01/09 17:11
loveme00835:式名的尋找 01/09 17:11
loveme00835:相關的應該有: 解釋 SFINAE 01/09 17:13
loveme00835:14. 懶得包了 xD http://ppt.cc/iUJl 01/09 17:42
loveme00835:ibm大 講的那個是 UB 喔 http://ppt.cc/dLCR 01/09 17:56
PkmX:居然沒想到SFINAE,請實作std::enable_if (無誤 01/09 18:31
PkmX:板主大大: 我原本也想說用unique_ptr包比較省事 01/09 19:01
PkmX:不過T*頗佔空間 所以就另外實作出來了XD 01/09 19:02
PkmX:不過這又讓我目前做的方法 就算deleter是空的 也會佔1個byte 01/09 19:03
PkmX:所以應該要用empty base optimization把它浪費的空間消掉 01/09 19:06
PkmX:這個網站的compiler好新好棒 (Y) 01/09 19:10
loveme00835:空的是指提供 0 個參數的 scopeguard() ? 01/09 19:11
PkmX:我的意思是指沒有state的deleter 01/09 19:12
loveme00835:沒有狀態的話就不用has-a的關係了, 大概想一下加上 01/09 19:31
loveme00835:non-type arg 或許可以? 01/09 19:31
PkmX:樓上的意思是? 01/09 19:50
loveme00835:就是在dtor使用如F()()的程式碼, 不過試好久還是無法 01/09 19:56
loveme00835:繞過lambda的限制 xD 01/09 19:56
loveme00835:不過既然沒狀態也沒什麼好怕的 bind() 硬作掉了 Q口Q 01/09 20:02
PkmX:話說板主知道lambda有沒有move assignment operator嗎? 01/09 20:02
PkmX:我翻標準他有提到其他四個 就是沒講move assignment orz 01/09 20:03
loveme00835:錯了應該用 F* 去 call method 0rz 01/09 20:04
PkmX:http://goo.gl/yPLGZ clang可以過 gcc會爆炸... 01/09 20:08
yoco315:6. tempated templated parameter 因為我被炸過所以知道 01/09 20:42
※ 編輯: PkmX 來自: 140.113.235.102 (01/09 20:59)
loveme00835:剛看了一下不只最終版沒有, N2927、N2859 也沒, 既然 01/09 21:01
loveme00835:不是標準明文規定的, 那就只能看實作了 orz 01/09 21:02
loveme00835:move ctor 還是後來才加上去的 wwww 01/09 21:09