C++高級編程(第3版) ( 簡體 字) |
作者:[美]Marc Gregoire 著 | 類別:1. -> 程式設計 -> C++ -> C++ |
譯者:張永強 譯 |
出版社:清華大學出版社 | 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
|
序: |