-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

C++ Primer中文版(第5版)

( 簡體 字)
作者:王剛,楊巨峰類別:1. -> 程式設計 -> C++ -> C++
譯者:
出版社:電子工業出版社C++ Primer中文版(第5版) 3dWoo書號: 36696
詢問書籍請說出此書號!

缺書
NT售價: 640

出版日:9/1/2013
頁數:848
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121155352
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

推薦序 1
C++一直是我昀為鐘情的程序設計語言,我曾經在有些場合下提到“C++正在成為一門完美的程序設計語言”。從 C++標準 1998年版本到 2011年版本的變化,基本上印證了我的這一提法。原來版本中來不及引入的內容,以及語言機制中發現的一些缺陷,都在新版本中得以彌補和發展。比如新版標準中引入了無序容器,以彌補原版標準中對 hash容器的缺漏;新版標準支持移動構造函數和移動賦值運算符,以減小特定場景下對象拷貝的性能開銷。新版標準不僅在語法上增加了大量特性,而且在標準庫里也引入大量設施,使得標準庫對于 C++語言的重要性遠超從前。
“完美的程序設計語言”,聽起來很好,但代價是語言變得越來越復雜。從一個完善的類型系統或者一門程序設計語言的角度來看,新版本的 C++標準是一個里程碑,但是,從 C++學習者和使用者角度來看這未必是好事。語言的復雜性導致學習難度增加,學習周期變長;C++程序員寫出好程序的門檻也相應提高。這差不多正是 C++語言這幾年的現狀。我相信,隨著計算機科學技術的發展,這種狀況未來還會加劇。即便如此,我仍然樂于看到 C++語言走向完美。
我與《 C++ Primer》這本書的緣分從第 3版開始,2001年有機會將其翻譯成中文版本。當時,我使用 C++已將近十年,通過這本書才第一次全面地梳理了實踐中積累起來的 C++知識。本書第 3版是對 1998版標準的全面詮釋,我相信至今無出其右者。時隔 12年以后,這本書第 5版出版,雖然敘述風格跟第 3版完全不同,但它在內容上全面顧及到 2011版 C++標準。第 5版之于 2011版標準,如同第 3版之于 1998版標準,必將成為經典的學習讀本。
閱讀這本書可以全面了解 2011版本 C++標準的內容。以三位作者在 C++語言發展歷程中的經歷,本書的權威性自不容置疑:既有編譯器的開發和實踐,又參與 C++標準的制定,再加上豐富的 C++教學經歷。如果說本書第 3版是針對 C++語言的特性和設計思想來展開講述,那么,第 5版則更加像一本學習教程,由淺入深,并結合大量代碼實例來講述 C++語法和標準庫。此外,由于本書的全面性,讀者也可以將本書當作參考書,以備隨時查閱。
本書在講解的時候,常常會提到“編譯器會如何如何”,學習語言的一個境界是把自己想象成編譯器,這種要求對于一般的程序設計語言可能太高了,但是對于學習 C和 C++語言是昀理想的方法。像編譯器一樣來思考和理解 C++語言,如果暫時做不到,也不要緊,當有了一定的編寫程序經驗以后,在“揣摩”編譯器行為的過程中可逐漸掌握 C++語法特性。因此,本書值得閱讀多遍,每多讀一遍,就會加深理解。可能是考慮到篇幅的原因,本書很多地方沒有展開來透徹地講解。我相信,作者們已經在深度和廣度上做了較為理想的折中。
本書的另一個特色是將 C++的語法和標準庫融為一體來介紹。C++標準庫本身就是 C++語法的昀佳樣例,其中包含不少 C++高級特性的指導性用法。在我的程序設計經歷中,有些 C++語言特性(比如虛擬繼承),我只在標準庫中看到過實用做法。本書貫穿始終融合了 C++標準庫的知識和用法,這符合新版本 C++標準的發展和變化,也符合現代軟件開發現狀。
昀后,結合我在工程實踐中使用和倡導 C++語言的經驗,我想提一個關于學習和使用 C++語言的“兩面性”觀點。如前所述,C++語言正在走向完美,所以,C++語言值得學習(甚至研究),這些知識可以成為一切編程的基礎。然而,在實踐中,不必全面地使用 C++語言的各種特性,而應根據工程項目的實際情況,適當取舍(譬如動態類型信息、虛擬繼承、異常等特性的使用很值得商榷)。通常只鼓勵使用 C++語言的一個子集就夠了,一個值得學習和參考的例子是 Google發布的 Google C++ Style Guide。盡管在工程中只使用 C++的子集,但全面地學習 C++語言仍然是必要的,畢竟 C++語言是一個整體,并且 C++標準庫自身全面地使用了 C++語言的各種特性。我自己在過去多年的實踐中就一直恪守著這種兩面的做法。
很幸運,我有機會在本書正式出版以前讀到中文翻譯版,譯文通順,術語規范。作為經典權威之作的昀新版本,本書值得擁有。
潘愛民
2013年 8月于杭州

推薦序 2
C++11標準公布之后,C++社群出現了久違的熱情,有人甚至叫出“ C++的復興”。指望 C++回到 20世紀 90年代中期那樣的地位顯然是昧于大勢的奢望,但是 C++經歷了這么多年的打磨與起伏,其在工業界的地位已經非常穩固,在很多領域里已經是不可取代也沒必要被取代的統治者。新標準的出現能夠大大提升 C++開發的效率和質量,因此贏得歡呼也是情理之中。在這種氛圍之下,編譯器實現的速度也令人驚喜。短短兩年時間,從開源的 GCC、LLVM到專有的 Visual C++和 Intel C++,對于新標準的追蹤之快,覆蓋之全,與當年 C++98標準頒布之后遲遲不能落地的窘境相比,可謂對比強烈。當年是熱情的開發者反復敦促廠商實現完整標準而不得,為此沮喪無奈,那種心情,至今記憶猶新。時過境遷,今天是編譯器實現遠遠沖在前面,開發者倒是大大地落在了后面。
時至今日,能夠基本了解 C++11標準的程序員恐怕不多,而能夠以新的 C++風格開發實踐的人更是鳳毛麟角。因此,今天的 C++開發者面臨的一個重要任務就是快速掌握新的 C++風格和工具。
而說到教授“正宗的”C++11編程風格,《C++ Primer(第 5版)》如同它之前的版本一樣,扮演著法定教科書的角色。
一種優秀的編程語言,一定要對于計算這件事情實現一個完整和自洽的抽象。十幾年來編程語言領域的競爭,除卻實現質量之外,基本上是在比拼抽象的設計。而 C語言之所以四十年長盛不衰,根本在于它對于現代計算機提供了一個底層的高級抽象:凡是比它低的抽象都過于簡陋,凡是比它高的抽象都可以用 C語言構造出來。C++成功的根本原因,恰恰是因為它雖然試圖提供一些高級的抽象機制,但是其根基與 C在同一層面。正因為如此,每當你需要走下去直接與硬件對話時, C++成為 C之外唯一有效率的選擇。我的一個朋友在進行了多年的大型系統軟件開發之后,不無感慨地說,C++昀大的力量不在于其抽象,恰恰在于其不抽象。
話雖然如此,但是 C++之所以脫離 C而存在,畢竟還是因為其強大的抽象能力。Bjarne Stroustrup曾經總結說,C++同時支持 4種不同的編程風格:C風格、基于對象、面向對象和泛型。事實上,把微軟的 COM也算進來的話,還可以加上一種“基于組件”的風格。這么多的風格共存于一種語言,就是其強大抽象機制的證明。但是,在 C++11以前,C++的抽象可以說存在若干缺陷,其中昀嚴重的是缺少自動內存管理和對象級別的消息發送機制。今天看來, C++98只能說是特定歷史條件造成的半成品,無論是從語言機制,還是標準庫完備程度來說,可以說都存在明顯的、不容忽略的缺陷。其直接后果,就是優雅性的缺失和效率的降低。我本人在十年前曾經與當時中國 C++社群中不少杰出的人物交流探討,試圖從 C++98中剪裁出一個小巧、優雅的、自成一體的子集,希望至少在日常編程中,能夠在這個子集之內可以寫出與當時的 Java和 C#同樣干凈明晰的代碼。為此我們嘗試了各種古怪的模板技巧,并且到處尋找有啟發的代碼和經驗來構造這個語言子集,結果并不理想,甚至可以說是令人非常失望。后來我在我的博客中發表過好幾篇文章,探討所謂的 C++風格問題,其實就是說,C++不支持簡潔明快的面向對象風格,大家還不如回到基于對象甚至 C語言的風格,昀多加點模板,省一點代碼量。非要面向對象的話,就必須依賴像 Qt或者 MFC那樣的基礎設施才可以。
C++11出來之后,增強的語言機制和大為完善的標準庫,為 C++語言的編程風格帶來了革命性的變化。如果能夠純熟地運用 C++11的新特征、新機制,那么就能夠形成一種簡潔優雅的 C++編程風格,以比以前更高的效率、更好的質量進行軟件開發。對于這種新的風格,我認為“直覺、自然”是昀佳的描述。也就是說,解決任何問題不必拘泥于什么籠蓋一切的編程思想,也不再沉溺于各種古怪的模板技巧中無法自拔,而是能夠根據那個問題本身采用昀自然、昀符合直覺的方式。C++有自己的一套思維方式,比如容器、算法、作為概念抽象的對象等,很大程度上這套思維方式確實是合乎直覺的。只有到了 C++11這一代,C++語言的高級抽象才基本完備,這樣一種風格才可能真正落實。因此可以說 C++11對于 C++98而言,不是一次簡單的升級,而是一次本質的躍升。
學習新的 C++風格,并不是輕而易舉的事情。即便對于以前已經精通 C++的人來說,熟練掌握 rvalue reference、move語義,了解 unique_ptr、shared_ptr和 weak_ptr的完整用法,明智地使用 function/bind和 lambda機制,學習 C++ Concurrency的新技術,都絕非一朝一夕之功。對于那些初學者來說,這件事情更不簡單。
本書無論對于初學者還是提高者,都是昀經典的教科全書。一直以來,它的特點就是完整而詳細,基本上關于語言本身的問題,都可以在這本書里得到解決。而本書的另一個重要優點,就是其完全基于新的編程風格編寫,所有的例子和講解都遵循 C++11標準所體現出來的思路和風格進行,如果能夠踏下心來認真學習和練習,那么就能“一次到位”地掌握 C++11,盡管可能會比較慢。有經驗的 C++開發者閱讀這本書當然不用從頭到尾,選擇自己關心的內容學習 C++11的新特性就可以,是快速提升自身能力的捷徑。
差不多十年前,我提出一個觀點,每一個具體的技術領域,只需要讀四五本書就夠了。以前的 C++是個例外,因為語言設計有缺陷,所以要讀很多書才知道如何繞過缺陷。現在的 C++11完全可以了,大家讀四五本書就可以達到合格的水平,這恰恰是語言進步的體現。
本書是這四五本中的一本,而且是“教程+參考書”,扛梁之作,初學者的不二法門。另一本是《 C++標準程序庫》,對于 C++熟手來說更為快捷。Scott Meyers的 Effective C++永遠是學習 C++者必讀的,只不過這本書的第 4版不知道什么時候出來。Anthony Williams的 C++ Concurrency in Action是學習用標準 C++開發并發程序的昀佳選擇。國內的作品,我則高度推薦陳碩的《Linux多線程服務端編程》。這本書的名字趕跑了不少潛在的讀者,所以我要特別說明一下。這本書是 C++開發的高水平作品,與其說是教你怎么用 C++寫服務端開發,不如說是教你如何以服務端開發為例子提升 C++開發水平。前面幾本書都是談標準 C++自己的事情,碰到像 iostream這樣失敗的標準組件也不得不硬著頭皮介紹。而這本書是接地氣的實踐結晶,告訴你面對具體問題時應怎樣權衡,C++里什么好用,什么不好用,為什么,等等。
今天的 C++學習者是非常幸運的,可以在 C++11這個基礎上大步向前,不必再因為那些語言的缺陷和過度的技巧而煩惱。大家靜下心來認真讀幾本書,可以打下很好的基礎。
孟巖
2013年 8月于北京


前言
難以計數的程序員已經通過舊版的《 C++ Primer》學會了 C++語言。而在這段時間中, C++本身又已成熟了許多:語言本身的關注點和程序設計社區的關注點都已大大開闊,已經從主要關注機器效率轉變為更多地關注編程效率。
2011年,C++標準委員會發布了 ISO C++標準的一個重要修訂版。此修訂版是 C++進化過程中的昀新一步,延續了前幾個版本對編程效率的強調。新標準的主要目標是:
.使語言更為統一,更易于教學
.使標準庫更簡單、安全、使用更高效
.使編寫高效率的抽象和庫變得更簡單
因此,在這個版本的《 C++ Primer》中,我們進行了徹底的修改,使用了昀新的 C++標準,即 C++11。為了了解新標準是如何全面影響 C++語言的,你可以看一下 XXIII頁至 XXV頁的新特性列表,其中列出了哪些章節涉及了 C++的新特性。
新標準增加的一些特性是具有普適性的,例如用于類型推斷的 auto。這些新特性使本書中的代碼更易于閱讀和理解。程序(以及程序員!)可以忽略類型的細節,從而更容易集中精力于程序邏輯上來。其他一些新特性,例如智能指針和允許移動的容器,允許我們編寫更為復雜的類,而又不必與錯綜復雜的資源管理做斗爭。因此,在本書中開始講授如何編寫自己的類,會比第 4版簡單得多。舊標準中阻擋在我們前進路上的很多細節,你我都不必再擔心了。
對于本書中涉及新標準定義的新特性的那些部分,我們都已用一個特殊的圖標標記出來了。我們希望這些提示標記對那些已經熟悉 C++語言核心內容的讀者是有幫助的,可以幫助他們決定將注意力投向哪里。對于那些可能尚不支持所有新特性的編譯器,我們還希望這些圖標能有助于解釋這類編譯器所給出的編譯錯誤信息。這是因為雖然本書中幾乎所有例子都已經用昀新版本的 GNU編譯器編譯通過,但我們知道一些讀者可能尚未將編譯器更新到昀新版本。雖然新標準增加了大量新功能,但核心 C++語言并未變化,這構成了本書的大部分內容。讀者可以借助這些圖標來判斷哪些功能可能還沒有被自己的編譯器所支持。
為什么選擇這本書?
現代 C++語言可以看作是三部分組成的:
.低級語言,大部分繼承自 C語言。
.現代高級語言特性,允許我們定義自己的類型以及組織大規模程序和系統。
.標準庫,它利用高級特性來提供有用的數據結構和算法。
大多數 C++教材按照語言進化的順序來組織其內容。首先講授 C++的 C子集,然后將 C++的更為抽象的一些特性作為高級話題在書的昀后進行介紹。這種方式存在兩個問題:讀者會陷入那些繼承自低級程序設計的細節,從而由于挫折感而放棄;讀者被強加學習一些壞習慣,隨后又需要忘記這些內容。
我們采用一種相反的方法:從一開始就介紹一些語言特性,能讓程序員忽略那些繼承自低級程序設計的細節。例如,在介紹和使用內置的算術和數組類型時,我們還連同介紹和使用標準庫中的類型 string和 vector。使用這些類型的程序更易寫、易理解且更少出錯。
太多時候,標準庫被當作一種“高級”話題來講授。很多教材不使用標準庫,而是使用基于字符數組指針和動態內存管理的低級程序設計技術。讓使用這種低級技術的程序正確運行,要比編寫相應的使用標準庫的 C++代碼困難得多。
貫穿全書,我們都在強調好的風格:我們想幫助讀者直接養成好的習慣,而不是在獲得很多很復雜的知識后再去忘掉那些壞習慣。我們特別強調那些棘手的問題,并對常見的錯誤想法和陷阱提出警告。
我們還注意解釋規則背后的基本原理——使讀者不僅知其然,還能知其所以然。我們相信,通過體會程序的工作原理,讀者會更快地鞏固對語言的理解。
雖然你不必為了學習本書而掌握 C語言,但我們還是假定你了解足夠多的程序設計知識,了解至少一門現代分程序結構語言,知道如何用這門語言編寫、編譯以及運行程序。特別是,我們假定你已經使用過變量,編寫、調用過函數,也使用過編譯器。
第 5版變化的內容
這一版《C++ Primer》的新特點是用邊欄圖標來幫助引導讀者。C++是一種龐大的編程語言,它提供了一些為特定程序設計問題定制的功能。其中一些功能對大型項目團隊有很重要的意義,但對于小型項目開發可能并無必要。因此,并非每個程序員都需要了解每種語言特性的所有細節。我們加入這些邊欄圖標來幫助讀者弄清哪些內容可以隨后再學習,而哪些主題是更為重要的。
對于包含 C++語言基礎內容的章節,我們用一個小人正在讀書的圖標加以標記。用這個圖標標記的那些章節,涵蓋了構成語言核心部分的主題。每個人都應該閱讀并理解這些章節的內容。
對于那些涉及高級主題或特殊目的主題的章節,我們也進行了標記。在首次閱讀時,這些章節可以跳過或快速瀏覽。我們用一疊書的圖標標記這些章節,指出在這些地方,你可以放心地放下書本。快速瀏覽這些章節可能是一個好主意,這樣你就可以知道有這些特性存在。但在真正需要在自己的程序中使用這些特性之前,沒有必要花費時間仔細學習這些主題。
為了進一步引導讀者的注意力,我們還用放大鏡圖標標記了特別復雜的概念。我們希望讀者對有這種標記的章節能多花費一些時間徹底理解其中的內容。在這些章節中,至少有一些,其主題的重要性可能不是那么明顯;但我們認為,你會發現這些章節涉及的主題對理解 C++語言原來至關重要。
交叉引用的廣泛使用,是本書采用的另外一種閱讀幫助。我們希望這些引用能幫助讀者容易地翻閱書中的內容,同時還能在后面的例子涉及到前面的內容時容易地跳回到前面。
沒有改變的是,《C++ Primer》仍是一本清晰、正確、全面的 C++入門教材。我們通過給出一系列復雜度逐步增加的例子來講授這門語言,這些例子說明了語言特性,展示了如何充分用好 C++語言。



前言 XI
本書的結構
我們首先在第 I部分和第 II部分中介紹了 C++語言和標準庫的基礎內容。這兩部分包含的內容足夠你編寫出有意義的程序,而不是只能寫一些玩具程序。大部分程序員基本上都需要掌握本書這兩部分所包含的所有內容。
除了講授 C++的基礎內容,第 I部分和第 II部分還有另外一個重要目的:通過使用標準庫中定義的抽象設施,使你更加適應高級程序設計技術。標準庫設施本身是一組抽象數據類型,通常用 C++編寫。用來設計標準庫的,就是任何 C++程序員都可以使用的用來構造類的那些語言特性。我們講授 C++語言的一個經驗是,在先學習了使用設計良好的抽象類型后,讀者會發現理解如何構造自己的類型更容易了。
只有在經過全面的標準庫使用訓練,并編寫了各種標準庫所支持的抽象程序后,我們才真正進入到那些允許你編寫自己的抽象類型的 C++特性中去。本書的第 III部分和第 IV部分介紹了如何編寫類的形式的抽象類型。第 III部分包含基礎內容,第 IV部分介紹更專門的語言特性。
在第 III部分中,我們將介紹拷貝控制問題,以及其他一些使類能像內置類型一樣容易使用的技術。類是面向對象編程和泛型編程的基礎,第 III部分也會介紹這些內容。第 IV部分是《 C++ Primer》的結束部分,它介紹了一些在組織大型復雜系統時非常有用的語言特性。此外,我們將在附錄 A中總結標準庫算法。
讀者幫助
本書的每一章均以一個總結和一個術語表結束,兩者一起扼要回顧了這一章的大部分學習重點。讀者應該將這些部分作為個人備忘錄:如果你不理解某個術語,可以重新學習這一章的相應部分。
在本書中我們還使用了其他一些學習輔助:
.重要的術語用黑體顯示,我們假定讀者已經熟悉的重要術語用楷體顯示。每個術語
都會列在章末尾的術語表中。
.貫穿全書,我們用灰底襯托的方式來提醒讀者需要注意的重要部分,對常見的陷阱
提出警告,建議好的程序設計習慣,以及提供一般性的使用提示。
.為了更好地理解語言特性間和概念間的聯系,我們提供大量向前的和向后的交叉
引用。
.對重要的概念和 C++新程序員常常覺得困難的主題,我們提供邊欄討論。
.學習任何程序設計語言都需要編寫程序。為此,貫穿全書我們提供大量程序示例。
擴展示例的源碼可從下面的網址獲得:
http://www.informit.com/title/0321714113
.正文中切口處以“
”形式標注的頁碼為英文原書頁碼,便于讀者與英文原版書進行對照閱讀。
關于編譯器的注意事項
在撰寫本書時(2012年 7月),編譯器提供商正在努力工作,升級編譯器以匹配昀新的 ISO標準。我們使用昀多的編譯器是 GNU編譯器 4.7.0。本書中只有一小部分特性在此編譯器中尚未實現:繼承構造函數、成員函數的引用限定符以及正則表達式庫。
致謝
我們要特別感謝標準委員會幾位現任和前任委員:Dave Abrahams、Andy Koenig、 Stephan T. Lavavej、Jason Merrill、John Spicer和 Herb Sutter在準備本書的過程中提供的幫助。在理解新標準的一些更微妙之處,他們為我們提供了寶貴的幫助。我們還要感謝很多致力于升級 GNU編譯器以實現新標準的人們。
與舊版《C++ Primer》中一樣,我們要感謝 Bjarne Stroustrup不知疲倦地為 C++工作以及他和作者長時間的友誼。我們還要感謝 Alex Stepanov的非凡洞察力,催生了標準庫核心的容器和算法。昀后,我們要感謝 C++標準委員會的所有委員,感謝他們這么多年來在凈化、精煉和改進 C++語言方面的辛苦工作。
我們衷心感謝審稿人:Marshall Clow、Jon Kalb、Nevin Liber、Dr. C. L. Tondo、Daveed Vandevoorde和 Steve Vinoski,他們建設性的意見幫助我們對全書做出了大大小小的改進。
最后,我們要感謝 Addison-Wesley公司的優秀員工,他們指導了本書的整個出版過程: Peter Gordon,我們的編輯,他給了我們動力再次修改 C++ Primer;Kim Boedigheimer,保證了一切按計劃進行;Barbara Wood,她在編輯過程中找到了大量編輯錯誤;還有 Elizabeth Ryan,很高興再次和她共同工作,她指導我們完成了整個設計和生產流程。
內容簡介:

這本久負盛名的C++經典教程,時隔八年之久,終于迎來史無前例的重大升級。除令全球無數程序員從中受益,甚至為之迷醉的——C++大師Stanley B. Lippman的豐富實踐經驗,C++標準委員會原負責人Josee Lajoie對C++標準的深入理解,以及C++先驅Barbara E. Moo在C++教學方面的真知灼見外,更是基于全新的C++11標準進行了全面而徹底的內容更新。非常難能可貴的是,書中所有示例均全部采用C++11標準改寫,這在經典升級版中極其罕見——充分體現了C++語言的重大進展及其全面實踐。書中豐富的教學輔助內容、醒目的知識點提示,以及精心組織的編程示范,讓這本書在C++領域的權威地位更加不可動搖。
無論是初學者入門,或是中高級程序員提升使用,本書均為不容置疑的首選。

目錄:

第1章 開始 1
1.1 編寫一個簡單的C++程序 2
1.1.1 編譯、運行程序 3
1.2 初識輸入輸出 5
1.3 注釋簡介 8
1.4 控制流 10
1.4.1 while語句 10
1.4.2 for語句 11
1.4.3 讀取數量不定的輸入數據 13
1.4.4 if語句 15
1.5 類簡介 17
1.5.1 Sales_item類 17
1.5.2 初識成員函數 20
1.6 書店程序 21
小結 23
術語表 23
第Ⅰ部分 C++基礎 27
第2章 變量和基本類型 29
2.1 基本內置類型 30
2.1.1 算術類型 30
2.1.2 類型轉換 32
2.1.3 字面值常量 35
2.2 變量 38
2.2.1 變量定義 38
2.2.2 變量聲明和定義的關系 41
2.2.3 標識符 42
2.2.4 名字的作用域 43
2.3 復合類型 45
2.3.1 引用 45
2.3.2 指針 47
2.3.3 理解復合類型的聲明 51
2.4 const限定符 53
2.4.1 const的引用 54
2.4.2 指針和const 56
2.4.3 頂層const 57
2.4.4 constexpr和常量表達式 58
2.5 處理類型 60
2.5.1 類型別名 60
2.5.2 auto類型說明符 61
2.5.3 decltype類型指示符 62
2.6 自定義數據結構 64
2.6.1 定義Sales_data類型 64
2.6.2 使用Sales_data類 66
2.6.3 編寫自己的頭文件 67
小結 69
術語表 69
第3章 字符串、向量和數組 73
3.1 命名空間的using聲明 74
3.2 標準庫類型string 75
3.2.1 定義和初始化string對象 76
3.2.2 string對象上的操作 77
3.2.3 處理string對象中的字符 81
3.3 標準庫類型vector 86
3.3.1 定義和初始化vector對象 87
3.3.2 向vector對象中添加元素 90
3.3.3 其他vector操作 91
3.4 迭代器介紹 95
3.4.1 使用迭代器 95
3.4.2 迭代器運算 99
3.5 數組 101
3.5.1 定義和初始化內置數組 101
3.5.2 訪問數組元素 103
3.5.3 指針和數組 105
3.5.4 C風格字符串 109
3.5.5 與舊代碼的接口 111
3.6 多維數組 112
小結 117
術語表 117
第4章 表達式 119
4.1 基礎 120
4.1.1 基本概念 120
4.1.2 優先級與結合律 121
4.1.3 求值順序 123
4.2 算術運算符 124
4.3 邏輯和關系運算符 126
4.4 賦值運算符 129
4.5 遞增和遞減運算符 131
4.6 成員訪問運算符 133
4.7 條件運算符 134
4.8 位運算符 135
4.9 sizeof運算符 139
4.10 逗號運算符 140
4.11 類型轉換 141
4.11.1 算術轉換 142
4.11.2 其他隱式類型轉換 143
4.11.3 顯式轉換 144
4.12 運算符優先級表 147
小結 149
術語表 149
第5章 語句 153
5.1 簡單語句 154
5.2 語句作用域 155
5.3 條件語句 156
5.3.1 if語句 156
5.3.2 switch語句 159
5.4 迭代語句 165
5.4.1 while語句 165
5.4.2 傳統的for語句 166
5.4.3 范圍for語句 168
5.4.4 do while語句 169
5.5 跳轉語句 170
5.5.1 break語句 170
5.5.2 continue語句 171
5.5.3 goto語句 172
5.6 try語句塊和異常處理 172
5.6.1 throw表達式 173
5.6.2 try語句塊 174
5.6.3 標準異常 176
小結 178
術語表 178
第6章 函數 181
6.1 函數基礎 182
6.1.1 局部對象 184
6.1.2 函數聲明 186
6.1.3 分離式編譯 186
6.2 參數傳遞 187
6.2.1 傳值參數 187
6.2.2 傳引用參數 188
6.2.3 const形參和實參 190
6.2.4 數組形參 193
6.2.5 main:處理命令行選項 196
6.2.6 含有可變形參的函數 197
6.3 返回類型和return語句 199
6.3.1 無返回值函數 200
6.3.2 有返回值函數 200
6.3.3 返回數組指針 205
6.4 函數重載 206
6.4.1 重載與作用域 210
6.5 特殊用途語言特性 211
6.5.1 默認實參 211
6.5.2 內聯函數和constexpr函數 213
6.5.3 調試幫助 215
6.6 函數匹配 217
6.6.1 實參類型轉換 219
6.7 函數指針 221
小結 225
術語表 225
第7章 類 227
7.1 定義抽象數據類型 228
7.1.1 設計Sales_data類 228
7.1.2 定義改進的Sales_data類 230
7.1.3 定義類相關的非成員函數 234
7.1.4 構造函數 235
7.1.5 拷貝、賦值和析構 239
7.2 訪問控制與封裝 240
7.2.1 友元 241
7.3 類的其他特性 243
7.3.1 類成員再探 243
7.3.2 返回*this的成員函數 246
7.3.3 類類型 249
7.3.4 友元再探 250
7.4 類的作用域 253
7.4.1 名字查找與類的作用域 254
7.5 構造函數再探 257
7.5.1 構造函數初始值列表 258
7.5.2 委托構造函數 261
7.5.3 默認構造函數的作用 262
7.5.4 隱式的類類型轉換 263
7.5.5 聚合類 266
7.5.6 字面值常量類 267
7.6 類的靜態成員 268
小結 273
術語表 273
第Ⅱ部分 C++標準庫 275
第8章 IO庫 277
8.1 IO類 278
8.1.1 IO對象無拷貝或賦值 279
8.1.2 條件狀態 279
8.1.3 管理輸出緩沖 281
8.2 文件輸入輸出 283
8.2.1 使用文件流對象 284
8.2.2 文件模式 286
8.3 string流 287
8.3.1 使用istringstream 287
8.3.2 使用ostringstream 289
小結 290
術語表 290
第9章 順序容器 291
9.1 順序容器概述 292
9.2 容器庫概覽 294
9.2.1 迭代器 296
9.2.2 容器類型成員 297
9.2.3 begin和end成員 298
9.2.4 容器定義和初始化 299
9.2.5 賦值和swap 302
9.2.6 容器大小操作 304
9.2.7 關系運算符 304
9.3 順序容器操作 305
9.3.1 向順序容器添加元素 305
9.3.2 訪問元素 309
9.3.3 刪除元素 311
9.3.4 特殊的forward_list操作 312
9.3.5 改變容器大小 314
9.3.6 容器操作可能使迭代器失效 315
9.4 vector對象是如何增長的 317
9.5 額外的string操作 320
9.5.1 構造string的其他方法 321
9.5.2 改變string的其他方法 322
9.5.3 string搜索操作 325
9.5.4 compare函數 327
9.5.5 數值轉換 327
9.6 容器適配器 329
小結 332
術語表 332
第10章 泛型算法 335
10.1 概述 336
10.2 初識泛型算法 338
10.2.1 只讀算法 338
10.2.2 寫容器元素的算法 339
10.2.3 重排容器元素的算法 342
10.3 定制操作 344
10.3.1 向算法傳遞函數 344
10.3.2 lambda表達式 345
10.3.3 lambda捕獲和返回 349
10.3.4 參數綁定 354
10.4 再探迭代器 357
10.4.1 插入迭代器 358
10.4.2 iostream迭代器 359
10.4.3 反向迭代器 363
10.5 泛型算法結構 365
10.5.1 5類迭代器 365
10.5.2 算法形參模式 367
10.5.3 算法命名規范 368
10.6 特定容器算法 369
小結 371
術語表 371
第11章 關聯容器 373
11.1 使用關聯容器 374
11.2 關聯容器概述 376
11.2.1 定義關聯容器 376
11.2.2 關鍵字類型的要求 378
11.2.3 pair類型 379
11.3 關聯容器操作 381
11.3.1 關聯容器迭代器 382
11.3.2 添加元素 383
11.3.3 刪除元素 386
11.3.4 map的下標操作 387
11.3.5 訪問元素 388
11.3.6 一個單詞轉換的map 391
11.4 無序容器 394
小結 397
術語表 397
第12章 動態內存 399
12.1 動態內存與智能指針 400
12.1.1 shared_ptr類 400
12.1.2 直接管理內存 407
12.1.3 shared_ptr和new結合使用 412
12.1.4 智能指針和異常 415
12.1.5 unique_ptr 417
12.1.6 weak_ptr 420
12.2 動態數組 423
12.2.1 new和數組 423
12.2.2 allocator類 427
12.3 使用標準庫:文本查詢程序 430
12.3.1 文本查詢程序設計 430
12.3.2 文本查詢程序類的定義 432
小結 436
術語表 436
第Ⅲ部分 類設計者的工具 437
第13章 拷貝控制 439
13.1 拷貝、賦值與銷毀 440
13.1.1 拷貝構造函數 440
13.1.2 拷貝賦值運算符 443
13.1.3 析構函數 444
13.1.4 三/五法則 447
13.1.5 使用=default 449
13.1.6 阻止拷貝 449
13.2 拷貝控制和資源管理 452
13.2.1 行為像值的類 453
13.2.2 定義行為像指針的類 455
13.3 交換操作 457
13.4 拷貝控制示例 460
13.5 動態內存管理類 464
13.6 對象移動 470
13.6.1 右值引用 471
13.6.2 移動構造函數和移動賦值運算符 473
13.6.3 右值引用和成員函數 481
小結 486
術語表 486
第14章 重載運算與類型轉換 489
14.1 基本概念 490
14.2 輸入和輸出運算符 494
14.2.1 重載輸出運算符<< 494
14.2.2 重載輸入運算符>> 495
14.3 算術和關系運算符 497
14.3.1 相等運算符 497
14.3.2 關系運算符 498
14.4 賦值運算符 499
14.5 下標運算符 501
14.6 遞增和遞減運算符 502
14.7 成員訪問運算符 504
14.8 函數調用運算符 506
14.8.1 lambda是函數對象 507
14.8.2 標準庫定義的函數對象 509
14.8.3 可調用對象與function 511
14.9 重載、類型轉換與運算符 514
14.9.1 類型轉換運算符 514
14.9.2 避免有二義性的類型轉換 517
14.9.3 函數匹配與重載運算符 521
小結 523
術語表 523
第15章 面向對象程序設計 525
15.1 OOP:概述 526
15.2 定義基類和派生類 527
15.2.1 定義基類 528
15.2.2 定義派生類 529
15.2.3 類型轉換與繼承 534
15.3 虛函數 536
15.4 抽象基類 540
15.5 訪問控制與繼承 542
15.6 繼承中的類作用域 547
15.7 構造函數與拷貝控制 551
15.7.1 虛析構函數 552
15.7.2 合成拷貝控制與繼承 552
15.7.3 派生類的拷貝控制成員 554
15.7.4 繼承的構造函數 557
15.8 容器與繼承 558
15.8.1 編寫Basket類 559
15.9 文本查詢程序再探 562
15.9.1 面向對象的解決方案 563
15.9.2 Query_base類和Query類 567
15.9.3 派生類 568
15.9.4 eval函數 571
小結 575
術語表 575
第16章 模板與泛型編程 577
16.1 定義模板 578
16.1.1 函數模板 578
16.1.2 類模板 583
16.1.3 模板參數 592
16.1.4 成員模板 595
16.1.5 控制實例化 597
16.1.6 效率與靈活性 599
16.2 模板實參推斷 600
16.2.1 類型轉換與模板類型參數 601
16.2.2 函數模板顯式實參 603
16.2.3 尾置返回類型與類型轉換 604
16.2.4 函數指針和實參推斷 607
16.2.5 模板實參推斷和引用 608
16.2.6 理解std::move 610
16.2.7 轉發 612
16.3 重載與模板 614
16.4 可變參數模板 618
16.4.1 編寫可變參數函數模板 620
16.4.2 包擴展 621
16.4.3 轉發參數包 622
16.5 模板特例化 624
小結 630
術語表 630
第Ⅳ部分 高級主題 633
第17章 標準庫特殊設施 635
17.1 tuple類型 636
17.1.1 定義和初始化tuple 637
17.1.2 使用tuple返回多個值 638
17.2 bitset類型 640
17.2.1 定義和初始化bitset 641
17.2.2 bitset操作 643
17.3 正則表達式 645
17.3.1 使用正則表達式庫 646
17.3.2 匹配與Regex迭代器類型 650
17.3.3 使用子表達式 653
17.3.4 使用regex_replace 657
17.4 隨機數 659
17.4.1 隨機數引擎和分布 660
17.4.2 其他隨機數分布 663
17.5 IO庫再探 666
17.5.1 格式化輸入與輸出 666
17.5.2 未格式化的輸入/輸出操作 673
17.5.3 流隨機訪問 676
小結 680
術語表 680
第18章 用于大型程序的工具 683
18.1 異常處理 684
18.1.1 拋出異常 684
18.1.2 捕獲異常 687
18.1.3 函數try語句塊與構造函數 689
18.1.4 noexcept異常說明 690
18.1.5 異常類層次 693
18.2 命名空間 695
18.2.1 命名空間定義 695
18.2.2 使用命名空間成員 701
18.2.3 類、命名空間與作用域 705
18.2.4 重載與命名空間 708
18.3 多重繼承與虛繼承 710
18.3.1 多重繼承 711
18.3.2 類型轉換與多個基類 713
18.3.3 多重繼承下的類作用域 715
18.3.4 虛繼承 717
18.3.5 構造函數與虛繼承 720
小結 722
術語表 722
第19章 特殊工具與技術 725
19.1 控制內存分配 726
19.1.1 重載new和delete 726
19.1.2 定位new表達式 729
19.2 運行時類型識別 730
19.2.1 dynamic_cast運算符 730
19.2.2 typeid運算符 732
19.2.3 使用RTTI 733
19.2.4 type_info類 735
19.3 枚舉類型 736
19.4 類成員指針 739
19.4.1 數據成員指針 740
19.4.2 成員函數指針 741
19.4.3 將成員函數用作可調用對象 744
19.5 嵌套類 746
19.6 union:一種節省空間的類 749
19.7 局部類 754
19.8 固有的不可移植的特性 755
19.8.1 位域 756
19.8.2 volatile限定符 757
19.8.3 鏈接指示:extern "C" 758
小結 762
術語表 762
附錄A 標準庫 765
A.1 標準庫名字和頭文件 766
A.2 算法概覽 770
A.2.1 查找對象的算法 771
A.2.2 其他只讀算法 772
A.2.3 二分搜索算法 772
A.2.4 寫容器元素的算法 773
A.2.5 劃分與排序算法 775
A.2.6 通用重排操作 776
A.2.7 排列算法 778
A.2.8 有序序列的集合算法 778
A.2.9 最小值和最大值 779
A.2.10 數值算法 780
A.3 隨機數 781
A.3.1 隨機數分布 781
A.3.2 隨機數引擎 783
索引 785


C++11的新特性
¬¬

2.1.1 long long類型 31
2.2.1 列表初始化 39
2.3.2 nullptr常量 48
2.4.4 constexpr變量 59
2.5.1 類型別名聲明 60
2.5.2 auto類型指示符 61
2.5.3 decltype類型指示符 62
2.6.1 類內初始化 65
3.2.2 使用auto或decltype縮寫類型 79
3.2.3 范圍for語句 82
3.3 定義vector對象的vector(向量的向量) 87
3.3.1 vector對象的列表初始化 88
3.4.1 容器的cbegin和cend函數 98
3.5.3 標準庫begin和end函數 106
3.6 使用auto和decltype簡化聲明 115
4.2 除法的舍入規則 125
4.4 用大括號包圍的值列表賦值 129
4.9 將sizeof用于類成員 139
5.4.3 范圍for語句 168
6.2.6 標準庫initializer_list類 197
6.3.2 列表初始化返回值 203
6.3.3 定義尾置返回類型 206
6.3.3 使用decltype簡化返回類型定義 206
6.5.2 constexpr函數 214
7.1.4 使用=default生成默認構造函數 237
7.3.1 類對象成員的類內初始化 246
7.5.2 委托構造函數 261
7.5.6 constexpr構造函數 268
8.2.1 用string對象處理文件名 284
9.1 array和forward_list容器 293
9.2.3 容器的cbegin和cend函數 298
9.2.4 容器的列表初始化 300
9.2.5 容器的非成員函數swap 303
9.3.1 容器insert成員的返回類型 308
9.3.1 容器的emplace成員 308
9.4 shrink_to_fit 318
9.5.5 string的數值轉換函數 327
10.3.2 lambda表達式 346
10.3.3 lambda表達式中的尾置返回類型 353
10.3.4 標準庫bind函數 354
11.2.1 關聯容器的列表初始化 377
11.2.3 列表初始化pair的返回類型 380
11.3.2 pair的列表初始化 384
11.4 無序容器 394
12.1 智能指針 400
12.1.1 shared_ptr類 400
12.1.2 動態分配對象的列表初始化 407
12.1.2 auto和動態分配 408
12.1.5 unique_ptr類 417
12.1.6 weak_ptr類 420
12.2.1 范圍for語句不能應用于動態分配數組 424
12.2.1 動態分配數組的列表初始化 424
12.2.1 auto不能用于分配數組 424
12.2.2 allocator::construct可使用任意構造函數 428
13.1.5 將=default用于拷貝控制成員 449
13.1.6 使用=default阻止拷貝類對象 449
13.5 用移動類對象代替拷貝類對象 469
13.6.1 右值引用 471
13.6.1 標準庫move函數 472
13.6.2 移動構造函數和移動賦值 473
13.6.2 移動構造函數通常應該是noexcept 473
13.6.2 移動迭代器 480
13.6.3 引用限定成員函數 483
14.8.3 function類模板 512
14.9.1 explicit類型轉換運算符 516
15.2.2 虛函數的override指示符 530
15.2.2 通過定義類為final來阻止繼承 533
15.3 虛函數的override和final指示符 538
15.7.2 刪除的拷貝控制和繼承 553
15.7.4 繼承的構造函數 557
16.1.2 聲明模板類型形參為友元 590
16.1.2 模板類型別名 590
16.1.3 模板函數的默認模板參數 594
16.1.5 實例化的顯式控制 597
16.2.3 模板函數與尾置返回類型 605
16.2.5 引用折疊規則 609
16.2.6 用static_cast將左值轉換為右值 612
16.2.7 標準庫forward函數 614
16.4 可變參數模板 618
16.4 sizeof...運算符 619
16.4.3 可變參數模板與轉發 622
17.1 標準庫tuple類模板 636
17.2.2 新的bitset運算 643
17.3 正則表達式庫 645
17.4 隨機數庫 659
17.5.1 浮點數格式控制 670
18.1.4 noexcept異常指示符 690
18.1.4 noexcept運算符 691
18.2.1 內聯命名空間 699
18.3.1 繼承的構造函數與多重繼承 712
19.3 有作用域的enum 736
19.3 說明類型用于保存enum對象 738
19.3 enum的前置聲明 738
19.4.3 標準庫mem_fn類模板 746
19.6 類類型的union成員 751
序: