編輯推薦
最新標準C++11發布,距上一版本已10年;本書是唯一持續更新的全球頂級C++讀本。
多位深孚眾望的大師組合堪稱絕無僅有;經過前四個版本積累,第5版的體例堪稱完美。
這一版本作者歷時3年完成,極力避免在原版上升級,而是將C++ 11的新特性真正融入各章節;更將所有代碼示例用C++ 11的簡化寫法完成,而不是僅單獨增加內容。
作者簡介
Stanley B. Lippman是微軟公司VisualC++團隊的架構師。他從1984年開始在貝爾實驗室與C++的設計者Bjarne Stroustrup一起從事C++的設計與開發。他在迪士尼和夢工廠從事動畫製作,還擔任過JPL的高級顧問。
Josée Lajoie曾經是IBM加拿大研究中心C/C++編譯器開發團隊的成員,在ISO C++標準委員會工作了7年,擔任過ISO核心語言工作組的主席和C++ Report雜誌的專欄作家。
Barbara E. Moo是擁有25年軟體經驗的獨立諮詢顧問。在AT&T,她與Stroustrup、Lippman一起管理過複雜的C++開發項目。
媒體評論
這本CP5完全可以當做參考書或者字典來用,在語法上遇到什麼問題或者編譯有問題都可以再這本書里找答案,CP4是非常權威的,畢竟Lippman大大是第一個C++編譯器的實現者之一。
這本書的寫作方式實在適合國人。他沒有中國作家普遍的“講概念”式的寫作手法,而是從因到果,由淺入深,由表及里娓娓道來,從語言的簡單用法,到為什麼這樣設計語言,你不僅能從一個語言使用者的角度看問題,更能站在一個語言設計者的角度思考這種語言的設計優劣。
這是本非常經典的C++書籍,系統全面地介紹了C++語言。本書近一千頁,可以看成是學習C++的百科全書。市面上沒有哪本其他書籍比本書論述得更廣泛,幾乎所有的C++知識點本書都有論述而且寫得還不錯。因為這點,這本書值得每一位C++程式設計師擁有。
針對C++11而新添加到書中的內容恰到好處地定義了這個新版本。作者在新版本中給出了清晰的闡述,如自動類型、decltype、列表初始化器、右值引用、move操作符、lambda表達式、智慧型指針等。僅針對C++11的延展,正是這本書的價值所在。
C++是一門強大、難學、令人痛苦,但又是如此美妙的程式語言,在工業界和學術界都可以使用,《C++ Primer(第5版)》即針對初學者,也同樣適用於有一定編程經驗的讀者,最新版本配備了C++11最新標準,是C++冬粉們書架上必備的一本經典著作。
內容簡介
這本久負盛名的 C++經典教程,時隔八年之久,終迎來史無前例的重大升級。除令全球無數程式設計師從中受益,甚至為之迷醉的——C++ 大師 Stanley B. Lippman 的豐富實踐經驗,C++標準委員會原負責人 Josée Lajoie 對C++標準的深入理解,以及C++ 先驅 Barbara E. Moo 在 C++教學方面的真知灼見外,更是基於全新的C++11標準進行了全面而徹底的內容更新。非常難能可貴的是,《C++ Primer 中文版(第5版)》所有示例均全部採用 C++11 標準改寫,這在經典升級版中極其罕見——充分體現了C++語言的重大進展及其全面實踐。書中豐富的教學輔助內容、醒目的知識點提示,以及精心組織的編程示範,讓這本書在 C++ 領域的權威地位更加不可動搖。無論是初學者入門,或是中、高級程式設計師提升,本書均為不容置疑的首選。
前言
難以計數的程式設計師已經通過舊版的C++ Primer學會了C++語言。而在這段時間中,C++本身又已成熟了許多:語言本身的關注點和程式設計社區的關注點都已大大開闊,已經從主要關注機器效率轉變為更多地關注編程效率。
2011年,C++標準委員會發布了ISO C++標準的一個重要修訂版。此修訂版是C++進化過程中的最新一步,延續了前幾個版本對編程效率的強調。新標準的主要目標是:
使語言更為統一,更易於教學
使標準庫更簡單、安全、使用更高效
使編寫高效率的抽象和庫變得更簡單
因此,在這個版本的C++ Primer中,我們進行了徹底的修改,使用了最新的C++標準。為了了解新標準是如何全面影響C++語言的,你可以看一下xxiii頁至xxv頁的新特性列表,其中列出了哪些章節涉及了C++的新特性。
新標準增加的一些特性是具有普適性的,例如用於類型推斷的auto。這些新特性使本書中的代碼更易於閱讀和理解。程式(以及程式設計師!)可以忽略類型的細節,從而更容易集中精力於程式邏輯上來。其他一些新特性,例如智慧型指針和允許移動的容器,允許我們編寫更為複雜的類,而又不必與錯綜複雜的資源管理做鬥爭。因此,在本書中開始講授如何編寫自己的類,會比第4版簡單得多。舊標準中阻擋在我們前進路上的很多細節,你我都不必再擔心了。
對於本書中涉及新標準定義的新特性的那些部分,我們都已用一個特殊的圖示標記出來了。我們希望這些提示標記對那些已經熟悉C++語言核心內容的讀者是有幫助的,可以幫助他們決定將注意力投向哪裡。對於那些可能尚不支持所有新特性的編譯器,我們還希望這些圖示能有助於解釋這類編譯器所給出的編譯錯誤信息。這是因為雖然本書中幾乎所有例子都已經用最新版本的GNU編譯器編譯通過,但我們知道一些讀者可能尚未將編譯器更新到最新版本。雖然新標準增加了大量新功能,但核心C++語言並未變化,這構成了本書的大部分內容。讀者可以藉助這些圖示來判斷哪些功能可能還沒有被自己的編譯器所支持。
為什麼選擇這本書?
現代C++語言可以看作是三部分組成的:
低級語言,大部分繼承自C語言。
現代高級語言特性,允許我們定義自己的類型以及組織大規模程式和系統。
標準庫,它利用高級特性來提供有用的數據結構和算法。
大多數C++教材按照語言進化的順序來組織其內容。首先講授C++的C子集,然後將C++的更為抽象的一些特性作為高級話題在書的最後進行介紹。這種方式存在兩個問題:讀者會陷入那些繼承自低級程式設計的細節,從而由於挫折感而放棄;讀者被強加學習一些壞習慣,隨後又需要忘記這些內容。
我們採用一種相反的方法:從一開始就介紹一些語言特性,能讓程式設計師忽略那些繼承自低級程式設計的細節。例如,在介紹和使用內置的算術和數組類型時,我們還連同介紹和使用標準庫中的類型string和vector。使用這些類型的程式更易寫、易理解且更少出錯。
太多時候,標準庫被當作一種“高級”話題來講授。很多教材不使用標準庫,而是使用基於字元數組指針和動態記憶體管理的低級程式設計技術。讓使用這種低級技術的程式正確運行,要比編寫相應的使用標準庫的C++代碼困難得多。
貫穿C++ Primer全書,我們都在強調好的風格:我們想幫助讀者直接養成好的習慣,而不是在獲得很多很複雜的知識後再去忘掉那些壞習慣。我們特彆強調那些棘手的問題,並對常見的錯誤想法和陷阱提出警告。
我們還注意解釋規則背後的基本原理——使讀者不僅知其然,還能知其所以然。我們相信,通過體會程式的工作原理,讀者會更快地鞏固對語言的理解。
雖然你不必為了學習本書而掌握C語言,但我們還是假定你了解足夠多的程式設計知識,了解至少一門現代分程式結構語言,知道如何用這門語言編寫、編譯以及運行程式。特別是,我們假定你已經使用過變數,編寫、調用過函式,也使用過編譯器。
第5版變化的內容
這一版C++ Primer的新特點是用邊欄圖示來幫助引導讀者。C++是一種龐大的程式語言,它提供了一些為特定程式設計問題定製的功能。其中一些功能對大型項目團隊有很重要的意義,但對於小型項目開發可能並無必要。因此,並非每個程式設計師都需要了解每個語言特性的所有細節。我們加入這些邊欄圖示來幫助讀者弄清哪些內容可以隨後再學習,而哪些主題是更為重要的。
對於包含C++語言基礎內容的章節,我們用一個小人正在讀書的圖示加以標記。用這個圖示標記的那些章節,涵蓋了構成語言核心部分的主題。每個人都應該閱讀並理解這些章節的內容。
對於那些涉及高級主題或特殊目的主題的章節,我們也進行了標記。在首次閱讀時,這些章節可以跳過或快速瀏覽。我們用一疊書的圖示標記這些章節,指出在這些地方,你可以放心地放下書本。快速瀏覽這些章節可能是一個好主意,這樣你就可以知道有這些特性存在。但在真正需要在自己的程式中使用這些特性之前,沒有必要花費時間仔細學習這些主題。
為了進一步引導讀者的注意力,我們還用放大鏡圖示標記了特別複雜的概念。我們希望讀者對有這種標記的章節能多花費一些時間徹底理解其中的內容。在這些章節中,至少有一些,其主題的重要性可能不是那么明顯;但我們認為,你會發現這些章節涉及的主題對理解C++語言原來至關重要。
交叉引用的廣泛使用,是本書採用的另外一種閱讀幫助。我們希望這些引用能幫助讀者容易地翻閱書中的內容,同時還能在後面的例子涉及到前面的內容時容易地跳回到前面。
沒有改變的是,C++ Primer仍是一本清晰、正確、全面的C++入門教材。我們通過給出一系列複雜度逐步增加的例子來講授這門語言,這些例子說明了語言特性,展示了如何充分用好C++語言。
本書的結構
我們首先在第I部分和第II部分中介紹了C++語言和標準庫的基礎內容。這兩部分包含的內容足夠你編寫出有意義的程式,而不是只能寫一些玩具程式。大部分程式設計師基本上都需要掌握本書這兩部分所包含的所有內容。
除了講授C++的基礎內容,第I部分和第II部分還有另外一個重要目的:通過使用標準庫中定義的抽象設施,使你更加適應高級程式設計技術。標準庫設施本身是一組抽象數據類型,通常用C++編寫。用來設計標準庫的,就是任何C++程式設計師都可以使用的用來構造類的那些語言特性。我們講授C++語言的一個經驗是,在先學習了使用設計良好的抽象類型後,讀者會發現理解如何構造自己的類型更容易了。
只有在經過全面的標準庫使用訓練,並編寫了各種標準庫所支持的抽象程式後,我們才真正進入到那些允許你編寫自己的抽象類型的C++特性中去。本書的第III部分和第IV部分介紹了如何編寫類的形式的抽象類型。第III部分包含基礎內容,第IV部分介紹更專門的語言特性。
在第III部分中,我們將介紹拷貝控制問題,以及其他一些使類能像內置類型一樣容易使用的技術。類是面向對象編程和泛型編程的基礎,第III部分也會介紹這些內容。第IV部分是C++ Primer的結束部分,它介紹了一些在組織大型複雜系統時非常有用的語言特性。此外,我們將在附錄A中總結標準庫算法。
讀者幫助
本書的每一章均以一個總結和一個術語表結束,兩者一起扼要回顧了這一章的大部分學習重點。讀者應該將這些部分作為個人備忘錄:如果你不理解某個術語,可以重新學習這一章的相應部分。
在本書中我們還使用了其他一些學習輔助:
重要的術語用加粗字型顯示;我們假定讀者已經熟悉的重要術語用粗斜體顯示。每個術語都會列在章末尾的術語表中。
貫穿全書,我們用高亮顯示來提醒讀者注意語言的重要部分,對常見的陷阱提出警告,建議好的程式設計習慣,以及提供一般性的使用提示。
為了更好地理解語言特性間和概念間的聯繫,我們提供大量向前的和向後的交叉引用。
對重要的概念和C++新程式設計師常常覺得最困難的主題,我們提供邊欄討論。
關於編譯器的注意事項
在撰寫本書時(2012年7月),編譯器提供商正在努力工作,升級編譯器以匹配最新的ISO標準。我們使用最多的編譯器是GNU編譯器4.7.0。本書中只有一小部分特性在此編譯器中尚未實現:繼承構造函式、成員函式的引用限定符以及正則表達式庫。
致謝
我們要特別感謝標準委員會幾位現任和前任委員:Dave Abrahams、Andy Koenig、Stephan T. Lavavej、Jason Merrill、John Spicer和Herb Sutter在準備本書的過程中提供的幫助。在理解新標準的一些更微妙之處,他們為我們提供了寶貴的幫助。我們還要感謝很多致力於升級GNU編譯器以實現新標準的人們。
與舊版C++ Primer中一樣,我們要感謝BjarneStroustrup不知疲倦地為C++工作以及他和作者長時間的友誼。我們還要感謝Alex Stepanov的非凡洞察力,催生了標準庫核心的容器和算法。最後,我們要感謝C++標準委員會的所有委員,感謝他們這么多年來在淨化、精煉和改進C++語言方面的辛苦工作。
我們衷心感謝審稿人:Marshall Clow、Jon Kalb、Nevin Liber、Dr. C. L. Tondo、Daveed Vandevoorde和Steve Vinoski,他們建設性的意見幫助我們對全書做出了大大小小的改進。
本書是用Latex及其發行版本中的很多包來進行排版的,我們應該感謝Latex社區成員創造出如此強大的排版工具。
最後,我們要感謝Addison-Wesley公司的優秀員工,他們指導了本書的整個出版過程:Peter Gordon,我們的編輯,他給了我們動力再次修改C++ Primer;KimBoedigheimer,保證了一切按計畫進行;Barbara Wood,她在編輯過程中找到了大量編輯錯誤;還有Elizabeth Ryan,很高興再次和她共同工作,她指導我們完成了整個設計和生產流程。
習題答案
截至到2014年,市面上還未出版該書的習題答案。但可以參考其開源版本。