內容提要 本書是久負盛名的C++經典教程,其內容是C++大師Stanley B. Lippman豐富的實踐經驗和C++標準委員會原負責人Josée Lajoie對C++標準深入理解的完美結合,已經幫助全球無數程序員學會了C++。本版對前一版進行了徹底的修訂,內容經過了重新組織,更加入了C++先驅Barbara E.Moo在C++教學方面的真知灼見。既顯著改善了可讀性,又充分體現了C++語言的最新進展和當前的業界最佳實踐。書中不但新增大量教學輔助內容,用于強調重要的知識點,提醒常見的錯誤,推薦優秀的編程實踐,給出使用提示,還包含大量來自實戰的示例和習題。 對C++基本概念和技術全面而且權威的闡述,對現代C++編程風格的強調,使本書成為C++初學者的最佳指南;對于中高級程序員,本書也是不可或缺的參考書。 編輯推薦 . 目錄 第1章 快速入門 1 1.1 編寫簡單的C++程序 2 1.2 初窺輸入/輸出 5 1.2.1 標準輸入與輸出對象 5 1.2.2 一個使用IO庫的程序 5 1.3 關于注釋 8 1.4 控制結構 10 1.4.1 while語句 10 1.4.2 for語句 12 1.4.3 if語句 14 1.4.4 讀入未知數目的輸入 15 1.5 類的簡介 17 1.5.1 Sales_item類 17 1.5.2 初窺成員函數 19 1.6 C++程序 21 小結 22 術語 22 第一部分 基本語言 第2章 變量和基本類型 29 2.1 基本內置類型 30 2.1.1 整型 30 2.1.2 浮點型 32 2.2 字面值常量 34 2.3 變量 38 2.3.1 什么是變量 39 2.3.2 變量名 40 2.3.3 定義對象 42 2.3.4 變量初始化規則 44 2.3.5 聲明和定義 45 2.3.6 名字的作用域 46 2.3.7 在變量使用處定義變量 48 2.4 const限定符 49 2.5 引用 50 2.6 typedef名字 53 2.7 枚舉 53 2.8 類類型 54 2.9 編寫自己的頭文件 57 2.9.1 設計自己的頭文件 58 2.9.2 預處理器的簡單介紹 60 小結 62 術語 62 第3章 標準庫類型 67 3.1 命名空間的using聲明 68 3.2 標準庫string類型 70 3.2.1 string對象的定義和初始化 70 3.2.2 String對象的讀寫 71 3.2.3 string對象的操作 72 3.2.4 string對象中字符的處理 76 3.3 標準庫vector類型 78 3.3.1 vector對象的定義和初始化 79 3.3.2 vector對象的操作 81 3.4 迭代器簡介 83 3.5 標準庫bitset類型 88 3.5.1 bitset對象的定義和初始化 88 3.5.2 bitset對象上的操作 90 小結 92 術語 92 第4章 數組和指針 95 4.1 數組 96 4.1.1 數組的定義和初始化 96 4.1.2 數組操作 99 4.2 指針的引入 100 4.2.1 什么是指針 100 4.2.2 指針的定義和初始化 101 4.2.3 指針操作 104 4.2.4 使用指針訪問數組元素 106 4.2.5 指針和const限定符 110 4.3 C風格字符串 113 4.3.1 創建動態數組 117 4.3.2 新舊代碼的兼容 120 4.4 多維數組 122 小結 124 術語 125 第5章 表達式 127 5.1 算術操作符 129 5.2 關系操作符和邏輯操作符 131 5.3 位操作符 134 5.3.1 bitset對象或整型值的使用 135 5.3.2 將移位操作符用于IO 137 5.4 賦值操作符 137 5.4.1 賦值操作的右結合性 138 5.4.2 賦值操作具有低優先級 138 5.4.3 復合賦值操作符 139 5.5 自增和自減操作符 140 5.6 箭頭操作符 142 5.7 條件操作符 143 5.8 sizeof操作符 144 5.9 逗號操作符 145 5.10 復合表達式的求值 145 5.10.1 優先級 145 5.10.2 結合性 146 5.10.3 求值順序 148 5.11 new和delete表達式 150 5.12 類型轉換 154 5.12.1 何時發生隱式類型轉換 154 5.12.2 算術轉換 155 5.12.3 其他隱式轉換 156 5.12.4 顯式轉換 158 5.12.5 何時需要強制類型轉換 158 5.12.6 命名的強制類型轉換 158 5.12.7 舊式強制類型轉換 160 小結 161 術語 162 第6章 語句 165 6.1 簡單語句 166 6.2 聲明語句 167 6.3 復合語句(塊) 167 6.4 語句作用域 168 6.5 if語句 169 6.6 switch語句 172 6.6.1 使用switch 173 6.6.2 switch中的控制流 173 6.6.3 default標號 175 6.6.4 switch表達式與case標號 176 6.6.5 switch內部的變量定義 176 6.7 while語句 177 6.8 for循環語句 179 6.8.1 省略for語句頭的某些部分 180 6.8.2 for語句頭中的多個定義 181 6.9 do while語句 182 6.10 break語句 183 6.11 continue語句 184 6.12 goto語句 185 6.13 try塊和異常處理 186 6.13.1 throw表達式 186 6.13.2 try塊 187 6.13.3 標準異常 189 6.14 使用預處理器進行調試 190 小結 192 術語 192 第7章 函數 195 7.1 函數的定義 196 7.1.1 函數返回類型 197 7.1.2 函數形參表 198 7.2 參數傳遞 199 7.2.1 非引用形參 199 7.2.2 引用形參 201 7.2.3 vector和其他容器類型的形參 206 7.2.4 數組形參 206 7.2.5 傳遞給函數的數組的處理 209 7.2.6 main:處理命令行選項 210 7.2.7 含有可變形參的函數 211 7.3 return語句 211 7.3.1 沒有返回值的函數 212 7.3.2 具有返回值的函數 212 7.3.3 遞歸 216 7.4 函數聲明 217 7.5 局部對象 220 7.5.1 自動對象 220 7.5.2 靜態局部對象 220 7.6 內聯函數 221 7.7 類的成員函數 222 7.7.1 定義成員函數的函數體 223 7.7.2 在類外定義成員函數 225 7.7.3 編寫Sales_item類的構造 函數 225 7.7.4 類代碼文件的組織 227 7.8 重載函數 228 7.8.1 重載與作用域 230 7.8.2 函數匹配與實參轉換 231 7.8.3 重載確定的三個步驟 232 7.8.4 實參類型轉換 234 7.9 指向函數的指針 237 小結 239 術語 240 第8章 標準IO庫 243 8.1 面向對象的標準庫 244 8.2 條件狀態 247 8.3 輸出緩沖區的管理 249 8.4 文件的輸入和輸出 251 8.4.1 文件流對象的使用 251 8.4.2 文件模式 254 8.4.3 一個打開并檢查輸入文件的 程序 256 8.5 字符串流 257 小結 259 術語 259 第二部分 容器和算法 第9章 順序容器 263 9.1 順序容器的定義 264 9.1.1 容器元素的初始化 265 9.1.2 容器內元素的類型約束 267 9.2 迭代器和迭代器范圍 268 9.2.1 迭代器范圍 270 9.2.2 使迭代器失效的容器操作 271 9.3 順序容器的操作 272 9.3.1 容器定義的類型別名 272 9.3.2 begin和end成員 273 9.3.3 在順序容器中添加元素 273 9.3.4 關系操作符 277 9.3.5 容器大小的操作 278 9.3.6 訪問元素 279 9.3.7 刪除元素 280 9.3.8 賦值與swap 282 9.4 vector容器的自增長 284 9.5 容器的選用 287 9.6 再談string類型 289 9.6.1 構造string對象的其他方法 290 9.6.2 修改string對象的其他方法 292 9.6.3 只適用于string類型的操作 293 9.6.4 string類型的查找操作 295 9.6.5 string對象的比較 298 9.7 容器適配器 300 9.7.1 棧適配器 301 9.7.2 隊列和優先級隊列 302 小結 303 術語 303 第10章 關聯容器 305 10.1 引言:pair類型 306 10.2 關聯容器 308 10.3 map類型 309 10.3.1 map對象的定義 309 10.3.2 map定義的類型 310 10.3.3 給map添加元素 311 10.3.4 使用下標訪問map對象 311 10.3.5 map::insert的使用 313 10.3.6 查找并讀取map中的元素 315 10.3.7 從map對象中刪除元素 316 10.3.8 map對象的迭代遍歷 316 10.3.9 “單詞轉換”map對象 317 10.4 set類型 319 10.4.1 set容器的定義和使用 319 10.4.2 創建“單詞排除”集 321 10.5 multimap和multiset類型 322 10.5.1 元素的添加和刪除 322 10.5.2 在multimap和multiset 中查找元素 323 10.6 容器的綜合應用:文本查詢程序 325 10.6.1 查詢程序的設計 326 10.6.2 TextQuery類 327 10.6.3 TextQuery類的使用 328 10.6.4 編寫成員函數 330 小結 332 術語 332 第11章 泛型算法 335 11.1 概述 336 11.2 初窺算法 339 11.2.1 只讀算法 339 11.2.2 寫容器元素的算法 341 11.2.3 對容器元素重新排序的算法 343 11.3 再談迭代器 347 11.3.1 插入迭代器 348 11.3.2 iostream迭代器 349 11.3.3 反向迭代器 353 11.3.4 const迭代器 355 11.3.5 五種迭代器 356 11.4 泛型算法的結構 358 11.4.1 算法的形參模式 359 11.4.2 算法的命名規范 359 11.5 容器特有的算法 361 小結 362 術語 363 第三部分 類和數據抽象 第12章 類 367 12.1 類的定義和聲明 368 12.1.1 類定義:扼要重述 368 12.1.2 數據抽象和封裝 369 12.1.3 關于類定義的更多內容 372 12.1.4 類聲明與類定義 374 12.1.5 類對象 375 12.2 隱含的this指針 376 12.3 類作用域 380 類作用域中的名字查找 382 12.4 構造函數 385 12.4.1 構造函數初始化式 387 12.4.2 默認實參與構造函數 391 12.4.3 默認構造函數 392 12.4.4 隱式類類型轉換 393 12.4.5 類成員的顯式初始化 396 12.5 友元 396 12.6 static類成員 398 12.6.1 static成員函數 400 12.6.2 static數據成員 400 小結 403 術語 403 第13章 復制控制 405 13.1 復制構造函數 406 13.1.1 合成的復制構造函數 409 13.1.2 定義自己的復制構造函數 409 13.1.3 禁止復制 410 13.2 賦值操作符 411 13.3 析構函數 412 13.4 消息處理示例 415 13.5 管理指針成員 419 13.5.1 定義智能指針類 421 13.5.2 定義值型類 425 小結 427 術語 427 第14章 重載操作符與轉換 429 14.1 重載操作符的定義 430 14.2 輸入和輸出操作符 435 14.2.1 輸出操作符<<的重載 435 14.2.2 輸入操作符>>的重載 437 14.3 算術操作符和關系操作符 439 14.3.1 相等操作符 440 14.3.2 關系操作符 441 14.4 賦值操作符 441 14.5 下標操作符 442 14.6 成員訪問操作符 443 14.7 自增操作符和自減操作符 446 14.8 調用操作符和函數對象 449 14.8.1 將函數對象用于標準庫算法 450 14.8.2 標準庫定義的函數對象 451 14.8.3 函數對象的函數適配器 453 14.9 轉換與類類型 454 14.9.1 轉換為什么有用 454 14.9.2 轉換操作符 455 14.9.3 實參匹配和轉換 458 14.9.4 重載確定和類的實參 461 14.9.5 重載、轉換和操作符 464 小結 466 術語 467 第四部分 面向對象編程與泛型編程 第15章 面向對象編程 471 15.1 面向對象編程:概述 472 15.2 定義基類和派生類 473 15.2.1 定義基類 474 15.2.2 protected成員 475 15.2.3 派生類 476 15.2.4 virtual與其他成員函數 479 15.2.5 公用、私有和受保護的繼承 482 15.2.6 友元關系與繼承 486 15.2.7 繼承與靜態成員 486 15.3 轉換與繼承 487 15.3.1 派生類到基類的轉換 487 15.3.2 基類到派生類的轉換 489 15.4 構造函數和復制控制 490 15.4.1 基類構造函數和復制控制 490 15.4.2 派生類構造函數 490 15.4.3 復制控制和繼承 494 15.4.4 虛析構函數 495 15.4.5 構造函數和析構函數中的虛函數 497 15.5 繼承情況下的類作用域 497 15.5.1 名字查找在編譯時發生 498 15.5.2 名字沖突與繼承 498 15.5.3 作用域與成員函數 499 15.5.4 虛函數與作用域 500 15.6 純虛函數 502 15.7 容器與繼承 503 15.8 句柄類與繼承 504 15.8.1 指針型句柄 505 15.8.2 復制未知類型 507 15.8.3 句柄的使用 508 15.9 再談文本查詢示例 511 15.9.1 面向對象的解決方案 513 15.9.2 值型句柄 514 15.9.3 Query_base類 515 15.9.4 Query句柄類 516 15.9.5 派生類 518 15.9.6 eval函數 520 小結 522 術語 523 第16章 模板與泛型編程 525 16.1 模板定義 526 16.1.1 定義函數模板 526 16.1.2 定義類模板 528 16.1.3 模板形參 529 16.1.4 模板類型形參 531 16.1.5 非類型模板形參 533 16.1.6 編寫泛型程序 534 16.2 實例化 535 16.2.1 模板實參推斷 537 16.2.2 函數模板的顯式實參 540 16.3 模板編譯模型 542 16.4 類模板成員 545 16.4.1 類模板成員函數 548 16.4.2 非類型形參的模板實參 551 16.4.3 類模板中的友元聲明 552 16.4.4 Queue和QueueItem的友元 聲明 554 16.4.5 成員模板 556 16.4.6 完整的Queue類 558 16.4.7 類模板的static成員 559 16.5 一個泛型句柄類 560 16.5.1 定義句柄類 561 16.5.2 使用句柄 562 16.6 模板特化 564 16.6.1 函數模板的特化 565 16.6.2 類模板的特化 567 16.6.3 特化成員而不特化類 569 16.6.4 類模板的部分特化 570 16.7 重載與函數模板 570 小結 573 術語 574 第五部分 高級主題 第17章 用于大型程序的工具 579 17.1 異常處理 580 17.1.1 拋出類類型的異常 581 17.1.2 棧展開 582 17.1.3 捕獲異常 583 17.1.4 重新拋出 585 17.1.5 捕獲所有異常的處理代碼 586 17.1.6 函數測試塊與構造函數 586 17.1.7 異常類層次 587 17.1.8 自動資源釋放 589 17.1.9 auto_ptr類 591 17.1.10 異常說明 595 17.1.11 函數指針的異常說明 598 17.2 命名空間 599 17.2.1 命名空間的定義 599 17.2.2 嵌套命名空間 603 17.2.3 未命名的命名空間 604 17.2.4 命名空間成員的使用 606 17.2.5 類、命名空間和作用域 609 17.2.6 重載與命名空間 612 17.2.7 命名空間與模板 614 17.3 多重繼承與虛繼承 614 17.3.1 多重繼承 615 17.3.2 轉換與多個基類 617 17.3.3 多重繼承派生類的復制控制 619 17.3.4 多重繼承下的類作用域 620 17.3.5 虛繼承 622 17.3.6 虛基類的聲明 624 17.3.7 特殊的初始化語義 625 小結 628 術語 628 第18章 特殊工具與技術 631 18.1 優化內存分配 632 18.1.1 C++中的內存分配 632 18.1.2 allocator類 633 18.1.3 operator new函數和 operator delete函數 636 18.1.4 定位new表達式 638 18.1.5 顯式析構函數的調用 639 18.1.6 類特定的new和delete 639 18.1.7 一個內存分配器基類 641 18.2 運行時類型識別 646 18.2.1 dynamic_cast操作符 647 18.2.2 typeid操作符 649 18.2.3 RTTI的使用 650 18.2.4 type_info類 652 18.3 類成員的指針 653 18.3.1 聲明成員指針 653 18.3.2 使用類成員的指針 655 18.4 嵌套類 658 18.4.1 嵌套類的實現 658 18.4.2 嵌套類作用域中的名字查找 661 18.5 聯合:節省空間的類 662 18.6 局部類 665 18.7 固有的不可移植的特征 666 18.7.1 位域 666 18.7.2 volatile限定符 668 18.7.3 鏈接指示:extern "C" 669 小結 672 術語 673 附錄 標準庫 675 索引 703 |