第一篇 過程化的程序設計
第1章 良好的學習開端 1
1.1 軟件與程序 1
1.2 程序設計要做什么 1
1.3 選好一種語言 2
1.4 C++能夠做些什么 2
1.5 C語言、C++和Visual C++的關系 2
1.6 學習程序設計的方法和必要準備 3
1.7 總結 3
第2章 Hello,World 4
2.1 如何創(chuàng)建一個示例程序 4
2.2 創(chuàng)建自己的Hello,World 6
2.3 C++語言的輸出與輸入 8
2.4 方法指導 10
2.5 習題 10
第3章 各種各樣的“箱子”——變量 12
3.1 會變的“箱子”——定義變量 12
3.1.1 C++數據類型 12
3.1.2 變量名 13
3.1.3 變量的初始化 13
3.2 常用的基本數據類型 14
3.2.1 整型(Integer) 14
3.2.2 實型(Real) 14
3.2.3 字符型(Character) 14
3.2.4 布爾型(Boolean) 15
3.3 不會變的“箱子”——定義常量 15
3.4 C++算術表達式 15
3.4.1 賦值 16
3.4.2 除、整除和取余 16
3.5 “箱子”的轉換——數據類型轉換 17
3.5.1 隱式轉換 17
3.5.2 顯式轉換 17
3.6 方法指導 18
3.7 習題 18
第4章 要走哪條路——條件語句 20
4.1 如果…… 20
4.1.1 條件——關系運算 20
4.1.2 條件——邏輯運算 22
4.1.3 &&和||的妙用 24
4.2 否則…… 24
4.2.1 如果與否則 25
4.2.2 如果里的如果——if的嵌套 25
4.2.3 找朋友 27
4.3 愛判斷的問號 28
4.4 切換的開關 28
4.4.1 多路開關——switch 29
4.4.2 巧用switch 30
4.5 方法指導 32
4.6 習題 32
第5章 有個圈兒的程序——循環(huán)語句 36
5.1 程序賽車 36
5.1.1 循環(huán)語句for 36
5.1.2 加加和減減 37
5.1.3 巧用for 39
5.2 退出比賽和進維修站 40
5.2.1 退出比賽——break 40
5.2.2 進維修站——continue 41
5.3 圈圈里的圈圈 41
5.3.1 C++循環(huán)的嵌套 41
5.3.2 怎么讓輸出的東西更好看 43
5.4 While循環(huán) 44
5.4.1 當型循環(huán) 44
5.4.2 導火索——do 45
5.5 方法指導 47
5.6 習題 47
第6章 好用的“工具”——函數 51
6.1 簡單的“工具”——函數 51
6.1.1 “工具”的說明書 51
6.1.2 如何使用系統造好的“工具” 53
6.2 打造自己的“工具” 54
6.2.1 C++函數的聲明 54
6.2.2 函數的定義 55
6.2.3 函數是如何運行的 56
6.2.4 返回語句——return 56
6.2.5 關于主函數 56
6.2.6 同名同姓——參數定義 57
6.2.7 函數存在的意義 58
6.3 多功能“開瓶器”——函數重載 59
6.4 自動的“工具” 61
6.4.1 默認參數 61
6.4.2 定義默認參數的順序 61
6.4.3 默認參數和重載函數的混淆 62
6.5 給變量和參數起個“綽號”——引用 62
6.5.1 引用的聲明 62
6.5.2 用引用傳遞參數 63
6.6 *函數里的函數——遞歸 64
6.7 方法指導 65
6.8 習題 66
第7章 好大的“倉庫”——數組 69
7.1 讓計算機處理更多數據——使用數組 69
7.1.1 C++中數組的聲明 69
7.1.2 數組的操作 69
7.1.3 數組的初始化 71
7.1.4 省略數組大小 71
7.2 倉庫是怎樣造成的 71
7.2.1 內存和地址 72
7.2.2 C++數組在內存中的存儲情況 72
7.2.3 字符的存儲情況 73
7.2.4 字符數組在內存中的存儲情況 74
7.3 向函數傳遞數組 75
7.4 C++二維數組 77
7.4.1 線與面——一維數組和二維數組 77
7.4.2 二維數組的聲明和初始化 78
7.4.3 省略第一維的大小 79
7.4.4 二維數組在內存中的存儲情況 79
7.4.5 向函數傳遞二維數組 79
7.4.6 二維數組轉化成一維數組 80
7.5 方法指導 80
7.6 習題 81
第8章 內存里的快捷方式——指針 84
8.1 什么是指針 84
8.2 C++中指針變量的聲明和使用 84
8.2.1 指針的類型 84
8.2.2 指針變量的聲明 85
8.2.3 獲取地址和指針變量初始化 85
8.2.4 特殊的值——NULL 85
8.2.5 指針的使用——間接引用 85
8.3 指針的操作 86
8.3.1 指針的加減運算 87
8.3.2 指針的關系運算 88
8.4 指針與保護 88
8.4.1 對內存只讀的指針 88
8.4.2 指針型常量 88
8.5 指針與數組 89
8.5.1 數組名的實質 89
8.5.2 指針數組 90
8.6 指針與函數 90
8.6.1 指針作為參數 90
8.6.2 指針作為返回值 91
8.7 更靈活的存儲——堆內存空間 92
8.7.1 如何獲得堆內存空間 92
8.7.2 有借有還,再借不難——堆內存的回收 93
8.8 方法指導 94
8.9 習題 94
第9章 自己設計的箱子——枚舉和結構 98
9.1 我的類型我做主——枚舉類型 98
9.2 設計一個收納箱——定義結構類型 100
9.3 C++結構與函數 103
9.3.1 結構作為參數 103
9.3.2 結構作為返回值 104
9.4 C++結構數組與結構指針 105
9.4.1 結構數組 105
9.4.2 結構指針 105
9.5 自行車的鏈條——鏈表 106
9.6 C++鏈表的實現 107
9.6.1 鏈表的創(chuàng)建和遍歷 108
9.6.2 鏈表的查詢 110
9.6.3 插入結點 111
9.6.4 刪除結點 112
9.6.5 清除鏈表 114
9.7 方法指導 115
9.8 習題 115
第二篇 實戰(zhàn)程序設計
第10章 高效閱讀程序代碼 119
10.1 整體把握法 119
10.1.1 閱讀C++代碼的順序 119
10.1.2 整體把握語意 120
10.2 經驗法 121
10.3 模擬法 122
10.4 方法指導 123
10.5 習題 124
第11章 調試程序代碼技巧 127
11.1 再談變量 127
11.1.1 標志符 127
11.1.2 C++全局變量和局部變量 127
11.1.3 靜態(tài)局部變量 129
11.1.4 變量的作用域 130
11.1.5 變量的可見性 132
11.2 C++頭文件的奧秘 133
11.2.1 如何創(chuàng)建一個頭文件 133
11.2.2 C++程序中頭文件的作用 134
11.2.3 頭文件和源文件 135
11.2.4 細說#include 136
11.2.5 #include中尖括號和雙引號的區(qū)別 136
11.3 更快更好地完成程序調試 137
11.3.1 如何檢查語法錯誤 138
11.3.2 常見語法錯誤及解決方法 140
11.4 最麻煩的問題——運行時錯誤 141
11.4.1 見識運行時錯誤 141
11.4.2 查找錯誤點 142
11.5 調試工具——Debug 144
11.5.1 設置和移除斷點 145
11.5.2 Go語句 145
11.5.3 Debug窗口 146
11.5.4 Watch窗口 147
11.5.5 用Debug找到錯誤 147
11.6 方法指導 147
11.7 習題 148
第12章 編寫程序技巧 150
12.1 程序設計的基本步驟 150
12.2 三類C++編程問題 150
12.2.1 算法實現 150
12.2.2 匹配實現 151
12.2.3 功能實現 153
12.3 函數的遞歸 155
12.3.1 什么是?!?55
12.3.2 函數的調用機制 155
12.3.3 小試牛刀——用遞歸模擬棧 157
12.3.4 *遞歸的精髓 158
12.4 方法指導 160
12.5 習題 160
第三篇 面向對象的程序設計
第13章 初識對象 163
13.1 對象的定義 163
13.2 一個字符串也是對象 163
13.2.1 奇妙的點 164
13.2.2 對字符串的操作 164
13.3 面向對象特點一:封裝性 166
13.4 從數組到向量 166
13.4.1 向量的性能 166
13.4.2 萬用的模板 166
13.4.3 對向量的操作 167
13.5 方法指導 168
13.6 習題 168
第14章 再識對象 169
14.1 類是一種數據類型 169
14.1.1 類與結構 169
14.1.2 類的聲明與定義 169
14.2 公有和私有 170
14.3 成員函數 171
14.3.1 成員函數的聲明 171
14.3.2 常成員函數 171
14.3.3 成員函數的重載 172
14.3.4 成員函數的定義 172
14.4 對象、引用和指針 174
14.4.1 對象的引用 174
14.4.2 對象指針 174
14.5 方法指導 175
14.6 習題 175
第15章 造物者與毀滅者——對象生滅 178
15.1 麻煩的初始化 178
15.2 造物者——構造函數 178
15.2.1 構造函數的聲明與定義 179
15.2.2 帶參數的構造函數 180
15.3 先有結點,還是先鏈表 183
15.4 “克隆”技術——拷貝構造函數 186
15.4.1 拷貝構造函數 187
15.4.2 默認拷貝構造函數 192
15.4.3 拷貝構造函數存在的意義 192
15.5 毀滅者——析構函數 197
15.6 方法指導 203
15.7 習題 203
第16章 共有財產·好朋友·操作符 206
16.1 有多少個結點 206
16.1.1 靜態(tài)成員數據 206
16.1.2 靜態(tài)成員數據的初始化 207
16.1.3 靜態(tài)成員函數 207
16.2 類的好朋友——友元 211
16.2.1 友元類 211
16.2.2 友元函數 216
16.2.3 使用友元的利與弊 218
16.3 多功能的操作符——操作符的重載 219
16.3.1 操作符作為成員函數 219
16.3.2 操作符作為友元函數 223
16.3.3 又見加加和減減 225
16.4 方法指導 227
16.5 習題 227
第17章 父與子——繼承 228
17.1 劍士·弓箭手·法師的困惑 228
17.2 面向對象特點二:繼承性 229
17.3 繼承的實現 229
17.3.1 私有和保護 229
17.3.2 一個簡單的例子 230
17.3.3 繼承的方式 233
17.4 子類對象的生滅 239
17.4.1 子類對象的構造 239
17.4.2 子類對象的析構 241
17.5 繼承與對象指針 242
17.5.1 父類指針與子類對象 242
17.5.2 猜猜它是誰——覆蓋 244
17.6 面向對象特點三:多態(tài)性 245
17.7 多態(tài)與虛函數 245
17.7.1 多態(tài)的實現 246
17.7.2 無法實現多態(tài)的虛函數 249
17.8 虛函數與虛析構函數 250
17.9 抽象類與純虛函數 252
17.10 多重繼承 255
17.11 方法指導 256
17.12 習題 256
第18章 再談輸入與輸出 273
18.1 cout和cin真正含義 273
18.2 輸入輸出的重定向 273
18.2.1 輸入重定向 273
18.2.2 輸出重定向 274
18.2.3 無法被重定向的cerr 275
18.3 文件的輸入與輸出 276
18.4 更巧妙地輸入和輸出 277
18.4.1 能整行輸入的getline 277
18.4.2 能讀取判斷末尾的eof 278
18.4.3 能計數的gcount 279
18.4.4 能設置域寬的width 279
18.5 插入操作符的重載 280
18.5.1 插入操作符 280
18.5.2 插入操作符的常用重載方式 281
18.6 方法指導 283
18.7 習題 283
第19章 萬用的模板 285
19.1 函數模板 285
19.1.1 聲明與定義函數模板 285
19.1.2 函數模板與重載 286
19.2 類模板 287
19.2.1 類模板的聲明和定義 288
19.2.2 鏈表類模板實例 288
19.3 方法技巧 293
19.4 習題 293
第20章 異常的處理 297
20.1 亡羊也要補牢——程序出錯處理 297
20.2 處理異?!?98
20.2.1 盡力嘗試——try語句 299
20.2.2 抓住異常——catch語句 299
20.3 拋出異?!猼hrow語句 301
20.4 方法指導 302
20.5 習題 302
附錄A 常用保留字列表 305
附錄B 常見編譯錯誤和解決方法 307
附錄C 參考答案 310
第2章 310
第3章 310
第4章 311
第5章 315
第6章 319
第7章 322
第8章 326
第9章 328
第10章 331
第11章 332
第12章 333
第13章 336
第14章 337
第15章 338
第16章 341
第17章 349
第18章 351
第19章 353
第20章 355
附錄D 參考文獻 356