-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
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++高級編程(第3版)

( 簡體 字)
作者:[美]Marc Gregoire 著 類別:1. -> 程式設計 -> C++ -> C++
譯者:張永強 譯
出版社:清華大學出版社C++高級編程(第3版) 3dWoo書號: 41619
詢問書籍請說出此書號!

缺書
NT售價: 500

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

譯者序:

前言:

  多年來,C++都是編寫性能卓越、功能強大的企業級面向對象程序的事實標準語言。盡管C++語言已經風靡全球,但是這種語言卻非常難完全掌握。專業C++程序員使用一些簡單但高效的技術,這些技術并未出現在傳統教材中;即使是經驗豐富的C++程序員也不了解C++中的某些很有用的特性。
  編程書籍往往重點描述語言的語法,而不是語言在真實世界中的應用。典型的C++教材在每一章中介紹語言中的大部分知識,講解語法并列舉示例。本書不遵循這個模式。本書并不是講解語言的大量細節并給出少量真實世界的場景,而是教你如何在真實世界中使用C++。本書還會披露一些鮮為人知的讓編程更簡單的特性,以及區分編程新手和專業程序員的編程技術。
本書讀者對象
  就算你使用了多年的C++,仍可能不熟悉C++的一些高級特性,或者仍然不具有使用這門語言的完整能力。也許你編寫過實用的C++代碼,但還想學習更多有關使用C++設計和良好的編程風格的內容。也許你是C++新手,想在入門的時候就掌握“正確”的編程方式。本書能滿足上述需求,能將你的C++技能提升到專業水準。
  因為本書專注于從對C++具有基本或中等了解水平蛻變為一名專業的C++程序員的過程,所以本書假設你對該語言具有一定程度的認識。第1章涵蓋了C++的一些基礎知識,可以當成復習材料,但是不能替代實際的語言培訓和語言使用手冊。如果你剛剛開始接觸C++,但有很豐富的C、Java或C#語言經驗,那么你應該能從第1章獲得所需的大部分知識。
  不管屬于那種情況,你都應該有很好的編程基礎。你應該知道循環、函數和變量。你應該知道如何組織一個程序,而且應該熟悉基本技術,例如遞歸。你應該了解一些常見數據結構,例如哈希表和隊列,以及有用的算法,例如排序和搜索。你不需要預先了解有關面向對象編程的知識——?這是第5章講解的內容。
  你還應該熟悉開發代碼時使用的編譯器。本書沒有提供使用具體編譯器的指南。請參閱編譯器自帶的指南。
本書主要內容
  閱讀本書是學習C++語言的一種方法,通過閱讀本書既能提升編碼質量,又能提升編程效率。本書貫穿了對C++14新特性的討論。這些新的C++14特性并沒有分離在幾個章節中,而是貫穿于全書,在有必要的情況下,幾乎所有的例子都已經更新為使用這些新特性。
  本書不僅講解C++語法和語言特性,還強調了編程方法學和良好的編程風格。本書講解的方法學覆蓋了整個軟件開發過程——從設計和編碼,到測試、調試以及團隊合作。這種方法可以讓你掌握C++語言及其語言的獨特特性,還能夠在大型軟件開發中充分利用C++語言的強大功能。
  想象一下如果有人學習了C++所有語法但是沒有看過一個C++例子的情形。他所了解的知識會讓他處于非常危險的境地。如果沒有示例的引導,他可能會認為所有源代碼都要放在程序的main()函數中,還有可能認為所有變量都應該為全局變量——?這些都不是良好的編程實踐。
  專業的C++程序員除了理解語法外,還要正確理解語言的使用方式。他們知道良好設計的重要性、面向對象編程的理論以及使用現有庫的最佳方式。他們還開發了大量有用的代碼并了解可重用的思想。
  通過閱讀和理解本書的內容,你也能成為一名專業的C++程序員。你在C++方面的知識會得到擴充,將會接觸到鮮為人知的和常被誤解的語言特性。你還將領略面向對象設計,掌握卓越的調試技能。最重要的或許是,通過閱讀本書,你會了解到大量“可重用”思想,并將這種思想貫徹到日常工作中。
  有很多好的理由讓你努力成為一名專業的C++程序員,而非只是泛泛了解C++的程序員。了解語言的真正工作原理可以提升代碼的質量。了解不同的編程方法學和過程可以讓你更好地和團隊合作。探索可重用的庫和常用的設計模式可以提升你的日常工作效率,并幫助你避免白費力氣地重復工作。所有這些學習課程都在幫助你成為更優秀的程序員,同時成為更有價值的雇員。盡管這本書不能保證你升職,但是肯定不會有壞處。
本書結構
  本書的正文部分包括5大部分。
  第I部分是C++基礎速成教程,確保讀者掌握C++的基礎知識。在速成教程后,第I部分深入討論了字符串的使用,因為字符串在示例中應用廣泛。第I部分的最后一章介紹如何編寫清晰易讀的C++代碼。
  第II部分介紹C++設計方法學。你會了解到設計的重要性、面向對象方法學和代碼重用的重要性。
  第III部分從專業的角度概述C++技術。你將學習如何創建可重用的類,以及如何利用重要的語言特性,例如繼承。你還會學習這門語言的一些不同尋常之處、輸入和輸出技術、錯誤處理、字符串本地化和正則表達式的使用,討論如何實現運算符重載,如何編寫模板。這一部分還講解C++標準庫,包括容器、迭代器、算法。你還會學習標準中的其他一些庫,例如處理時間的庫和處理隨機數的庫。
  第IV部分講解如何最大限度地使用C++。本書這一部分揭示了C++中神秘的部分,并且描述了如何使用這些更高級的特性。你會學習如何定制和擴充標準庫以滿足自己的需求、在C++中如何恰到好處地管理內存、高級模板編程的細節,包括模板元編程,以及如何通過多線程編程來充分利用多處理器和多核系統。
  第V部分重點介紹如何編寫企業級質量的軟件。你會學習當今編程組織使用的工程實踐;C++程序的調試技術;如何編寫高效的C++代碼。
  本書最后是三個附錄。附錄A列出在C++技術面試中取得成功的指南(按章分解內容),附錄B是帶注解的參考文獻列表,附錄C則總結了標準中的C++頭文件。
  本書沒有列出C++中每個類、方法和函數的參考。這些參考可在互聯網上獲得。下面是兩個很好的在線參考:
www.cppreference.com
  可使用這個在線參考,也可以下載其離線版本,在沒有連接到互聯網時使用。
www.cplusplus.com/reference/
  這些在線參考會持續更新、擴充不可能在書中出現的示例代碼和新特性。
  本書有時把這個詳細的C++參考稱為“標準庫參考”。
使用本書的條件
  要使用這本書,你只需要一臺帶有C++編譯器的計算機。本書只關注C++中的標準部分,而沒有任何編譯器廠商相關的擴展。
  本書包含了C++14標準引入的新特性。在撰寫本書時,大多數編譯器還都不能完全支持C++14所有的新特性。
  可以使用任意C++編譯器。如果還沒有C++編譯器,可以下載一個免費的。這有許多選擇。例如,對于Windows,可以選擇Microsoft Visual Studio Express 2013 for Windows Desktop,它是免費的,且包含Visual C++;對于Linux,可以使用GCC或Clang,它們也是免費的。本書的示例代碼在Visual C++和GCC上均已測試通過。
Microsoft Visual C++
  首先需要創建一個項目。啟動VC++,單擊File | New | Project,在左邊的項目模板樹中選擇Visual C++ | Win32,再在窗口中間的列表中選擇Win32 Console Application模板。在底部指定項目的名稱、保存位置,單擊OK。這會打開一個向導,單擊Next,選擇Console application和Empty Project,再單擊Finish。
  加載新項目后,就會在Solution Explorer中看到項目文件列表。如果這個停靠窗口不可見,可以選擇View | Solution Explorer。在Solution Explorer中右擊項目名,再選擇Add | NewItem 或Add | Existing Item,就可以給項目添加新文件或已有文件。
  使用Build | Build Solution編譯代碼。沒有編譯錯誤后,就可以使用Debug | Start Debugging運行它。
  
  如果程序在查看輸出之前就退出了,可以使用Debug | Start without Debugging。這會在程序末尾暫停,以便查看輸出。
GCC
  用自己喜歡的任意文本編輯器創建源代碼,保存到一個目錄下。
  要編譯代碼,打開一個終端,運行如下命令,指定要編譯的所有.cpp文件:
gcc -lstdc++ -std=c++1y -o [source2.cpp ...]
  -std=c++1y用于告訴GCC啟用C++14支持。
  例如,可以改為使用包含代碼的目錄,運行如下命令來編譯第1章的AirlineTicket示例:
gcc –lstdc++ -std=c++1y -o AirlineTicket AirlineTicket.cpp AirlineTicketTest.cpp
  沒有編譯錯誤后,就可以使用如下命令運行它:
./AirlineTicket
約定
  為了幫助你更好地理解正文內容,全書中使用了一些約定。
  
  
  
  
  
  
  C++14標準特定的段落或章節的左側有一個小型的C++14圖標,如左側所示。
p2p.wrox.com
  要與作者和同行討論,請加入p2p.wrox.com上的P2P論壇。這個論壇是一個基于Web的系統,便于你張貼與Wrox圖書相關的消息和相關技術,與其他讀者和技術用戶交流心得。該論壇提供了訂閱功能,當論壇上有新的消息時,它可以給你傳送感興趣的論題。Wrox作者、編輯和其他業界專家和讀者都會到這個論壇上來探討問題。
  在http://p2p.wrox.com上,有許多不同的論壇,它們不僅有助于閱讀本書,還有助于開發自己的應用程序。要加入論壇,可以遵循下面的步驟:
  (1) 進入p2p.wrox.com,單擊Register鏈接。
  (2) 閱讀使用協議,并單擊Agree按鈕。
  (3) 填寫加入該論壇所需要的信息和自己希望提供的其他信息,單擊Submit按鈕。
  (4) 你會收到一封電子郵件,其中的信息描述了如何驗證賬戶,完成加入過程。
  
  
  
  
  加入論壇后,就可以張貼新消息,響應其他用戶張貼的消息。可以隨時在Web上閱讀消息。如果要讓該網站給自己發送特定論壇中的消息,可以單擊論壇列表中該論壇名旁邊的Subscribe to this Forum圖標。
  關于使用Wrox P2P的更多信息,可閱讀P2P FAQ,了解論壇軟件的工作情況以及P2P和Wrox圖書的許多常見問題。要閱讀FAQ,可以在任意P2P頁面上單擊FAQ鏈接。
勘誤表
  盡管我們已經盡了各種努力來保證文章或代碼中不出現錯誤,但是錯誤總是難免的,如果你在本書中找到了錯誤,例如拼寫錯誤或代碼錯誤,請告訴我們,我們將非常感激。通過勘誤表,可以讓其他讀者避免受挫,當然,這還有助于提供更高質量的信息。
  請給wkservice@vip.163.com發電子郵件,我們就會檢查你的信息,如果是正確的,我們將在本書的后續版本中采用。
  要在網站上找到本書的勘誤表,可以登錄http://www.wrox.com,通過Search工具或書名列表查找本書,然后在本書的細目頁面上,單擊Book Errata鏈接。在這個頁面上可以查看到Wrox編輯已提交和粘貼的所有勘誤項。完整的圖書列表還包括每本書的勘誤表,網址是www.wrox.com/misc-pages/booklist.shtml。
源代碼
  讀者在學習本書中的示例時,可以手動輸入所有的代碼,也可以使用本書附帶的源代碼文件。本書使用的所有源代碼都可以從本書合作站點http://www.wrox.com/go/proc++3e下載。
  另外,也可以進入http://www.wrox.com/dynamic/books/download.aspx上的Wrox代碼下載主頁,查看本書和其他Wrox圖書的所有代碼。
  還可以訪問www.tupwk.com.cn/downpage,輸入中文版ISBN或中文書名來下載源代碼。
  
  
  
  
  下載代碼后,只需用自己喜歡的解壓縮軟件對它進行解壓縮即可。
  
C++高級編程(第3版)
  
前 言
  
  VIII
  
  
  IX
  
  
  
  
  
  
內容簡介:

《C++高級編程(第3版) 是設計和構建C++應用程序的實用指南,代碼豐富,并根據C++14版本做了全面更新。本書強調良好編程風格的重要性,闡述如何設計可充分利用C++語言功能的高效解決方案;深入探討C++語言功能集的更復雜元素,并披露避開常見陷阱的技巧。本書醒目顯示了新的C++14信息,使你快速了解影響應用程序構建的顯著變化。

目錄:

第I部分 專業的C++簡介
第1章 C++和STL速成 3
1.1 C++基礎知識 3
1.1.1 小程序“hello world” 4
1.1.2 名稱空間 6
1.1.3 變量 8
1.1.4 字面量 9
1.1.5 運算符 9
1.1.6 類型 11
1.1.7 條件 13
1.1.8 數組 16
1.1.9 循環 18
1.1.10 函數 19
1.1.11 類型推斷(上) 21
1.1.12 這些都是基礎 21
1.2 深入研究C++ 21
1.2.1 指針和動態內存 22
1.2.2 引用 26
1.2.3 C++中的字符串 26
1.2.4 異常 27
1.2.5 const的多種用法 28
1.2.6 類型推斷(下) 29
1.3 作為面向對象語言的C++ 30
1.4 標準庫 32
1.5 第一個有用的C++程序 33
1.5.1 雇員記錄系統 33
1.5.2 Employee類 33
1.5.3 Database類 36
1.5.4 用戶界面 39
1.5.5 評估程序 41
1.6 本章小結 41
  
第2章 使用字符串 43
2.1 動態字符串 43
2.1.1 C風格的字符串 43
2.1.2 字符串字面量 45
2.1.3 C++ string類 46
2.1.4 原始字符串字面量 49
2.1.5 非標準字符串 50
2.2 本章小結 50
第3章 編碼風格 51
3.1 良好外觀的重要性 51
3.1.1 事先考慮 51
3.1.2 良好風格的元素 52
3.2 為代碼編寫文檔 52
3.2.1 使用注釋的原因 52
3.2.2 注釋的風格 55
3.2.3 本書的注釋 59
3.3 分解 59
3.3.1 通過重構分解 59
3.3.2 通過設計分解 60
3.3.3 本書中的分解 60
3.4 命名 60
3.4.1 選擇恰當的名稱 60
3.4.2 命名約定 61
3.5 使用具有風格的語言特性 63
3.5.1 使用常量 63
3.5.2 使用引用代替指針 63
3.5.3 使用自定義異常 64
3.6 格式 64
3.6.1 關于大括號對齊的爭論 64
3.6.2 關于空格和圓括號的爭論 65
3.6.3 空格和制表符 66
3.7 風格的挑戰 66
3.8 本章小結 66
第II部分 專業的C++軟件設計
第4章 設計專業的C++程序 69
4.1 程序設計概述 69
4.2 程序設計的重要性 70
4.3 C++設計的特點 72
4.4 C++設計的兩個原則 73
4.4.1 抽象 73
4.4.2 重用 74
4.5 重用代碼 75
4.5.1 關于術語的說明 76
4.5.2 決定是否重用代碼 76
4.5.3 重用代碼的策略 78
4.5.4 綁定第三方應用程序 82
4.5.5 開放源代碼庫 82
4.5.6 C++標準庫 83
4.6 設計模式和技巧 84
4.7 設計一個國際象棋程序 84
4.7.1 需求 84
4.7.2 設計步驟 85
4.8 本章小結 88
第5章 面向對象設計 91
5.1 過程化的思考方式 91
5.2 面向對象思想 92
5.2.1 類 92
5.2.2 組件 92
5.2.3 屬性 93
5.2.4 行為 93
5.2.5 綜合考慮 93
5.3 生活在對象世界里 94
5.5.1 過度使用對象 94
5.5.2 過于通用的對象 95
5.4 對象之間的關系 96
5.4.1 “有一個”關系 96
5.4.2 “是一個”關系(繼承) 97
5.4.3 “有一個”與“是一個”
的區別 98
5.4.4 Not-a關系 101
5.4.5 層次結構 101
5.4.6 多重繼承 102
5.4.7 混入類 103
5.5 抽象 104
5.5.1 接口與實現 104
5.5.2 決定公開的接口 104
5.5.3 設計成功的抽象 106
5.6 本章小結 106
第6章 設計可重用代碼 107
6.1 重用哲學 107
6.2 如何設計可重用的代碼 108
6.2.1 使用抽象 108
6.2.2 構建理想的重用代碼 109
6.2.3 設計有用的接口 113
6.2.4 協調通用性和使用性 116
6.3 本章小結 117
第III部分 專業的C++編碼方法
第7章 熟悉類和對象 121
7.1 電子表格示例介紹 121
7.2 編寫類 122
7.2.1 類定義 122
7.2.2 定義方法 124
7.2.3 使用對象 127
7.3 對象的生命周期 129
7.3.1 創建對象 129
7.3.2 銷毀對象 143
7.3.3 對象賦值 144
7.3.4 復制和賦值的區別 147
7.4 本章小結 148
第8章 掌握類與對象 149
8.1 對象的動態內存分配 149
8.1.1 Spreadsheet類 149
8.1.2 使用析構函數釋放內存 151
8.1.3 處理復制和賦值 152
8.2 不同的數據成員類型 158
8.2.1 靜態數據成員 158
8.2.2 常量數據成員 159
8.2.3 引用數據成員 160
8.2.4 常量引用數據成員 161
8.3 與方法有關的更多內容 162
8.3.1 靜態方法 162
8.3.2 const方法 162
8.3.3 方法重載 164
8.3.4 默認參數 165
8.3.5 內聯方法 166
8.4 嵌套類 167
8.5 類內的枚舉類型 168
8.6 友元 169
8.7 運算符重載 170
8.7.1 示例:為SpreadsheetCell
實現加法 170
8.7.2 重載算術運算符 174
8.7.3 重載比較運算符 176
8.7.4 創建具有運算符重載的類型 178
8.8 創建穩定的接口 178
8.9 本章小結 181
第9章 揭秘繼承技術 183
9.1 使用繼承構建類 183
9.1.1 擴展類 184
9.1.2 重寫方法 187
9.2 使用繼承重用代碼 190
9.2.1 WeatherPrediction類 190
9.2.2 在派生類中添加功能 191
9.2.3 在派生類中替換功能 192
9.3 利用父類 193
9.3.1 父類構造函數 193
9.3.2 父類的析構函數 194
9.3.3 使用父類方法 196
9.3.4 向上轉型和向下轉型 198
9.4 繼承與多態性 199
9.4.1 回到電子表格 199
9.4.2 設計多態性的電子表格
單元格 200
9.4.3 電子表格單元格的基類 200
9.4.4 獨立的派生類 202
9.4.5 利用多態性 204
9.4.6 考慮將來 205
9.5 多重繼承 206
9.5.1 從多個類繼承 206
9.5.2 名稱沖突和歧義基類 207
9.6 有趣而晦澀的繼承問題 210
9.6.1 修改重寫方法的特征 210
9.6.2 繼承的構造函數 214
9.6.3 重寫方法時的特殊情況 217
9.6.4 派生類中的復制構造函數和
賦值運算符 223
9.6.5 virtual的真相 224
9.6.6 運行時類型工具 227
9.6.7 非public繼承 228
9.6.8 虛基類 228
9.7 本章小結 229
第10章 理解靈活而奇特的C++ 231
10.1 引用 231
10.1.1 引用變量 232
10.1.2 引用數據成員 233
10.1.3 引用參數 234
10.1.4 引用作為返回值 235
10.1.5 使用引用還是指針 235
10.1.6 右值引用 238
10.2 關鍵字的疑問 242
10.2.1 const關鍵字 243
10.2.2 static關鍵字 246
10.2.3 非局部變量的初始化順序 249
10.2.4 非局部變量的銷毀順序 249
10.3 類型和類型轉換 250
10.3.1 typedef 250
10.3.2 函數指針typedef 251
10.3.3 類型別名 251
10.3.4 類型轉換 252
10.4 作用域解析 256
10.5 C++11/C++14 257
10.5.1 統一初始化 257
10.5.2 初始化列表 258
10.5.3 顯式轉換運算符 259
10.5.4 特性 260
10.5.5 用戶定義的字面量 260
10.6 頭文件 262
10.7 C的實用工具 263
10.7.1 變長參數列表 263
10.7.2 預處理器宏 265
10.8 本章小結 266
第11章 利用模板編寫泛型代碼 267
11.1 模板概述 268
11.2 類模板 268
11.2.1 編寫類模板 268
11.2.2 尖括號 275
11.2.3 編譯器處理模板的原理 275
11.2.4 將模板代碼分布在
多個文件中 276
11.2.5 模板參數 278
11.2.6 方法模板 280
11.2.7 模板類特例化 284
11.2.8 從類模板派生 286
11.2.9 繼承還是特例化 287
11.2.10 模板別名 287
11.2.11 替換函數語法 288
11.3 函數模板 289
11.3.1 函數模板特例化 290
11.3.2 函數模板重載 291
11.3.3 類模板的friend函數模板 292
11.4 可變模板 293
11.5 本章小結 293
第12章 C++ I/O揭秘 295
12.1 使用流 295
12.1.1 流的含義 296
12.1.2 流的來源和目標 296
12.1.3 流式輸出 297
12.1.4 流式輸入 301
12.1.5 對象的輸入輸出 306
12.2 字符串流 308
12.3 文件流 309
12.3.1 通過seek()和tell()在
文件中轉移 310
12.3.2 將流連接在一起 312
12.4 雙向I/O 312
12.5 本章小結 314
第13章 錯誤處理 315
13.1 錯誤與異常 315
13.1.1 異常的含義 316
13.1.2 C++中異常的優點 316
13.1.3 C++中異常的缺點 317
13.1.4 我們的建議 317
13.2 異常機制 317
13.2.1 拋出并捕獲異常 318
13.2.2 異常類型 321
13.2.3 拋出并捕獲多個異常 322
13.2.4 未捕獲的異常 325
13.2.5 拋出列表 326
13.3 異常與多態性 330
13.3.1 標準異常體系 330
13.3.2 在類層次結構中捕獲異常 332
13.3.3 編寫自己的異常類 333
13.3.4 嵌套異常 335
13.4 堆棧的釋放與清理 337
13.4.1 使用智能指針 338
13.4.2 捕獲、清理并重新拋出 339
13.5 常見的錯誤處理問題 339
13.5.1 內存分配錯誤 339
13.5.2 構造函數中的錯誤 342
13.5.3 構造函數的function-
try-blocks 343
13.5.4 析構函數中的錯誤 345
13.6 綜合應用 346
13.7 本章小結 350
第14章 C++運算符重載 351
14.1 運算符重載概述 351
14.1.1 重載運算符的原因 352
14.1.2 運算符重載的限制 352
14.1.3 運算符重載的選擇 352
14.1.4 不要重載的運算符 354
14.1.5 可重載運算符小結 354
14.1.6 右值引用 357
14.1.7 關系運算符 358
14.2 重載算術運算符 358
14.2.1 重載一元負號和一元正號 358
14.2.2 重載遞增和遞減運算符 359
14.3 重載按位運算符和二元
邏輯運算符 360
14.4 重載插入運算符和提取
運算符 360
14.5 重載下標運算符 362
14.5.1 通過operator[]提供
只讀訪問 364
14.5.2 非整數數組索引 365
14.6 重載函數調用運算符 366
14.7 重載解除引用運算符 367
14.7.1 實現operator* 368
14.7.2 實現operator-> 369
14.7.3 operator ->*的含義 369
14.8 編寫轉換運算符 370
14.8.1 轉換運算符的多義性問題 371
14.8.2 用于布爾表達式的轉換 372
14.9 重載內存分配和釋放運算符 373
14.9.1 new和delete的工作原理 374
14.9.2 重載operator new和
operator delete 375
14.9.3 顯式地刪除/默認化operator
new和operator delete 377
14.9.4 重載帶有額外參數的
operator new和
operator delete 377
14.10 本章小結 379
第15章 C++標準庫概述 381
15.1 編碼原則 382
15.1.1 使用模板 382
15.1.2 使用運算符重載 382
15.2 C++標準庫概述 382
15.2.1 字符串 382
15.2.2 正則表達式 382
15.2.3 I/O流 383
15.2.4 智能指針 383
15.2.5 異常 383
15.2.6 數學工具 383
15.2.7 時間工具 384
15.2.8 隨機數 384
15.2.9 初始化列表 384
15.2.10 Pair 和Tuple 384
15.2.11 函數對象 384
15.2.12 多線程 384
15.2.13 類型特質 385
15.2.14 標準模板庫 385
15.3 本章小結 397
第16章 理解容器與迭代器 399
16.1 容器概述 399
16.1.1 對元素的要求 400
16.1.2 異常和錯誤檢查 401
16.1.3 迭代器 401
16.2 順序容器 404
16.2.1 vector 404
16.2.2 vector特化 420
16.2.3 deque 420
16.2.4 list 421
16.2.5 forward_list 424
16.2.6 array 426
16.3 容器適配器 427
16.3.1 queue 427
16.3.2 priority_queue 429
16.3.3 stack 432
16.4 關聯容器 432
16.4.1 pair工具類 432
16.4.2 map 433
16.4.3 multimap 439
16.4.4 set 442
16.4.5 multiset 444
16.5 無序關聯容器/哈希表 444
16.5.1 哈希函數 444
16.5.2 unordered_map 446
16.5.3 unordered_multimap 449
16.5.4 unordered_set/unordered_
multiset 449
16.6 其他容器 449
16.6.1 標準C風格數組 449
16.6.2 string 450
16.6.3 流 451
16.6.4 bitset 451
16.7 本章小結 455
第17章 掌握STL算法 457
17.1 算法概述 457
17.1.1 find和find_if算法 458
17.1.2 accumulate算法 460
17.1.3 在算法中使用移動語義 461
17.2 lambda表達式 461
17.2.1 語法 462
17.2.2 泛型Lambda表達式 464
17.2.3 Lambda捕捉表達式 464
17.2.4 將Lambda表達式用作
返回值 465
17.2.5 將Lambda表達式
用作參數 466
17.2.6 STL算法示例 466
17.3 函數對象 467
17.3.1 算術函數對象 468
17.3.2 透明運算符仿函數 468
17.3.3 比較函數對象 469
17.3.4 邏輯函數對象 470
17.3.5 按位函數對象 470
17.3.6 函數對象適配器 470
17.3.7 編寫自己的函數對象 474
17.4 算法詳解 475
17.4.1 迭代器 475
17.4.2 非修改序列算法 476
17.4.3 修改序列算法 480
17.4.4 操作算法 486
17.4.5 分區算法 487
17.4.6 排序算法 488
17.4.7 二叉樹搜索算法 489
17.4.8 集合算法 489
17.4.9 最大/最小算法 491
17.4.10 數值處理算法 492
17.5 算法示例:審核選民登記 493
17.5.1 選民登記審核問題描述 493
17.5.2 auditVoterRolls函數 493
17.5.3 getDuplicates函數 494
17.5.4 測試auditVoterRolls函數 495
17.6 本章小結 496
第18章 字符串本地化與正則表達式 497
18.1 本地化 497
18.1.1 本地化字符串字面量 497
18.1.2 寬字符 498
18.1.3 非西方字符集 498
18.1.4 locale和facet 500
18.2 正則表達式 502
18.2.1 ECMAScript語法 503
18.2.2 regex庫 507
18.2.3 regex_match() 508
18.2.4 regex_search() 510
18.2.5 regex_iterator 512
18.2.6 regex_token_iterator 513
18.2.7 regex_replace() 515
18.3 本章小結 517
第19章 其他庫工具 519
19.1 std::function 519
19.2 有理數 521
19.3 Chrono庫 523
19.3.1 持續時間 523
19.3.2 時鐘 526
19.3.3 時點 528
19.4 生成隨機數 529
19.4.1 隨機數引擎 530
19.4.2 隨機數引擎適配器 531

19.4.3 預定義的引擎和引擎
適配器 532
19.4.4 生成隨機數 532
19.4.5 隨機數分布 533
19.5 元組 536
19.6 本章小結 539
第IV部分 掌握C++的高級特性
第20章 自定義和擴展STL 543
20.1 分配器 543
20.2 迭代器適配器 544
20.2.1 反向迭代器 544
20.2.2 流迭代器 545
20.2.3 插入迭代器 546
20.2.4 移動迭代器 547
20.3 擴展STL 548
20.3.1 擴展STL的原因 549
20.3.2 編寫STL算法 549
20.3.3 編寫STL容器 551
20.4 本章小結 582
第21章 模板的高級特性 583
21.1 深入了解模板參數 583
21.1.1 深入了解模板類型參數 583
21.1.2 模板參數模板介紹 586
21.1.3 深入了解非類型模板參數 587
21.2 模板類部分特例化 589
21.3 通過重載模擬函數部分
特例化 592
21.4 模板遞歸 593
21.4.1 N維網格:初次嘗試 593
21.4.2 真正的N維網格 595
21.5 類型推導 597
21.6 可變參數模板 600
21.6.1 類型安全的可變長度
參數列表 600
21.6.2 可變數目的混入類 602
21.7 元編程 603
21.7.1 編譯時階乘 603
21.7.2 循環展開 604
21.7.3 打印元組 605
21.7.4 類型trait 607
21.7.5 結論 612
21.8 本章小結 612
第22章 內存管理 613
22.1 使用動態內存 614
22.1.1 如何描繪內存 614
22.1.2 分配和釋放 615
22.1.3 數組 616
22.1.4 使用指針 622
22.2 數組-指針的對偶性 624
22.2.1 數組就是指針 624
22.2.2 并非所有的指針都是
數組 626
22.3 低級內存操作 626
22.3.1 指針運算 626
22.3.2 自定義內存管理 627
22.3.3 垃圾回收 627
22.3.4 對象池 628
22.3.5 函數指針 628
22.3.6 方法和數據成員的指針 630
22.4 智能指針 630
22.4.1 舊的過時的auto_ptr 631
22.4.2 shared_ptr和unique_ptr
智能指針 631
22.5 內存常見的陷阱 636
22.5.1 分配不足的字符串 637
22.5.2 訪問內存越界 637
22.5.3 內存泄漏 638
22.5.4 雙重刪除和無效指針 640
22.6 本章小結 641
第23章 C++多線程編程 643
23.1 簡介 643
23.1.1 競爭條件 645
23.1.2 死鎖 646
23.1.3 撕裂 647
23.1.4 緩存的一致性 647
23.2 線程 647
23.2.1 通過函數指針創建線程 647
23.2.2 通過函數對象創建線程 649
23.2.3 通過lambda創建線程 650
23.2.4 通過成員函數創建線程 651
23.2.5 線程本地存儲 651
23.2.6 取消線程 652
23.2.7 從線程獲得結果 652
23.2.8 復制和重新拋出異常 652
23.3 原子操作庫 654
23.3.1 原子類型示例 655
23.3.2 原子操作 657
23.4 互斥 658
23.4.1 互斥體類 658
23.4.2 鎖 660
23.4.3 std::call_once 661
23.4.4 互斥體的用法示例 663
23.5 條件變量 665
23.6 future 667
23.7 異常處理 669
23.8 示例:多線程日志記錄器類 669
23.9 線程池 673
23.10 線程設計和最佳實踐 674
23.11 本章小結 675
第V部分 C++軟件工程
第24章 充分利用軟件工程方法 679
24.1 過程的必要性 679
24.2 軟件生命周期模型 680
24.2.1 分段模型和瀑布模型 680
24.2.2 螺旋模型 683
24.2.3 Rational統一過程 685
24.3 軟件工程方法學 686
24.3.1 敏捷 686
24.3.2 Scrum 686
24.3.3 極限編程 688
24.3.4 軟件分流 691
24.4 構建自己的過程和方法 691
24.4.1 對新思想采取開放態度 692
24.4.2 提出新想法 692
24.4.3 知道什么行得通
什么行不通 692
24.4.4 不要逃避 692
24.5 源代碼控制 692
24.6 本章小結 694
第25章 編寫高效的C++程序 695
25.1 性能和效率概述 695
25.1.1 提升效率的兩種方式 696
25.1.2 兩種程序 696
25.1.3 C++是不是低效的語言 696
25.2 語言層次的效率 696
25.2.1 高效地操縱對象 697
25.2.2 使用內聯方法和函數 700
25.3 設計層次的效率 700
25.3.1 盡可能多地緩存 701
25.3.2 使用對象池 701
25.4 剖析 705
25.4.1 使用gprof的剖析范例 705
25.4.2 使用Visual C++ 2013的
剖析范例 713
25.5 本章小結 716
第26章 熟練掌握調試技術 717
26.1 調試的基本定律 717
26.2 bug分類學 718
26.3 避免bug 718
26.4 為bug做好規劃 719
26.4.1 錯誤日志 719
26.4.2 調試跟蹤 720
26.4.3 斷言 727
26.4.4 靜態斷言 728
26.4.5 崩潰轉儲 729
26.5 調試技術 729
26.5.1 重現bug 729
26.5.2 調試可重復的bug 730
26.5.3 調試不可重現的bug 730
26.5.4 調試退化 731
26.5.5 調試內存問題 731
26.5.6 調試多線程程序 735
26.5.7 調試示例:文章引用 736
26.5.8 從ArticleCitations示例中
總結的教訓 746
26.6 本章小結 747
附錄A C++面試 749
附錄B 帶注解的參考文獻 767
附錄C 標準庫頭文件 777

  
C++高級編程(第3版)
  
目 錄
  
XVIII
  
  
XVII
  
  
  
  
  
  
序: