Re: [討論] 面試有鑑別度的問題??

看板C_and_CPP作者 (阿貓)時間11年前 (2013/01/09 15:10), 編輯推噓4(4039)
留言43則, 6人參與, 最新討論串10/14 (看更多)
※ 引述《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)

01/09 15:38, , 1F
15 中的 at_scope_exit 是 typename?
01/09 15:38, 1F

01/09 15:42, , 2F
1. 加分報雷一下好了, 想想 list<int> 跟內部節點型態
01/09 15:42, 2F

01/09 15:42, , 3F
的關係
01/09 15:42, 3F

01/09 16:19, , 4F
sizeof('a')會不一樣喔@@ 為啥阿
01/09 16:19, 4F

01/09 16:31, , 5F
C 的標準規定 char literal 的 type 是 int
01/09 16:31, 5F

01/09 16:35, , 6F
補充一題: 解釋 template < typename T > f( T&& t );
01/09 16:35, 6F

01/09 16:41, , 7F
我也給另一個答案:struct X{}; sizeof(struct X);
01/09 16:41, 7F

01/09 16:48, , 8F
14、15我個人的作法是:https://gist.github.com/4491652
01/09 16:48, 8F

01/09 16:59, , 9F
你的 Note 有點怪怪的 @_@
01/09 16:59, 9F

01/09 17:04, , 10F
語意的確有點問題 應該是有move ctor就不會自動產生copy ctor
01/09 17:04, 10F

01/09 17:06, , 11F
4. 無法與stl並用(雖然就是因為move語意的原因)
01/09 17:06, 11F

01/09 17:07, , 12F
7. ADL
01/09 17:07, 12F

01/09 17:10, , 13F
ya 我答對了耶~~ \(//▽//)\\
01/09 17:10, 13F

01/09 17:10, , 14F
原來是在指ADL...orz
01/09 17:10, 14F

01/09 17:10, , 15F
讓我想到一題 請解釋何謂two-phase lookup XD
01/09 17:10, 15F

01/09 17:11, , 16F
不過那應該是指operator的使用上, 但是 ADL 也適用函
01/09 17:11, 16F

01/09 17:11, , 17F
式名的尋找
01/09 17:11, 17F

01/09 17:13, , 18F
相關的應該有: 解釋 SFINAE
01/09 17:13, 18F

01/09 17:42, , 19F
14. 懶得包了 xD http://ppt.cc/iUJl
01/09 17:42, 19F

01/09 17:56, , 20F
ibm大 講的那個是 UB 喔 http://ppt.cc/dLCR
01/09 17:56, 20F

01/09 18:31, , 21F
居然沒想到SFINAE,請實作std::enable_if (無誤
01/09 18:31, 21F

01/09 19:01, , 22F
板主大大: 我原本也想說用unique_ptr包比較省事
01/09 19:01, 22F

01/09 19:02, , 23F
不過T*頗佔空間 所以就另外實作出來了XD
01/09 19:02, 23F

01/09 19:03, , 24F
不過這又讓我目前做的方法 就算deleter是空的 也會佔1個byte
01/09 19:03, 24F

01/09 19:06, , 25F
所以應該要用empty base optimization把它浪費的空間消掉
01/09 19:06, 25F

01/09 19:10, , 26F

01/09 19:10, , 27F
這個網站的compiler好新好棒 (Y)
01/09 19:10, 27F

01/09 19:11, , 28F
空的是指提供 0 個參數的 scopeguard() ?
01/09 19:11, 28F

01/09 19:12, , 29F
我的意思是指沒有state的deleter
01/09 19:12, 29F

01/09 19:31, , 30F
沒有狀態的話就不用has-a的關係了, 大概想一下加上
01/09 19:31, 30F

01/09 19:31, , 31F
non-type arg 或許可以?
01/09 19:31, 31F

01/09 19:50, , 32F
樓上的意思是?
01/09 19:50, 32F

01/09 19:56, , 33F
就是在dtor使用如F()()的程式碼, 不過試好久還是無法
01/09 19:56, 33F

01/09 19:56, , 34F
繞過lambda的限制 xD
01/09 19:56, 34F

01/09 20:02, , 35F
不過既然沒狀態也沒什麼好怕的 bind() 硬作掉了 Q口Q
01/09 20:02, 35F

01/09 20:02, , 36F
話說板主知道lambda有沒有move assignment operator嗎?
01/09 20:02, 36F

01/09 20:03, , 37F
我翻標準他有提到其他四個 就是沒講move assignment orz
01/09 20:03, 37F

01/09 20:04, , 38F
錯了應該用 F* 去 call method 0rz
01/09 20:04, 38F

01/09 20:08, , 39F
http://goo.gl/yPLGZ clang可以過 gcc會爆炸...
01/09 20:08, 39F

01/09 20:42, , 40F
6. tempated templated parameter 因為我被炸過所以知道
01/09 20:42, 40F
※ 編輯: PkmX 來自: 140.113.235.102 (01/09 20:59)

01/09 21:01, , 41F
剛看了一下不只最終版沒有, N2927、N2859 也沒, 既然
01/09 21:01, 41F

01/09 21:02, , 42F
不是標準明文規定的, 那就只能看實作了 orz
01/09 21:02, 42F

01/09 21:09, , 43F
move ctor 還是後來才加上去的 wwww
01/09 21:09, 43F
文章代碼(AID): #1GxHVw1C (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GxHVw1C (C_and_CPP)