如何在一個月內提高C++水平?

題主即將大四,大部分之前的項目都是Java,對基本的演算法和數據結構還算比較熟練。 C++在大二的時候學過但是不太熟悉。一個月後將有一個面試主要是C++(公司和項目都很棒,只是語言不是Java), 如何在一個月內迅速熟悉C++這門語言?有哪些可以練手的小項目?

之前有開始看The C++ programming language但是感覺一個月可能吃不透這本書,求一些指導!

問題補充:題主在國外讀書,之前在一些金融科技公司實習過半年。現在即將面試的也是金融科技公司,一個月的時間希望能盡量提高c++水平,並不指望一個月就能成為c++專家。希望大家給一些可以短期提高的意見。


講道理,你要一個月以後準備C++面試還是有取巧的方法的。這麼幾個點必看。雖然我是一個校招經驗不多,但是各個公司其實問的還是蠻套路的。

1. 看宏。C語言的宏,特別是宏展開的時候容易出的一些問題,以及這些問題怎麼解決的。很多學校里出來的人基本上都不知道宏咋寫,也是蠻奇怪的。

2. 內存對齊。具體怎麼對齊自己上網搜,這個血愛問。

3. 虛表。學C++你不知道虛表是啥,怎麼證明你學了?

4. 對象的內存結構。對象指針加個幾能取到成員變數啊,根據類聲明推算對象大小啊。

5. 指針的各種相互轉化。這個主要要理解C/C++是圍繞著內存來轉的,所以同一段內存用不同的類型的指針加加減減能玩出很多花樣。比如問你int i=4;把i的地址強制換成char*類型,比如叫c吧。然後問你c[2]是幾之類的。

6. 標準庫的一些常識。比如erase以後迭代器會失效之類的。memset之類的函數怎麼用啦。

7. 右值引用,移動語義。新標準得了解吧。這個理解起來比較費勁喜歡問。

8. 匿名函數、閉包以及閉包的各種玩法。最好能看看用C++函數式編程。

9. 看看設計模式中幾個比較經典的用C++怎麼實現,比如單例什麼的。這個作為常識要一個印象。

10. 模板的高級玩法。這個問的人貌似比較少,就是那種用尖括弧換行的玩意。對就是用模板做函數式編程,畢竟圖靈完備。不過看看就好,一般面你的人了解函數式的概率不大。知道了還是比較有逼格。

11. 看看boost。大概看看就好,表示自己除了標準庫外還用過些別的。

12. 一些關於構造函數的坑,以及衍生出來的各種奇怪的解決方式。什麼兩步構造,部分析構。這倆能不能是虛的之類的。

13. 大致了解下gc和智能指針,隨時準備好他們讓你在C++中用類似gc的方式管理對象。

14. 既然說到gc了,如何查看內存泄露?

15. 了解些編譯,鏈接期的東西。比如解釋一下鏈接錯誤是咋來的。

16. 忘說了,還有多繼承、菱形繼承之類的關於面向對象的常規問題。

17. 你要知道標準庫中常用的數據結構是用什麼數據結構實現的,常見操作時間複雜度多少。比如unordered_map和map的區別。

18. 各種位運算的玩法。雖然你可能知道不過還是提一下。比如怎麼取出低位,怎麼取出高位。左移以後是乘2之類的。

差不多就這些吧,一個月應該夠了。想起其他的我再補。應付面試應該差不多了。(雖然我面試不多…你就當參考吧)


C++要熟悉其實很簡單,不用一個月,只要一分鐘。

把你的簡歷上寫上,精通C++,就可以了。

然後打開The C++ Programming Language,翻一下後面附錄中的術語表,混個眼熟,一些比較常見的關鍵字,比如 virtual 之類。

面試的時候,隨便給面試官報個答案。然後如果對了皆大歡喜。

如果不一樣,這個時候你一個月的準備工作就到了表現的時候了:

「哦!原來你說的是Two phase name look up mechanism 啊!(停頓)對於這個Question,雖然C++ 11(讀作「伊來聞」,不讀「屎遺」,下同) standard在Draft N3028(讀作「瑟添臀添誒特」,不讀「散蛋阿爸」,下同)時就已經final decision了,C++17上對於Chapter 14,section 3.3.1 條款 5,7,15 上做了進一步調整,但是迄今為止各家compiler vendor的implementation仍然slighty difference。所以可能我們在不同的Compiler上都是對的。我的答案是在IBM XL C++ 13上獲得的,Linux Z(重音) System on Power 8,not MSVC on Windows x64(讀作「埃克斯碎剋死天佛」,不能讀「插牛屎」),you know。(停頓)Our experience可能不太一樣。我剛剛仔細的考慮過你的Result,應該是Make Sense的。關於這個問題的進一步討論,我想我們可以參考一下TCPL的275頁(隨便報個頁數就可以了,沒人會真去查的)。」

注意,一定要用英語,一定要自信。說中文就說不知道,沒看過。99.99%的面試官不敢說自己沒聽懂。

所以總結一下,面試的時候你怎麼樣並不要緊,你只需要做到以下幾點中的任意一條:

1. 讓面試官覺得你懂

2. 和面試官的答案相同

3. 讓面試官覺得他也不懂

這樣就是一個成功的面試了。

至於你說進去以後怎麼辦,南郭先生的故事聽過嗎。

如果大家都牛逼,也就沒人在乎你是不是屎。

如果大家都不牛逼,那一坨屎從道德上就不能嫌棄其他屎。

如果樂團拆分了,記住,不要去當樂手了,要提前轉型,當樂團老闆吧。


刷題是必須的,我就說點別的東西。得看樓主什麼「金融科技公司」了,以及樓主最想補全的是什麼。最後結尾我有讓你假裝自己是c++老鳥的乾貨

Bloomberg的話喜歡各種詭異的C++的問題,套路太深。之前面的時候有一輪是直接拿著一段列印好的代碼,問你「這段代碼有什麼編譯錯誤」,那個沒c++經驗的話很難答。他們也是對c++ standard committe影響很深的人,員工平均C++水平還是不錯的,糊弄不過去,得補綜合能力。

第二梯隊和小公司的話看中的是第一天上班就能來事的能力,得補c++的stl庫的熟練運用。如果你是畢業生的話他們也沒期望你對c++標準有何理解,只要寫的快寫的乾淨問題就不大。

小的hedge的話也是沒什麼技巧的,難說,但是你是對口學校的話問題應該不大。面試c++那一輪的話不要變成短板就行了,可能精力要放到其他的面試準備上面。

我自動把高盛,摩根這些公司劃掉了。劇我所知這些公司是不需要一定要用c++來面試的,所以可以上班了再學吧。

補綜合能力的話就是看書刷題,書單的話其他答案已經寫的很好了。

如何在一個月內提高C++水平? - 李運華的回答

如何在一個月內提高C++水平? - HenryLee 的回答

stl庫的熟悉運用的話直接把所有的的例子給看了& - C++ Reference

我總結的乾貨:如何裝老鳥

1. loop的時候用iterator的話,記得要++i不是i++。這是因為早期c++ 編譯器++i的代碼比較快

2. 類的名字在超過15個字元左右的時候用auto,而不是到處auto到飛起。auto的飛起的一看就是新手(當然也有AAA派的人,我們可以打一架)

3. 會用 std::transform, count_if, any_of, find_if 這些在&裡面比較常見的

4. 有基本的template 的認知,而且不會怕在面試的時候用一點template

5. string一定要深刻理解,比如short string optimization, c++ - What are the mechanics of short string optimization in libc++? ,複製的代價,如何增長,如何縮小,.data()什麼時候會是nullptr

最後,在某些情況下敢於pass by copy,然後面試官問你效率的時候可以選擇正面剛。這個屬於玩火項目,記得小心運用。玩的好就直接strong hire了


我老老實實告訴你不可能。

不過你如果出於準備面試的目的,一個月針對下是可以的。

這個具體方法也好辦,知乎和Stackoverflow上的高頻問題背一下。

就算針對面試,也是要看面試官那天的心情。

話說面試是個揚長避短的事情,你非要暴露自己的短板幹嘛?



這個問題我必須要強答一下了,目前在自己的圈子裡cpp底子還算過得去。

我自學cpp的時候的狀況不算太好,並沒有成體系的完整看過一本語言書,但是寫代碼的底子不算太差,真正開始決定自學cpp的時候是因為覺得在學校這個魚塘環境實在是沒什麼意思.於是直接買了primer 4th來看,當時是陪前女友看托福之類的時候半摸魚的看,這個一晚上兩人虐虐狗的能看個兩頁就不錯了....好吧,跑題了.

真正開始狂趕進度的看這本書是只用了一個多月的時間,是大三升大四的暑假,每天時間是三到四個小時看書和練習。而之後我就順利的找到了實習工作。當然直到現在也是持續學習cpp。

所以,一個月究竟能幹什麼,足夠你把所有語法都記住,吃透它們這個還是有困難的,但是就是要記住,哪怕不能完全理解也要記住,寫代碼練習的時候不要保守,想用什麼特性就用,一定要奔放,自己去踩出最佳實踐最好,踩不出最佳實踐,去踩坑,熬過幾個晚上調試bug,一切就順暢了。

至於一個月入門cpp什麼的,還是不要想太多了.


還是認真地答一下吧。雖然我用了C++幾年,但也不敢在簡歷上寫精通倆字。不過題主只是針對面試的話,努力一下一個月或許可以的。

先推薦參考書,樓上有朋友提到了的:C++ Primer (by Stanley B. Lippman...)

還有是學會查reference,我一般喜歡去Reference - C++ Reference

提幾個面試中經常會考的幾個概念,也是相對比較confusing的地方,題主可以去翻書或者去stackoverflow找相關文檔:

1. static 關鍵字,有幾種不同的用途

2. pointer (*)和reference ()的用法,還有這個符號可以是運算符,千萬不要混淆了它和reference的用法

3. 動態分配,C有malloc和free,C++有new和delete。另外知道一下delete以及delete[]的區別

4. virtual 函數的用法,已經如果可能的話理解一下它的實現(virtual table)

當然以上幾個都可以從編譯的角度去思考一下是怎樣實現的

5. RAII 以及the rule of three,這個可能比較難,需要一定的背景知識和經驗,但我覺得還是必須要懂的東西。

暫時想到這些,待補充。

當然這些概念的東西,如果沒有實踐經驗,可能理解不那麼透。建議多做點練習以後,還要倒回來看一遍。

然後練習一下STL裡面的一些數據結構,我建議從vector, priority_queue 和map 這三個開始入手,比較有代表性。reference在這階段會很有用處,多看多練習。另外一定要學會用裡面的iterator,以及儘可能會自定義compare function。

然後可以去嘗試模仿STL的用法,實現一個自己的數據結構,在這之前需要先知道template是怎麼用的。實現過程中需要知道怎麼實現不同的contructor, operator override。另外如果你的數據結構是可以iterate的話,再實現一個iterator吧。

最後就是建議有時間多讀讀別人寫的代碼了,推薦看看Google的leveldb。另外如果有心去做剛才提到的template的練習的話,可以參考SGI STL 的代碼。

祝題主好運。


直接和他們這麼講 試試?


一個月不行,先頂一個小目標,一年吧。


你這思路不對啊,你應該向他們證明你 Java 水平足夠閉著眼睛躺著吃飯,然後趁熱打鐵「雖然我現在 C++ 並不熟練,但我可以學習,你們看我 Java 這麼好我還是有功底的」,這樣他們要招你也可以招得心甘情願啊。當然 Java 最好用的地方是別的所有稍微高級一點的語言教程都有「for Java developer」的版本,要速成也是盯著這些看。


《C++ primer》中文版,我當年也是怎麼感覺都入不了門,認真看完第三版,恍然大悟,醍醐灌頂!現在已經是第五版了。

每天看一點,一個月內看完,不一定每個地方都看懂,但作為應屆生應付面試沒問題。

看不懂的地方,請請教 @vczh ,他的簽名是「C++ primer 強勢審校」 ,他是我知道的你能夠在知乎直接聯繫的C++大牛 :) 注意:不是C++ primer plus!!

(2016.09.18補充:不是我黑C++ primer plus,而是我自己沒有看過,所以不評價不推薦,但關鍵是這貨的名稱是C++ primer然後加個plus,很容易迷惑不明真相群眾,所以我特別說明一下)


應付筆試面試的話就看一下《C語言深度剖析》和《C/C++高質量編程指南》。如果項目要用到C++,那你面試過了,去了不是給人添亂嗎?校招公司挺多的,別一棵樹上弔死,揚長避短,想辦法突出自己在Java方面的能力,多從基礎能力準備,數據結構,操作系統,網路這幾塊都需要好好準備,C++是比較難的語言,需要很長的時間學習,入門也看我推薦的那兩本,看完之後再看其他的鴻篇巨著


很多特性跟Java的類似,這個網上有總結,一天就能看完。然後至於C++特有的特性(這個會很多,畢竟Java比起來簡單太多了),大概知道是什麼,不求懂,只求會說。用高票答案的方法就好了,雖然是歪門邪道但是管用就行。


如果你c和java都還不錯,其他cs專業知識基礎也好,理解c++應該也不是很難吧,先去刷刷題庫或者看看程序猿面試寶典,面試一類不算大問題。

但是想用的很好,這個還是要有大量實戰經驗,基礎也要過硬的。


先看書,不要仔細看,大致了解,不拘細節即可,然後刷題,刷演算法題,自己敲!邊刷邊看,這時候就要注重細節的學習了。

然後沒事的時候多關注C++類的博客,看別人的總結,消化成自己的。恩,大概就是這樣


要提高的話堅持寫就好了,總會有進步。人生有很多個一個月,每月都有進步的話,自己也會很開心吧。


各位大 V 們,好好地回答問題就那麼難?題主問的是「如何在一個月內提高 C++ 水平」,又不是問「如何在一個月內精通 C++」。

提高和精通,完全是兩個不同的概念,沒必要在這裡亂抖機靈和冷嘲熱諷。

也許大 V 們的 C++ 水平已經很高,到了更進一步已經很難的地步,所以在一個月內再要提高的確難以實現。但是,題主是一個大二時學過並且不太熟悉 C++ 的大三學生啊,短時間內提高到能夠面試的水平還是很有可能的,何況題主對演算法和數據結構都還挺熟練。

大四面試的時候,主要需要準備的是 C++ 的基本語法、關鍵特性、能夠用 C++ 來回答演算法和數據結構方面的問題,就足夠了。

基本語法不必多言,C 語言系的關鍵詞、語法都差不多,而題主常用Java,說明對「類」這個概念了解得也比較深,融匯貫通一下就好了。然而雖然兩種語言看上去能看懂,但真正讓你手寫 C++ 的代碼可能就會有很多語法上的錯誤,比如,Java 是沒有指針的,但 C++ 中,指針又是最容易埋坑的地方,還是需要花 10 天左右的時間詳細了解基本語法。

建議先對比一下兩種語言的差異:https://zh.wikipedia.org/wiki/Java%E5%92%8CC%2B%2B%E7%9A%84%E5%B0%8D%E7%85%A7。

其他答主推薦的《C++ Primer》是一本很適合 C++ 入門的書籍。

對於 C++ 的關鍵特性,則需要重點關注,因為面試官挺喜歡問這類型的問題,包括:各種構造函數、虛函數、純虛函數、虛析構函數、多態、多重繼承、內存管理、指針和引用的區別、指針函數和函數指針的區別……

我只是一下子腦補了一下大概率會出現的概念,具體還需要題主自己去搜索別人的總結,然後各個擊破。C++ 版的《程序員面試寶典》也能幫到你很多。

另外,面試離不開數據結構和演算法,直接把 Java 的語法翻譯成 C++ 的時候,需要特別注意指針、內存分配和釋放的問題。


先花21天精通它,然後花9天認清自己不可能精通的事實。


#undef python

#define cpp python


C++從入門到放棄;

vs從安裝到卸載;


推薦閱讀:

如何說服同學在寫C++程序的時候用cstdio而不是stdio.h?
當你寫幾萬行代碼時,你在寫什麼?
有什麼現有函數,輸入是一個單詞變式的字元串,如複數,過去式,現在進行時等,輸出這個單詞的原型?
如何評價開學季知乎上大量出現C/C++新手問作業題?
為什麼有些人罵 C++,如 Linux 之父對 C++ 進行了炮轟,說它是糟糕程序員的垃圾語言?

TAG:編程 | Java | C | 編程學習 |