
“C++已死”
大
學時代,我就聽過這樣的說法——差不多十年前的事兒了。那時候至少在美國,Java已經成了各公司的主流語言。程序員也許都很熟悉Joel
Spolsky在2005年12月對JavaSchools發起的批駁。此外,作為微軟應對Java的手段,2000年左右推出的C#也有C++殺手的稱
號。這之后,動態語言風靡一時,Ruby和Python開始流行起來。那么,既然有了這些好用的語言,我們為什么還要選擇C++語言呢?它難道不是C語言
進階版嗎,就像當初的匯編語言進階版一樣?如果有時間,建議大家聽一下Herb Sutter的演講,講得很好;時間有限的話也可以只看這個較短的視頻演講,其中包含有具體案例。從TIOBE語言排行榜中我們可以發現,在過去逾15年的時間里,C++一直穩居最受歡迎語言列表的第三名。對一個老牌語言來說,這個成績不算差了。這讓我想到了另一個問題……
大家怎么看待指針?
大
多立即將C++與指針關聯起來的人都學錯了?!皫ь惖腃語言”已經是老一套了。根據我個人經驗,它糟糕透了。在C語言中,將多維數組作為函數參數傳送、執
行指針運算、以手動方式管理內存(就好像沒有容器與智能指針一樣)、實現雙向鏈表等等,所有這些都是我們應當在C語言的課程上學過的。也許通過這種方式來
學習C++并沒有什么錯?好吧,再想想。
當然,專業的程序員應當理解指針的工作方式,但它已經不是現代C++的主旨了。C++一直持續不斷地發展,昨天正確的代碼,到了今天可能就成了糟糕的編程風格。

C++持續完善過程(圖片來源:https://isocpp.org/std/status)
該
語言正在經歷大浪淘沙的過程,套用Bjarne
Stroustrup博士的一句話,“C++就像一種新語言,各部分組合較之前更為順暢。其更高層次的編程風格較之前更為自然,也一如既往的高效?!爆F
在,C++有了Lambda表達式、內存模型(Memory Model)、Range-based for loops、移動語義(Move
Semantics)、可變參數模板(Variadic
Template)以及所有其他類似的高級功能,這些都能協助我們完成手上的工作。你是否也有一些舊代碼需要按新標準來更新呢? 不要擔心,Clang-tidy就
是你的救星!這個工具非???,可以通過靜態分析找出老式風格代碼,并給出修改建議。在使用C++時,工具的缺乏一直很令人頭疼,不過這種情況正在改變。你
以為只有Java才有自動重構功能?谷歌的Chandler
Carruth在演講中提到了使用Ninja編譯LLVM/clang的問題,現在它們都能運用自動重構,立即生成1億行的C++代碼了。
企業代碼庫的現實場景
很
多計算機科學專業的本科生以為自己將會走上像搖滾明星、忍者或者超級英雄那樣的事業之路:“只管等著讓世界看到我的能力!”這種想法源于他們自認為“是優
秀人才,并非常人”。本來抱著一腔期待,準備投身于長時間的設計,以及實現復雜的算法(至少我以前是這么想的),然后獲得了第一份工作,結果很快就被20
年的老代碼給打垮了。有著固定緩存的strcpy函數分散在數百個文件、上千行函數、五個版本的手寫linked
lists中——請感受一下。于是你卷起袖子,動手收拾這個爛攤子。結果你的主管對你說道:“不要著急,年輕人,公司老早就要求實現這個功能了。不,我們
不準備使用新的GCC編譯器,別的團隊都還沒準備好呢?!爆F在你開始思考:“我哪里犯錯了呢……”