技術(shù)人員對(duì)于C++語(yǔ)言編程技巧說(shuō)明
C++是一門(mén)廣泛用于工業(yè)軟件研發(fā)的大型語(yǔ)言。它自身的復(fù)雜性和解決現(xiàn)實(shí)問(wèn)題的能力,使其極具學(xué)術(shù)研究?jī)r(jià)值和工業(yè)價(jià)值。和C++語(yǔ)言一樣,C++已經(jīng)在許多重要的領(lǐng)域大獲成功。
C++吸引如此之多的智力投入,以至于這個(gè)領(lǐng)域的優(yōu)秀作品,包括重量級(jí)的軟件產(chǎn)品、程序庫(kù)以及書(shū)籍等,數(shù)不勝數(shù)。文題“C++程序設(shè)計(jì)之四書(shū)五經(jīng)”一個(gè)不太嚴(yán)格的含義是:C++程序設(shè)計(jì)之四書(shū)五經(jīng)。是的,在本文(及其下篇)中,我將分門(mén)別類(lèi)推薦20多本C++好書(shū),你可以根據(jù)自己的需要選讀。
TCPL和D&E
TCPL和D&E分別是《The C++ Programming Language》和《TheDesign and Evolution of C++》的簡(jiǎn)稱(chēng),均出自Bjarne Stroustrup之手。我將它們單列出來(lái),首先是因?yàn)锽jarne是C++語(yǔ)言的創(chuàng)建者,然后是因?yàn)楸取笆紫取蹦莻€(gè)原因更重要的原因:這兩本書(shū)是C++領(lǐng)域毋庸置疑的杰作。說(shuō)它們是C++語(yǔ)言圣經(jīng),并不為過(guò)。
迄今為止,TCPL是除了C++標(biāo)準(zhǔn)文獻(xiàn)之外最權(quán)威的C++參考手冊(cè)。和大多數(shù)人的看法不大一樣,我認(rèn)為Bjarne的文字語(yǔ)言并不遜色于他所創(chuàng)建的程序語(yǔ)言,至少我喜歡這種學(xué)院氣息濃厚的作品。#t#
本書(shū)對(duì)C++語(yǔ)言的描述輪廓鮮明、直截了當(dāng)。它從C++語(yǔ)言創(chuàng)建者的角度來(lái)觀察C++,這是任何別的作者和書(shū)籍做不到的— 沒(méi)有任何人比Bjarne自己更清楚該怎么來(lái)使用C++。這是一本嚴(yán)肅的著作,以中、高級(jí)C++開(kāi)發(fā)人員為目標(biāo)讀者。如果你是一名有經(jīng)驗(yàn)的C++程序員,需要了解更加本質(zhì)的C++知識(shí),本書(shū)正是為你而寫(xiě)。
它不是那種讓你看了會(huì)不斷竊喜的小書(shū),需要用心體會(huì),反復(fù)咀嚼。在閱讀過(guò)程中,請(qǐng)?zhí)貏e留心Bjarne先生強(qiáng)調(diào)了什么,又對(duì)什么一語(yǔ)帶過(guò)。我個(gè)人比較喜歡這本書(shū)的第四部分“使用C++做設(shè)計(jì)”,這樣的內(nèi)容在類(lèi)似的程序設(shè)計(jì)語(yǔ)言書(shū)籍中很難看到— 我甚至認(rèn)為Bjarne應(yīng)該將這部分獨(dú)立出來(lái)單獨(dú)寫(xiě)一本書(shū)。
首先重復(fù)一句Bjarne的話:“我們的系統(tǒng)已經(jīng)是極度復(fù)雜的了,為了避開(kāi)C++的復(fù)雜性而干脆不用C++(Linus的做法),無(wú)異于因噎廢食。”在所有可用C和C++的領(lǐng)域,C++都是比C更好的語(yǔ)言。當(dāng)我說(shuō)“更好的”時(shí)候。#t#
我說(shuō)的是C++擁有比C更安全的類(lèi)型檢查、更好的抽象機(jī)制、更優(yōu)秀的庫(kù)。當(dāng)然,凡事都有例外,如果你做的項(xiàng)目1)不大。2)編碼中用不到什么抽象機(jī)制,甚至ADT(抽象數(shù)據(jù)類(lèi)型,例如std::complex這種不含多態(tài)和繼承的)也用不到,RAII也用不到,異常也用不到。3)你連基礎(chǔ)庫(kù)(如,簡(jiǎn)化資源管理的智能指針、智能容器)都用不著。那么也許你用C的確沒(méi)問(wèn)題;所以如果你的情況如此,不用和我爭(zhēng)論,因?yàn)槲覠o(wú)法反駁你。我們這里說(shuō)的領(lǐng)域大致是Bjarne在“C++應(yīng)用列表”里面列出來(lái)的那些地方。
底線是:如果把C++中的諸多不必要的復(fù)雜性去掉,留下那些本質(zhì)的,重要的語(yǔ)言特性,簡(jiǎn)化語(yǔ)言模型,消除歷史包袱。即便是C++的反對(duì)者也許也很難找到理由說(shuō)“我還是不用C++”。在我看來(lái),一個(gè)真正從實(shí)踐意義上理性反對(duì)使用C++的人只有一個(gè)理由:C++的復(fù)雜性帶來(lái)的混亂抵消乃至超過(guò)了C++的抽象機(jī)制和庫(kù)(在他的特定項(xiàng)目中)帶來(lái)的好處。
值得注意的是,這里需要避免一個(gè)陷阱,就是一旦人們認(rèn)定了“C++不好”,那么這個(gè)理由就會(huì)“長(zhǎng)出自己的腳來(lái)”,即,就算我們拿掉C++的復(fù)雜性,他們可能也會(huì)堅(jiān)持還是不用C++,并為之找一堆理由。我假定你不是這樣的人。
不過(guò),也許最可能的是他會(huì)說(shuō):“問(wèn)題是我們今天用的C++并非如此(簡(jiǎn)潔),你的假設(shè)不成立。”是的,我的假設(shè)不成立。但雖然我們無(wú)法消除復(fù)雜性,我們實(shí)際上是可以容易地避開(kāi)復(fù)雜性,避短揚(yáng)長(zhǎng)的。這也是本文的要點(diǎn),容我后面再詳述。
當(dāng)然,到現(xiàn)在你可能還是會(huì)說(shuō)。我還是不用C++語(yǔ)言,因?yàn)槲铱梢杂肈;或者如果你本來(lái)做的項(xiàng)目就不需要C++,你則可能會(huì)說(shuō),我用Python。首先,如果你的項(xiàng)目能用Java/Python乃至Ruby做,那么用C++是自討苦吃。因?yàn)槟苡媚切┱Z(yǔ)言代表你的項(xiàng)目在效率上本身要求就不高。
那么用一門(mén)效率上討不到太大好處,復(fù)雜性上卻綽綽有余的語(yǔ)言,有什么價(jià)值呢?其次,如果你的項(xiàng)目效率是很重要的,你可能會(huì)說(shuō)可以用D。然而現(xiàn)實(shí)是D在工業(yè)界尤其是國(guó)內(nèi)被運(yùn)用得非常少,幾乎沒(méi)有。
而C++語(yǔ)言卻有大量的既有代碼,已經(jīng)使用C++去做他們的產(chǎn)品的公司,在很長(zhǎng)一段時(shí)間之內(nèi)幾乎是不可能用別的語(yǔ)言重寫(xiě)代碼的,正如Joel所說(shuō),決定重寫(xiě)一個(gè)非平凡的代碼基==自殺。所以,我們至少要注意以下兩個(gè)明顯的事實(shí)