你用C++踩過多少坑?編程業(yè)界大牛帶你了解真正的C++
C++的初衷
1)早期C++許多的工作是對(duì)于C的強(qiáng)化和凈化,并把完全兼容C作為強(qiáng)制性要求。C89、C99中許多的改進(jìn)正是從C++中所引進(jìn)??梢?,Stroustrup對(duì)C語言的貢獻(xiàn)非常之大。今天不管你對(duì)C++怎么看,C++的確擴(kuò)展和進(jìn)化了C,對(duì)C造成了深遠(yuǎn)的影響。
2)在C++兼容C的過程中遇到了不少設(shè)計(jì)實(shí)現(xiàn)上的麻煩;以及守舊的K&R C程序員對(duì)Stroustrup的批評(píng)。很多人說C++的惡夢(mèng)惡夢(mèng)就是要去兼容于C,這并不無道理(Java就干的比C++徹底得多),但這并不是Stroustrup考慮的,Stroustrup一邊在使盡渾身解數(shù)來兼容C,另一方面在拼命地優(yōu)化C。
3)C++***的競(jìng)爭(zhēng)對(duì)手正是C,他的目的就是——C能做到的,C++也必須做到,而且要做的更好。大家覺得是不是做到了?有多少做到了,有多少還沒有做到?
4)對(duì)于同時(shí)關(guān)注的運(yùn)行效率和開發(fā)效率的程序員,Stroustrup多次強(qiáng)調(diào)C++的目標(biāo)是——“在保證效率與C語言相當(dāng)?shù)那闆r下,加強(qiáng)程序的組織性;能保證同樣功能的程序,C++更短小”,這正是淺封裝的核心思想。而不是過渡設(shè)計(jì)的OO。(參看:面向?qū)ο笫莻€(gè)騙局)
5)《C++演化和設(shè)計(jì)》這本書中舉了很多例子來回應(yīng)那些批評(píng)C++有運(yùn)行性能問題的人。C++在其第二個(gè)版本中,引入了虛函數(shù)機(jī)制,這是C++效率***的瓶頸了,但我個(gè)人認(rèn)為虛函數(shù)就是多了一次加法運(yùn)算,但讓我們的代碼能有更好的組織,極大增加了程序的閱讀和降底了維護(hù)成本。(注:Lippman的《深入探索C++對(duì)象模型》也說明了C++不比C的程序在運(yùn)行性能低。Bruce的《Think in C++》也說C++和C的性能相差只有5%)
6)這本書中還講了一些C++的痛苦的取舍,印象最深的就是多重繼承,提出,拿掉,再被提出,反復(fù)很多次,大家在得與失中不斷地辯論和取舍。這個(gè)過程讓我***的收獲是——a) 對(duì)于任何一種設(shè)計(jì)都有好有壞,都只能偏重一方,b) 完全否定式的批評(píng)是不好的心態(tài),好的心態(tài)應(yīng)該是建設(shè)性地批評(píng)。
C++有多少坑
個(gè)人覺得C++的坑其實(shí)并不多,因?yàn)镃++太靈活了,想怎么搞就怎么搞,所以,各種不經(jīng)意地濫用和亂搞。某些人C和C++都沒學(xué)好,大多數(shù)人用C++寫C,所以,C的坑和C++的坑合并了。如果你能花兩到三周的時(shí)候讀一下《Effecitve C++》里的那50多個(gè)條款,你就知道C++里的坑并不多,而且,有很多條款告訴我們C++是怎么解決C的坑的。然后,你可以讀讀《Exceptional C++》和《More Exceptional C++》,你可以了解一下C++各種問題的解決方法和一些常見的經(jīng)典錯(cuò)誤。
C++在解決了很多C語的坑的同時(shí),也因?yàn)镺O和泛型又引入了一些坑。消一些,加一些,我個(gè)人感覺上總體上只比C多10%左右吧。但是你有了開發(fā)速度更快,代碼更易讀,更易維護(hù)的500%的利益。
C++的編譯對(duì)標(biāo)準(zhǔn)C++的實(shí)現(xiàn)各異,支持地也千差萬別,所以會(huì)有一些比較奇怪的問題,但是如果你一般用用C++的封裝,繼承,多態(tài),以及namespace,const, refernece, inline, templete, overloap, autoptr,還有一些OO 模式,并不會(huì)出現(xiàn)奇怪的問題。
而對(duì)于STL中的各種坑,我覺得是程序員們還對(duì)GP(泛型編程)理解得還不夠,STL是泛型編程的***實(shí)踐!屬于是大師級(jí)的作品,一般人很難理解。必需承認(rèn)STL寫出來的代碼和編譯錯(cuò)誤的確相當(dāng)復(fù)雜晦澀,太難懂了。這也是C++的一個(gè)詬病。
C++是一門很恐怖的語言,而比它更恐怖的是很多不合格的程序員在使用著它。
很多編程大牛對(duì)C++的感情波動(dòng)是:先是喜歡地要死,然后是恨地要死,最是的又愛又恨,愛的是這個(gè)語言,恨的是很多不合格的人在濫用和凌辱它。
C++的未來
C++語言發(fā)展大概可以分為三個(gè)階段(摘自Wikipedia):
-
***階段:
這一階段C++語言基本上是傳統(tǒng)類型上的面向?qū)ο笳Z言,并且憑借著接近C語言的效率,在工業(yè)界使用的開發(fā)語言中占據(jù)了相當(dāng)大份額;
-
第二階段:
這一階段由于標(biāo)準(zhǔn)模板庫(STL)和后來的Boost等程式庫的出現(xiàn),泛型程式設(shè)計(jì)在C++中占據(jù)了越來越多的比重性。當(dāng)然,同時(shí)由于Java、C#等語言的出現(xiàn)和硬件價(jià)格的大規(guī)模下降,C++受到了一定的沖擊;
-
第三階段:
以Loki、MPL等程式庫為代表的產(chǎn)生式編程和模板元編程的出現(xiàn),C++出現(xiàn)了發(fā)展歷史上又一個(gè)新的高峰,這些新技術(shù)的出現(xiàn)以及和原有技術(shù)的融合,使C++已經(jīng)成為當(dāng)今主流程式設(shè)計(jì)語言中最復(fù)雜的一員。
在《Why C++? 王者歸來》中說了 ,性能主要就是要省電,省電就是省錢,在數(shù)據(jù)中心還不明顯,在手機(jī)上就更明顯了,這就是為什么Android 支持C++的原因。所以,在NB的電池或是能源出現(xiàn)之前,如果你需要注重程序的運(yùn)行性能和開發(fā)效率,并更關(guān)注程序的運(yùn)性能,那么,應(yīng)該*** C++。這就是iOS開發(fā)也支持C++的原因。
今天的C++11中不但有更多更不錯(cuò)的東西,而且,還填了更多原來C++的坑。
總結(jié)
C++并不***,但學(xué)C++必然讓你受益無窮。是那些不合格的、想對(duì)編程速成的程序員讓C++變得坑多。