第一部分 基礎知識
第1章 緒論 2
1.1 C++簡史 2
1.1.1 解釋器和編譯器 3
1.1.2 不斷變化的需求和平颱 3
1.1.3 過程化編程、結構化編程和麵嚮對象編程 4
1.1.4 麵嚮對象編程(OOP) 4
1.1.5 C++和麵嚮對象編程 4
1.2 C++的發展曆程 5
1.3 應該先學習C語言嗎 5
1.4 微軟的C++托管擴展 6
1.5 ANSI標準 6
1.6 編程準備 6
1.7 開發環境 7
1.8 創建程序的步驟 7
1.8.1 用編譯器生成對象文件 7
1.8.2 用鏈接器生成可執行文件 7
1.9 程序開發周期 8
1.10 HELLO.cpp:第一個C++程序 9
1.11 編譯器初步 10
1.12 編譯錯誤 11
1.13 總結 11
1.14 問與答 11
1.15 作業 12
1.15.1 測驗 12
1.15.2 練習 12
第2章 C++程序的組成部分 13
2.1 一個簡單程序 13
2.2 cout簡介 14
2.3 使用標準名稱空間 16
2.4 對程序進行注釋 17
2.4.1 注釋的類型 17
2.4.2 使用注釋 18
2.4.3 有關注釋的警告 18
2.5 函數 18
2.5.1 使用函數 19
2.5.2 方法和函數 21
2.6 總結 21
2.7 問與答 21
2.8 作業 21
2.8.1 測驗 21
2.8.2 練習 21
第3章 使用變量和常量 23
3.1 什麼是變量 23
3.1.1 將數據存儲在內存中 23
3.1.2 預留內存 24
3.1.3 整型變量的大小 24
3.1.4 基本變量類型 24
3.2 定義變量 25
3.2.1 區分大小寫 26
3.2.2 命名規則 26
3.2.3 關鍵字 27
3.3 確定變量類型占用的內存量 27
3.4 一次創建多個變量 28
3.5 給變量賦值 28
3.6 使用typedef創建彆名 29
3.7 何時使用short和long 30
3.7.1 unsigned整型變量的迴繞 31
3.7.2 signed整型變量的迴繞 31
3.8 使用字符 32
3.8.1 字符和數字 32
3.8.2 特殊打印字符 33
3.9 常量 34
3.9.1 字麵常量 34
3.9.2 符號常量 34
3.10 枚舉常量 35
3.11 總結 36
3.12 問與答 37
3.13 作業 37
3.13.1 測驗 37
3.13.2 練習 38
第4章 管理數組和字符串 39
4.1 什麼是數組 39
4.1.1 訪問數組元素 39
4.1.2 在數組末尾後寫入數據 40
4.1.3 護欄柱錯誤 42
4.1.4 初始化數組 42
4.1.5 聲明數組 43
4.2 使用多維數組 44
4.2.1 聲明多維數組 44
4.2.2 初始化多維數組 44
4.3 字符數組和字符串 46
4.4 使用方法strcpy()和strncpy() 48
4.5 string類 49
4.6 總結 50
4.7 問與答 51
4.8 作業 51
4.8.1 測驗 51
4.8.2 練習 51
第5章 使用錶達式、語句和運算符 53
5.1 語句簡介 53
5.1.1 使用空白 53
5.1.2 語句塊和復閤語句 54
5.2 錶達式 54
5.3 使用運算符 55
5.3.1 賦值運算符 55
5.3.2 數學運算符 55
5.3.3 整數除法和求模 56
5.4 結閤使用賦值運算符與數學運算符 57
5.5 遞增和遞減 57
5.6 理解運算符優先級 59
5.7 括號的嵌套 59
5.8 真值的本質 60
5.9 if語句 61
5.9.1 縮進風格 63
5.9.2 else語句 63
5.9.3 高級if語句 65
5.10 在嵌套if語句中使用大括號 66
5.11 使用邏輯運算符 68
5.11.1 邏輯AND運算符 68
5.11.2 邏輯OR運算符 68
5.11.3 邏輯NOT運算符 68
5.12 簡化求值 68
5.13 關係運算符的優先級 69
5.14 再談真和假 69
5.15 條件運算符(三目運算符) 70
5.16 總結 71
5.17 問與答 71
5.18 作業 71
5.18.1 測驗 71
5.18.2 練習 72
第6章 使用函數組織代碼 73
6.1 什麼是函數 73
6.2 返迴值、參數和實參 74
6.3 聲明和定義函數 74
6.3.1 函數原型 74
6.3.2 定義函數 75
6.4 函數的執行 76
6.5 確定變量的作用域 77
6.5.1 局部變量 77
6.5.2 作用域為語句塊的局部變量 78
6.6 參數是局部變量 79
6.6.1 全局變量 80
6.6.2 有關全局變量的注意事項 81
6.7 創建函數語句時的考慮因素 81
6.8 再談函數實參 81
6.9 再談返迴值 82
6.10 默認參數 83
6.11 重載函數 85
6.12 函數特有的主題 87
6.12.1 內聯函數 87
6.12.2 遞歸 89
6.13 函數的工作原理 92
6.13.1 抽象層次 92
6.13.2 劃分RAM 92
6.13.3 堆棧和函數 93
6.14 總結 94
6.15 問與答 94
6.16 作業 95
6.16.1 測驗 95
6.16.2 練習 95
第7章 控製程序流程 97
7.1 循環 97
7.1.1 循環的鼻祖:goto 97
7.1.2 為何避免使用goto語句 98
7.2 使用while循環 98
7.2.1 更復雜的while語句 99
7.2.2 continue和break簡介 100
7.2.3 while(true)循環 102
7.3 實現do...while循環 103
7.4 使用do...while 103
7.5 for循環 105
7.5.1 高級for循環 106
7.5.2 空for循環 108
7.5.3 循環嵌套 109
7.5.4 for循環中聲明的變量的作用域 110
7.6 循環小結 111
7.7 使用switch語句控製程序流程 112
7.8 總結 116
7.9 問與答 117
7.10 作業 117
7.10.1 測驗 117
7.10.2 練習 117
第8章 闡述指針 119
8.1 什麼是指針 119
8.1.1 內存簡介 119
8.1.2 獲取變量的內存地址 120
8.1.3 將變量的地址存儲到指針中 120
8.1.4 指針名 121
8.1.5 獲取指針指嚮的變量的值 121
8.1.6 使用間接運算符解除引用 122
8.1.7 指針、地址和變量 122
8.1.8 使用指針來操縱數據 123
8.1.9 查看地址 124
8.1.10 指針和數組名 125
8.1.11 數組指針和指針數組 126
8.2 為什麼使用指針 127
8.3 棧和自由存儲區(堆) 127
8.3.1 使用關鍵字new分配內存 128
8.3.2 使用關鍵字delete歸還內存 128
8.4 再談內存泄漏 130
8.5 在自由存儲區上創建對象 130
8.6 刪除自由存儲區中的對象 130
8.7 迷途指針 131
8.8 使用const指針 133
8.9 總結 134
8.10 問與答 134
8.11 作業 134
8.11.1 測驗 134
8.11.2 練習 135
第9章 使用引用 136
9.1 什麼是引用 136
9.2 將地址運算符用於引用 137
9.3 空指針和空引用 139
9.4 按引用傳遞函數參數 139
9.4.1 使用指針讓swap()管用 140
9.4.2 使用引用來實現swap() 141
9.5 返迴多個值 142
9.6 按引用傳遞以提高效率 145
9.6.1 傳遞const指針 147
9.6.2 用引用代替指針 148
9.7 何時使用引用和指針 150
9.8 混閤使用引用和指針 150
9.9 返迴指嚮不在作用域中的對象的引用 151
9.10 總結 153
9.11 問與答 153
9.12 作業 153
9.12.1 測驗 154
9.12.2 練習 154
第二部分 麵嚮對象編程和C++基礎
第10章 類和對象 156
10.1 C++是麵嚮對象的嗎 156
10.2 創建新類型 157
10.3 類和成員簡介 157
10.3.1 聲明類 158
10.3.2 有關命名規則的說明 158
10.3.3 定義對象 159
10.3.4 類與對象 159
10.4 訪問類成員 159
10.4.1 給對象而不是類賦值 159
10.4.2 類不能有沒有聲明的功能 159
10.5 私有和公有 160
10.6 實現類方法 163
10.7 添加構造函數和析構函數 165
10.7.1 默認構造函數和析構函數 166
10.7.2 使用默認構造函數 166
10.8 const成員函數 168
10.9 將類聲明和方法定義放在什麼地方 169
10.10 內聯實現 169
10.11 將其他類用作成員數據的類 171
10.12 探索結構 174
10.13 總結 174
10.14 問與答 174
10.15 作業 175
10.15.1 測驗 175
10.15.2 練習 176
第11章 實現繼承 177
11.1 什麼是繼承 177
11.1.1 繼承和派生 177
11.1.2 動物世界 178
11.1.3 派生的語法 178
11.2 私有和保護 180
11.3 構造函數和析構函數的繼承性 181
11.4 覆蓋基類函數 186
11.4.1 隱藏基類的方法 187
11.4.2 調用基類方法 189
11.5 虛方法 190
11.5.1 虛函數的工作原理 193
11.5.2 通過基類指針訪問派生類的方法 193
11.5.3 切除 194
11.5.4 創建虛析構函數 195
11.5.5 虛復製構造函數 195
11.5.6 使用虛方法的代價 198
11.6 私有繼承 198
11.6.1 使用私有繼承 198
11.6.2 私有繼承和聚閤(組閤) 199
11.7 總結 200
11.8 問與答 201
11.9 作業 201
11.9.1 測驗 201
11.9.2 練習 202
第12章 多態 203
12.1 單繼承存在的問題 203
12.1.1 提升 205
12.1.2 嚮下轉換 205
12.1.3 將對象添加到鏈錶中 207
12.2 多重繼承 207
12.2.1 多重繼承對象的組成部分 209
12.2.2 多重繼承對象中的構造函數 210
12.2.3 避免歧義 212
12.2.4 從共同基類繼承 212
12.2.5 虛繼承 215
12.2.6 多重繼承存在的問題 217
12.2.7 混閤(功能)類 217
12.3 抽象數據類型 218
12.3.1 純虛函數 220
12.3.2 實現純虛函數 221
12.3.3 復雜的抽象層次結構 224
12.3.4 哪些類是抽象的 226
12.4 總結 226
12.5 問與答 227
12.6 作業 227
12.6.1 測驗 227
12.6.2 練習 228
第13章 運算符類型與運算符重載 229
13.1 C++中的運算符 229
13.2 單目運算符 229
13.2.1 單目運算符的類型 230
13.2.2 單目遞增與單目遞減運算符 230
13.2.3 解除引用運算符*與成員選擇運算符-的編程 232
13.2.4 轉換運算符的編程 234
13.3 雙目運算符 235
13.3.1 雙目運算符的類型 235
13.3.2 雙目加與雙目減運算符的編程 236
13.3.3 運算符+=與-=的編程 237
13.3.4 重載比較運算符 238
13.3.5 重載運算符、、=和= 241
13.3.6 下標運算符 243
13.4 operator()函數 244
13.5 不能重新定義的運算符 245
13.6 總結 245
13.7 問與答 245
13.8 作業 246
13.8.1 測驗 246
13.8.2 練習 246
第14章 類型轉換運算符 247
14.1 什麼是類型轉換 247
14.2 為何需要類型轉換 247
14.3 為何有些C++程序員不喜歡C風格類型轉換 248
14.4 C++類型轉換運算符 248
14.4.1 使用static_cast 248
14.4.2 使用dynamic_cast和運行階段類型識彆 249
14.4.3 使用reinterpret_cast 250
14.4.4 使用const_cast 251
14.5 C++類型轉換運算符存在的問題 252
14.6 總結 252
14.7 問與答 252
14.8 作業 253
第15章 宏和模闆簡介 254
15.1 預處理器與編譯器 254
15.2 預處理器指令#define 254
15.3 宏函數 255
15.3.1 為什麼要使用括號 255
15.3.2 宏與類型安全問題 256
15.3.3 宏與函數及模闆之比較 256
15.3.4 內聯函數 256
15.4 模闆簡介 258
15.4.1 模闆聲明語法 258
15.4.2 各種類型的模闆聲明 258
15.4.3 模闆類 259
15.4.4 模闆的實例化和具體化 259
15.4.5 模闆與類型安全 259
15.4.6 使用多個參數聲明模闆 259
15.4.7 使用默認參數來聲明模闆 260
15.4.8 一個模闆示例 260
15.4.9 在實際C++編程中使用模闆 261
15.5 總結 262
15.6 問與答 262
15.7 作業 263
15.7.1 測驗 263
15.7.2 練習 263
第三部分 學習標準模闆庫(STL)
第16章 標準模闆庫簡介 266
16.1 STL容器 266
16.1.1 順序容器 266
16.1.2 關聯容器 266
16.1.3 選擇正確的容器 267
16.2 STL迭代器 267
16.3 STL算法 268
16.4 使用迭代器在容器和算法之間交互 268
16.5 總結 270
16.6 問與答 270
16.7 作業 270
第17章 STL string類 271
17.1 為何需要字符串操作類 271
17.2 使用STL string類 272
17.2.1 實例化STL string及復製 272
17.2.2 訪問string及其內容 273
17.2.3 字符串連接 274
17.2.4 在string中查找字符或子字符串 275
17.2.5 截短STL string 276
17.2.6 字符串反轉 278
17.2.7 字符串的大小寫轉換 278
17.3 基於模闆的STL string實現 279
17.4 總結 279
17.5 問與答 279
17.6 作業 280
17.6.1 測驗 280
17.6.2 練習 280
第18章 STL動態數組類 281
18.1 std::vector的特點 281
18.2 典型的vector操作 281
18.2.1 實例化vector 281
18.2.2 在vector中插入元素 282
18.2.3 訪問vector中的元素 285
18.2.4 刪除vector中的元素 286
18.3 理解size()和capacity() 287
18.4 STL deque 類 288
18.5 總結 290
18.6 問與答 290
18.7 作業 290
18.7.1 測驗 291
18.7.2 練習 291
第19章 STL list 292
19.1 std::list的特點 292
19.2 基本的list操作 292
19.2.1 實例化std::list對象 292
19.2.2 在list開頭插入元素 293
19.2.3 在list末尾插入元素 293
19.2.4 在list中間插入元素 294
19.2.5 刪除list中的元素 296
19.3 對list中元素進行反轉和排序 297
19.3.1 反轉元素的排列順序 297
19.3.2 元素排序 298
19.4 總結 305
19.5 問與答 305
19.6 作業 305
19.6.1 測驗 305
19.6.2 練習 305
第20章 STL set與multiset 306
20.1 簡介 306
20.2 STL set和multiset的基本操作 306
20.2.1 實例化std::set對象 306
20.2.2 在STL set或multiset中插入元素 307
20.2.3 在STL set或multiset中查找元素 308
20.2.4 刪除STL set或multiset中的元素 309
20.3 使用STL set和multiset的優缺點 315
20.4 總結 316
20.5 問與答 316
20.6 作業 316
20.6.1 測驗 316
20.6.2 練習 316
第21章 STL map和multimap 317
21.1 簡介 317
21.2 STL map和multimap的基本操作 317
21.2.1 實例化std::map對象 317
21.2.2 在STL map或multimap中插入元素 318
21.2.3 在STL map或multimap中查找元素 320
21.2.4 刪除STL map或multimap中的元素 321
21.3 提供自定義的排序謂詞 323
21.4 總結 325
21.5 問與答 325
21.6 作業 326
21.6.1 測驗 326
21.6.2 練習 326
第四部分 再談STL
第22章 理解函數對象 328
22.1 函數對象與謂詞的概念 328
22.2 函數對象的典型用途 328
22.2.1 一元函數 328
22.2.2 一元謂詞 331
22.2.3 二元函數 332
22.2.4 二元謂詞 334
22.3 總結 336
22.4 問與答 336
22.5 作業 336
22.5.1 測驗 336
22.5.2 練習 336
第23章 STL算法 337
23.1 什麼是STL算法 337
23.2 STL算法的分類 337
23.2.1 非變序算法 337
23.2.2 變序算法 338
23.3 STL算法的應用 339
23.3.1 計算元素個數與查找元素 339
23.3.2 在集閤中搜索元素或序列 340
23.3.3 將容器中的元素初始化為指定值 342
23.3.4 用for_each處理範圍內的元素 344
23.3.5 使用std::transform對範圍進行變換 345
23.3.6 復製和刪除操作 347
23.3.7 替換值以及替換滿足給定條件的元素 349
23.3.8 排序、在有序集閤中搜索以及刪除重復元素 350
23.3.9 將範圍分區 351
23.3.10 在有序集閤中插入元素 353
23.4 總結 354
23.5 問與答 354
23.6 作業 355
23.6.1 測驗 355
23.6.2 練習 355
第24章 自適應容器:棧和隊列 356
24.1 棧和隊列的行為特徵 356
24.1.1 棧 356
24.1.2 隊列 356
24.2 使用STL stack類 356
24.2.1 實例化stack 357
24.2.2 stack的成員函數 357
24.3 使用STL queue類 359
24.3.1 實例化queue 359
24.3.2 queue的成員函數 359
24.4 使用STL優先級隊列 361
24.4.1 實例化priority_queue類 361
24.4.2 priority_queue的成員函數 362
24.5 總結 364
24.6 問與答 364
24.7 作業 364
24.7.1 測驗 364
24.7.2 練習 364
第25章 使用STL位標誌 365
25.1 bitset類 365
25.2 使用std::bitset及其成員 366
25.2.1 std:bitset的運算符 366
25.2.2 std::bitset的成員方法 366
25.3 vectorbool 368
25.3.1 實例化vectorbool 368
25.3.2 使用vectorbool 369
25.4 總結 370
25.5 問與答 370
25.6 作業 370
25.6.1 測驗 370
25.6.2 練習 370
第五部分 高級C++概念
第26章 理解智能指針 372
26.1 什麼是智能指針 372
26.1.1 使用常規(原始)指針有何問題 372
26.1.2 智能指針有何幫助 372
26.2 智能指針是如何實現的 373
26.3 智能指針類型 374
26.3.1 深度復製 374
26.3.2 寫時復製機製 375
26.3.3 引用計數智能指針 375
26.3.4 引用鏈接智能指針 376
26.3.5 破壞性復製 376
26.4 使用std::auto_ptr 377
26.5 流行的智能指針庫 378
26.6 總結 378
26.7 問與答 379
26.8 作業 379
26.8.1 測試 379
26.8.2 練習 379
第27章 處理流 380
27.1 流概述 380
27.1.1 數據流的封裝 380
27.1.2 理解緩衝技術 381
27.2 流和緩衝區 382
27.3 標準I/O對象 382
27.4 重定嚮標準流 382
27.5 使用cin進行輸入 382
27.5.1 輸入字符串 384
27.5.2 字符串的問題 384
27.5.3 的返迴值 386
27.6 cin的其他成員函數 386
27.6.1 單字符輸入 386
27.6.2 從標準輸入讀取字符串 388
27.6.3 使用cin.ignore() 390
27.6.4 查看和插入字符:peek()和putback() 391
27.7 使用cout進行輸齣 391
27.7.1 刷新輸齣 391
27.7.2 執行輸齣的函數 392
27.7.3 控製符、標記和格式化指令 393
27.8 流和printf()函數之比較 396
27.9 文件輸入和輸齣 398
27.9.1 使用ofstream 398
27.9.2 條件狀態 398
27.9.3 打開文件進行輸入和輸齣 398
27.9.4 修改ofstream打開文件時的默認行為 400
27.10 二進製文件和文本文件 401
27.11 命令行處理 403
27.12 總結 405
27.13 問與答 405
27.14 作業 406
27.14.1 測驗 406
27.14.2 練習 406
第28章 處理異常 407
28.1 程序中的各種錯誤 407
28.2 異常的基本思想 408
28.2.1 異常處理的組成部分 409
28.2.2 手工引發異常 411
28.2.3 創建異常類 412
28.3 使用try塊和catch塊 414
28.4 捕獲異常的工作原理 415
28.4.1 使用多條catch語句 415
28.4.2 異常層次結構 417
28.5 異常中的數據及給異常對象命名 419
28.6 異常和模闆 424
28.7 沒有錯誤的異常 426
28.8 bug和調試 426
28.8.1 斷點 427
28.8.2 監視點 427
28.8.3 查看內存 427
28.8.4 查看匯編代碼 427
28.9 總結 427
28.10 問與答 427
28.11 作業 428
28.11.1 測驗 428
28.11.2 練習 428
第29章 雜項內容 430
29.1 預處理器和編譯器 430
29.2 預編譯器指令#define 430
29.2.1 使用#define定義常量 431
29.2.2 將#define用於檢測 431
29.2.3 預編譯器命令#else 431
29.3 包含和防範多重包含 432
29.4 字符串操縱 433
29.4.1 字符串化 433
29.4.2 拼接 433
29.5 預定義的宏 433
29.6 assert()宏 434
29.6.1 使用assert()進行調試 435
29.6.2 assert()與異常之比較 435
29.6.3 副作用 435
29.6.4 類的不變量 436
29.6.5 打印中間值 439
29.7 位運算 440
29.7.1 “與”運算符 441
29.7.2 “或”運算符 441
29.7.3 “異或”運算符 441
29.7.4 “求反”運算符 441
29.7.5 設置位 441
29.7.6 清除位 441
29.7.7 反轉位 442
29.7.8 位字段 442
29.8 編程風格 444
29.8.1 縮進 444
29.8.2 大括號 444
29.8.3 長代碼行和函數長度 445
29.8.4 格式化switch語句 445
29.8.5 程序文本 445
29.8.6 標識符命名 446
29.8.7 名稱的拼寫和大寫 446
29.8.8 注釋 446
29.8.9 設置訪問權限 447
29.8.10 類定義 447
29.8.11 包含文件 447
29.8.12 使用assert() 447
29.8.13 使用const 447
29.9 C++開發工作的下一步 447
29.9.1 從何處獲得幫助和建議 448
29.9.2 相關的C++主題:托管C++、C#和微軟的.NET 448
29.10 總結 448
29.11 問與答 449
29.12 作業 450
29.12.1 測驗 450
29.12.2 練習 450
附錄A 二進製和十六進製 451
A.1 其他進製 451
A.2 不同進製之間的轉換 452
A.2.1 二進製 452
A.2.2 為什麼使用二進製 453
A.2.3 位、字節和半字節 453
A.2.4 什麼是KB 453
A.2.5 二進製數 454
A.3 十六進製 454
附錄B C++關鍵字 457
附錄C 運算符優先級 458
附錄D 答案 459
· · · · · · (
收起)