C++大學教程(第3版)

C++大學教程(第3版)

《C++大學教程(第3版)》是2005年清華大學出版社出版的圖書,作者是那格勒,譯者是侯普秀。

內容簡介

《C++大學教程》是一本C++編程方面的優秀教程,全面介紹了過程式編程與面向對象編程的原理與方法,細緻地分析了各種性能問題、可移植性問題以及可能出錯的情況。作者通過大量的示例程式,重點突出了面向對象的設計,引入了流行的套用開發,並且幫助學生創建真實世界的C++應用程式。本書無論從廣度和深度上來說都非常全面,並且從基礎概念講起,同樣適合沒有編程經驗的讀者學習。

本書通過示例方法介紹了C++程式設計語言。書中給出了400多個簡短易懂的示例,本書可以作為您的課堂筆記、指南和參考。書中提供了詳細而牢靠的技巧以及概念的進階,其詳細程度超過了大多數C++書籍。本書既可以獨立使用,也可以在課堂上用作筆記、教材或者參考指南。

圖書目錄

第1章 由C遷移到C++ 1

1.1 概述 1

1.2 C與C++的比較 1

1.3 編譯器如何識別C++程式 1

1.4 預處理器如何識別環境 2

1.5 新的注釋風格 2

1.6 永遠不要假定(隱式地使用int類型) 3

1.7 main()的默認返回值 3

1.8 聲明與定義的區別 4

1.9 函式聲明中的形參名稱 4

1.10 函式定義中的形參名稱 4

1.11 所有的函式在調用前必須先聲明 5

1.12 空圓括弧的含義 5

1.13 函式參數的默認值 5

1.14 初始化與賦值的區別 6

1.15 放置變數聲明的地方 7

1.16 for循環內的變數聲明 8

1.17 標記名成為類型名 8

1.18 C++與C中枚舉類型的區別 9

1.19 初始化全局變數 10

1.20 數組初始化 11

1.21 布爾類型 11

1.22 void *指針 12

1.23 使用0,而不是宏NULL 13

1.24 關鍵字const 13

1.24.1 所有的常量必須初始化 13

1.24.2 將常量值的參數傳遞給函式的含義 14

1.24.3 函式返回值為常量的含義 14

1.24.4 const如何影響指針 14

1.24.5 C++與C中字元數組的區別 15

1.24.6 如何支持char const*類型的數組 16

1.24.7 C以及C++處理const方式的區別 16

1.24.8 使用const而不是#define 17

1.24.9 const 變數的連線 18

1.25 新的類型強制轉換風格 18

1.25.1 類型強制轉換以及轉換的區別 18

1.25.2 類型強制轉換的一般格式 19

1.25.3 static_cast 19

1.25.4 reinterpret_cast 20

1.25.5 const_cast 20

1.25.6 您不會犯錯 21

1.26 C以及C++關鍵字 21

第2章 命名空間 23

2.1 概述 23

2.2 存在的問題 23

2.3 如何創建命名空間 24

2.4 作用域分解運算符 25

2.5 如何訪問命名空間的成員 25

2.5.1 直接訪問命名空間的成員 25

2.5.2 using聲明-- 訪問命名空間成員的另一種方法 26

2.5.3 using 指令--訪問命名空間成員的另一種方法 27

2.6 小心避免不明確的情況 28

2.7 無名的命名空間 28

2.8 命名空間的別名 29

2.9 Koenig 查找規則 30

第3章 輸入/輸出基礎 32

3.1 概述 32

3.2 使用新函式的理由 32

3.3 頭檔案-- 命名約定 33

3.4 iostream頭檔案 33

3.5 cout對象 33

3.5.1 插入運算符 34

3.5.2 顯式地限定cout對象 34

3.5.3 使用using聲明來訪問cout對象 35

3.5.4 使用using指令來訪問cout對象 35

3.6 關於正確使用std命名空間的建議 36

3.7 了解運算符的優先權 37

3.8 輸出格式 37

3.9 cin對象 37

3.10 檢查檔案是否結束 39

第4章 引用變數 42

4.1 概述 42

4.2 存在的問題 42

4.3 如何創建引用變數 44

4.4 所有的引用都必須初始化 44

4.5 引用的作用 44

4.6 使用const限定引用 45

4.7 何時不需要使用引用 46

4.8 沒有“常量引用” 47

4.9 創建對指針的引用 47

4.10 創建對數組的引用 48

4.11 由函式返回引用 49

第5章 動態記憶體分配 51

5.1 概述 51

5.2 如何為單個對象分配動態記憶體 51

5.3 如何初始化基本類型 52

5.4 空圓括弧的含義 52

5.5 如何釋放單個對象的空閒空間 53

5.6 如何為對象的數組分配空閒空間 53

5.7 如何釋放對象數組的空閒空間 54

5.8 保持平衡 55

5.9 如何使用new和delete在空閒存儲區中存儲字元串 55

5.10 如何分配和刪除多維數組 57

5.11 命名該空間 58

5.12 兩個程式輸出示例 58

第6章 類 61

6.1 概述 61

6.2 C中的結構 61

6.2.1 全局函式 62

6.2.2 C存在的問題 62

6.3 初識封裝 63

6.3.1 修訂後的Circle抽象 63

6.3.2 必須支持常量對象 64

6.4 結構與類 64

6.5 類的用途 65

6.6 類的組件 65

6.7 如何編寫類定義 65

6.7.1 類聲明與類定義 66

6.7.2 關於輸入/輸出類 69

6.8 數據隱藏的原則 69

6.9 訪問限定符 71

6.9.1 private關鍵字 72

6.9.2 public關鍵字 73

6.9.3 protected 關鍵字 73

6.9.4 選擇編碼風格 73

6.10 模組化並實現隱藏 74

6.10.1 如何模組化 75

6.10.2 用戶的任務 77

6.10.3 本節小結 77

6.11 如何通過實例來訪問類成員 77

6.12 內聯函式 79

6.12.1 內聯函式的含義 80

6.12.2 內聯函式與宏的對比 80

6.12.3 使得內聯函式對編譯器有效 80

6.12.4 放置內聯函式的地方 81

6.12.5 內聯函式的連線 81

6.12.6 如何編寫全局成員內聯函式 81

6.12.7 如何編寫類成員內聯函式 82

6.12.8 隱式內聯和顯式內聯的比較 84

6.13 mutable 關鍵字 84

6.14 如何顯示類的內容 85

6.15 類中的枚舉類型 87

6.15.1 使用枚舉的原因 88

6.15.2 私有枚舉 88

6.15.3 公有枚舉 90

6.15.4 “Enum Hack”的作用 91

第7章 構造函式和析構函式 94

7.1 概述 94

7.2 構造函式的定義 94

7.2.1 語法規則 95

7.2.2 何時不調用構造函式 95

7.2.3 編譯器提供的默認構造函式 96

7.2.4 默認的構造函式:普遍定義 97

7.2.5 初始化常量對象 98

7.2.6 構造函式重載 98

7.2.7 不能直接調用構造函式 100

7.3 析構函式的定義 101

7.3.1 編譯器提供的析構函式 101

7.3.2 析構函式的作用 101

7.3.3 編寫您自己的析構函式 102

7.3.4 語法規則 102

7.4 如何實例化類並調用默認構造函式 103

7.5 如何實例化類並向構造函式傳遞參數 103

7.6 如何阻止使用默認構造函式的實例化 104

7.7 隱式類型轉換 106

7.8 複製構造函式 109

7.8.1 默認複製構造函式 110

7.8.2 複製構造函式的語法 111

7.8.3 複製構造函式的數量 111

7.8.4 淺複製與深複製 111

7.8.5 編寫您自己的複製構造函式 112

7.8.6 如何阻止對象複製 114

7.9 函式風格的強制轉換 115

7.10 初始化與賦值 118

7.11 基/成員初始化列表 118

7.11.1 默認初始化 120

7.11.2 強制使用基/成員初始化列表 120

7.11.3 另一種初始化調用的情況 121

7.12 關於指針 123

7.13 形參名與類成員名 123

7.14 非靜態數據成員的初始化順序 123

7.15 基本類型的數組作為非靜態數據成員 125

7.16 用戶自定義類型數組作為非靜態數據成員 125

7.17 如何創建用戶自定義實例的數組 126

7.18 如何聲明常量數據成員數組 128

7.19 如何在空閒存儲區中創建用戶自定義類型 128

7.20 如何在空閒存儲區中創建用戶自定義類型的數組 129

7.21 調用new時的語法 129

第8章 類的其他特徵 134

8.1 概述 134

8.2 this指針 134

8.2.1 解引用this指針來複製調用對象 136

8.2.2 解引用this指針以允許連結函式 137

8.3 靜態類數據成員 139

8.3.1 在類的定義中初始化靜態類數據成員 142

8.3.2 靜態成員函式 143

8.3.3 用於生成隨機數的類 145

8.3.4 Die類 145

8.3.5 Dice類 147

8.4 類的大小 151

8.5 友元函式 152

8.5.1 類如何授權一個函式作為它的友元函式 152

8.5.2 成員函式和非成員函式 153

8.5.3 使用非成員非友元函式替代友元函式 155

8.5.4 在命名空間中聲明類的友元函式 156

8.6 友元類 158

8.7 類的封裝 162

8.8 運算符轉換函式 169

8.8.1 用途 169

8.8.2 語法 170

8.9 類成員指針 171

8.9.1 全局函式指針 171

8.9.2 指向非靜態類成員函式的指針 172

8.9.3 使用指向非靜態成員函式的指針調用函式 172

8.9.4 指向靜態類成員函式的指針 173

第9章 異常處理 174

9.1 概述 174

9.2 如何拋出異常 174

9.3 如何捕獲異常 174

9.4 catch代碼塊的匹配處理 176

9.5 異常處理的一個簡單示例 176

9.6 釋放堆疊 177

9.7 如果調用new失敗怎么辦 177

9.8 如何防止new拋出異常 178

9.9 異常的傳播 179

9.10 如何處理指向空閒空間的指針 181

9.11 不能銷毀還沒有創建的對象 184

9.12 重新拋出對象 184

9.13 從子對象成員中捕獲拋出的異常 184

9.14 function-try-blocks 185

9.15 子對象成員和指針的混合使用 187

9.16 對象的局部結構 189

9.17 編寫異常-安全代碼 190

9.17.1 堆疊中的簡單對象 190

9.17.2 堆疊中的對象數組 191

9.17.3 空閒存儲區中的簡單對象 191

9.17.4 再論空閒存儲區中的簡單對象 192

9.17.5 空閒存儲區中的對象數組 193

9.17.6 再論空閒存儲區中的對象數組 195

9.18 析構函式和異常處理 196

9.19 異常規範 196

9.20 出錯條件 197

9.20.1 意外錯誤 198

9.20.2 終止錯誤 198

9.21 編譯器如何對待異常規範 198

9.22 為類定義operator new()函式 199

第10章 函式重載 203

10.1 概述 203

10.2 幾個關於函式重載的示例 203

10.3 忽略返回類型 204

10.4 const限定參數按值傳遞 204

10.5 const限定參數按指針傳遞 204

10.6 const限定參數按引用傳遞 205

10.7 可變成員函式和常量成員函式 205

10.8 重載決議 206

10.9 根據指針類型重載 207

10.10 名稱重整 207

10.10.1 如何避免名稱重整 208

10.10.2 類型-安全連線 209

10.11 運算符函式重載 210

10.11.1 運算符優先權表 211

10.11.2 重載運算符的命名 213

10.11.3 默認參數 213

10.11.4 C++自帶的運算符 213

10.11.5 不能改變優先權 214

10.11.6 不能改變“Narity” 214

10.11.7 不能改變結合性 214

10.11.8 成員函式與非成員函式 214

10.11.9 至少支持一個類實例 215

10.11.10 中綴表示法和函式表示法 215

10.11.11 二元成員函式和隱式類型轉換 216

10.11.12 多次重載或者允許隱式類型轉換 218

10.11.13 運算符的重載 219

10.11.14 賦值運算符 220

10.11.15 函式調用運算符 223

10.11.16 下標運算符 225

10.11.17 間接成員運算符 226

10.11.18 複合賦值運算符 229

10.11.19 自增運算符和自減運算符 231

10.11.20 重載逗號運算符 233

10.11.21 重載邏輯與和邏輯或運算符 233

10.11.22 重載插入運算符 234

10.11.23 運算符小結 235

第11章 繼承 238

11.1 概述 238

11.2 記憶體中的派生類實例 238

11.3 使用繼承創建is-a關係 238

11.4 如何定義派生類 239

11.5 再論結構和類 240

11.6 關鍵字protected 240

11.7 訪問特權 241

11.8 基類“存取器”函式 242

11.9 修改繼承訪問 243

11.10 函式隱藏 245

11.11 派生類成員函式如何調用基類成員函式 248

11.12 管理函式 249

11.12.1 如何編寫管理函式 250

11.12.2 派生類到基類的標準轉換 254

11.12.3 隱藏非成員函式 255

11.12.4 不要對數組進行向上類型轉換 257

11.13 多態性 257

11.14 多態性和虛函式 262

11.14.1 友好的程式代碼和不友好的程式代碼 263

11.14.2 重寫虛函式 263

11.14.3 虛析構函式 265

11.14.4 從基類的構造函式中調用虛函式 266

11.15 抽象基類 266

11.15.1 再論關於貸款的示例 267

11.15.2 關於虛函式的異常規範 267

11.16 里氏代換原則 268

11.17 多重繼承 270

11.17.1 虛基類 273

11.17.2 初始化虛基類 274

第12章 模板 278

12.1 概述 278

12.2 函式模板 278

12.2.1 不使用宏的原因 279

12.2.2 如何編寫函式模板 280

12.2.3 最佳化代碼 281

12.2.4 在何處使用函式模板 282

12.2.5 針對不同的參數類型進行實例化 283

12.2.6 顯式地指定類型 284

12.2.7 默認的函式參數 285

12.2.8 完全特殊化函式模板 286

12.2.9 如何調用特殊化的函式 288

12.2.10 對特殊化和重載的選擇 291

12.2.11 特殊化greater()函式模板 294

12.3 類模板 297

12.3.1 如何定義類模板 297

12.3.2 在類定義之外定義成員 298

12.3.3 實例化類模板 299

12.3.4 另一個模板的模板實例化 299

12.3.5 默認模板參數 300

12.3.6 在類模板中聲明另一個友元類 301

12.3.7 在類模板中聲明友元函式 301

12.3.8 特殊化類模板 307

12.3.9 在類模板中嵌入類模板 313

12.3.10 從類模板中派生新類 315

12.4 非類型模板參數 317

12.4.1 默認的模板參數和特殊化 318

12.4.2 關於使用非類型模板參數的有趣示例 320

12.5 成員模板 322

12.6 模板模式 326

12.7 關鍵字typename 329

第13章 運行時類型信息 332

13.1 概述 332

13.2 動態轉型態 332

13.3 動態轉型態是如何工作的 333

13.4 關鍵字typeid 335

第14章 輸出流 341

14.1 概述 341

14.2 實例 std::cerr和std::clog 341

14.3 如何格式化輸出 341

14.3.1 位格式標誌 342

14.3.2 如何打開位格式標誌 343

14.3.3 如何以合適的基數顯示整數 345

14.3.4 如何顯示整數的基數設定 347

14.3.5 如何顯示整數的符號 347

14.3.6 如何將輸出顯示為大寫字母 348

14.3.7 如何顯示字元 349

14.3.8 如何設定輸出欄位寬度 350

14.3.9 如何指定填充字元 351

14.3.10 如何指定欄位對齊 352

14.3.11 如何格式化浮點型數值 353

14.4 如何顯示bool類型 357

14.5 如何顯示地址 358

14.6 如何輸出到記憶體緩衝區 359

14.6.1 成員函式ostream::flush() 360

14.6.2 預定義的stdio和iostream流的混合使用 360

第15章 輸入流 362

15.1 概述 362

15.2 如何檢查錯誤 362

15.2.1 錯誤報告標誌 362

15.2.2 訪問成員函式 363

15.2.3 直接測試iostream對象 364

15.2.4 成員函式std::basic_ios::clear() 366

15.2.5 如何清空輸入流的緩衝區 368

15.3 字元輸入 370

15.3.1 使用提取運算符實現對字元串的輸入 372

15.3.2 限制輸入字元的個數 372

15.3.3 使用std::istream::getline()實現字元串輸入 374

第16章 操縱符 376

16.1 概述 376

16.2 操縱符的格式 376

16.3 一些簡單的操縱符 377

16.4 不帶參數調用的內置操縱符 380

16.5 使用帶有一個參數的操縱符 381

16.6 使用帶有一個參數的內置操縱符 383

第17章 檔案輸入/輸出 385

17.1 概述 385

17.2 檔案輸入/輸出類 385

17.3 檔案輸出 386

17.3.1 檔案名稱參數 386

17.3.2 檔案模式參數 387

17.3.3 驗證檔案是否打開 387

17.3.4 關閉打開的檔案 387

17.3.5 輸出磁碟檔案示例 388

17.4 檔案輸入 389

17.5 檔案位置標記 390

17.6 檔案更新 391

17.7 二進制模式 392

17.8 未格式化的輸出 394

17.9 未格式化的輸入 396

17.10 重定向I/O 397

第18章 string類與標準模板庫 400

18.1 概述 400

18.2 string類 400

18.3 標準模板庫 404

18.3.1 std::vector類 404

18.3.2 疊代器 407

18.3.3 疊代器的類型 408

18.3.4 基於string的I/O 414

18.3.5 標準模板庫中的算法 417

18.3.6 標準模板庫的主要容器 423

18.3.7 比較對象 423

附錄A 參考書目 429

附錄B C++準則 431

相關詞條

熱門詞條

聯絡我們