作者PkmX (阿貓)
看板C_and_CPP
標題Re: [討論] 面試有鑑別度的問題??
時間Wed Jan 9 15:10:48 2013
※ 引述《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
→ 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
→ 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
→ 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