C++ 現代編程技術寫給工程師的 C++ 教程 Discovering Modern C++, 2/e

[德]彼得·哥特史林(Peter Gottschling)

  • C++ 現代編程技術寫給工程師的 C++ 教程-preview-1
  • C++ 現代編程技術寫給工程師的 C++ 教程-preview-2
C++ 現代編程技術寫給工程師的 C++ 教程-preview-1

買這商品的人也買了...

相關主題

商品描述

在科學和工程領域,很多軟件都是用C++來實現的。隨著軟件項目的規模越來越大,C++的優勢更加突出。C++既能夠支持足夠貼近硬件層面的編程工作,又能夠駕馭高級抽象的編程需求。因此,全面掌握C++語言的語法及新特性,對開發者非常重要。

本書由淺入深地介紹了C++編程的方方面面,涉及C++基礎、類、泛型編程、程序庫、元編程、面向對象編程、科學項目等內容,還通過3個附錄(程序庫、編程工具、語言規範)全面介紹了一些拓展知識。

本書適合想全面學習C++編程的讀者以及對C++新特性感興趣的讀者閱讀參考。

作者簡介

彼得·哥特史林(Peter Gottschling)专注于开发行业领先的科学计算软件,是 ISO C++ 标准委员会成员,德国编程语言标准委员会主席,以及德累斯顿 C++ 用户组的创始人。曾就读于德累斯顿工业大学,并同时学习了数学和计算机科学两门专业,分别获得学士学位和博士学位。

目錄大綱

第 1章 C++基礎 1

1.1 我們的第 一個程序 1

1.2 變量 3

1.2.1 內置類型 4

1.2.2 字符和字符串 5

1.2.3 聲明變量 6

1.2.4 常量 6

1.2.5 字面量 7

1.2.6 非窄化初始化 9

1.2.7 作用域 10

1.3 操作符 12

1.3.1 算術操作符 13

1.3.2 布爾操作符 15

1.3.3 位操作符 17

1.3.4 賦值操作符 17

1.3.5 程序控制流 18

1.3.6 內存管理 19

1.3.7 訪問操作符 19

1.3.8 類型處理 19

1.3.9 異常處理 20

1.3.10 操作符重載 20

1.3.11 操作符優先級 20

1.3.12 避免歧義 21

1.4 表達式和語句 23

1.4.1 表達式 23

1.4.2 語句 24

1.4.3 分支 24

1.4.4 循環 27

1.4.5 goto 30

1.5 函數 30

1.5.1 參數 30

1.5.2 返回值 32

1.5.3 內聯 33

1.5.4 重載 34

1.5.5 main函數 35

1.6 異常處理 36

1.6.1 斷言 36

1.6.2 異常 38

1.6.3 靜態斷言 42

1.7 I/O 42

1.7.1 標準輸出 42

1.7.2 標準輸入 43

1.7.3 文件的輸入和輸出 43

1.7.4 通用流的概念 44

1.7.5 格式化 45

1.7.6 新型格式化 46

1.7.7 處理I/O異常 49

1.7.8 文件系統 52

1.8 數組、指針和引用 53

1.8.1 數組 53

1.8.2 指針 55

1.8.3 智能指針 57

1.8.4 引用 60

1.8.5 指針和引用的區別 61

1.8.6 不要引用過期數據 61

1.8.7 數組的容器 62

1.9 結構化的軟件項目 64

1.9.1 註釋 65

1.9.2 預處理器指令 66

1.10 練習 70

1.10.1 窄化 70

1.10.2 字面量 70

1.10.3 操作符 70

1.10.4 分支 71

1.10.5 循環 71

1.10.6 I/O 71

1.10.7 數組和指針 71

1.10.8 函數 71

第 2章 類 72

2.1 為通用性編程而不局限於技術細節 72

2.2 成員 74

2.2.1 成員變量 74

2.2.2 可訪問性 75

2.2.3 訪問操作符 77

2.2.4 類的靜態聲明 77

2.2.5 成員函數 78

2.3 設置值:構造函數與賦值 79

2.3.1 構造函數 79

2.3.2 賦值 88

2.3.3 初始化器列表 89

2.3.4 統一初始化 91

2.3.5 移動語義 93

2.3.6 通過字面量構造對象 102

2.4 析構函數 104

2.4.1 實現規則 104

2.4.2 妥善處理資源 104

2.5 方法生成總結 110

2.6 訪問成員變量 111

2.6.1 訪問函數 111

2.6.2 下標操作符 112

2.6.3 常量成員函數 113

2.6.4 引用限定的成員 114

2.7 操作符重載的設計 116

2.7.1 保持一致性 116

2.7.2 優先級 117

2.7.3 成員函數和自由函數 117

2.7.4 重載等式 119

2.7.5 重載“飛船”運算符 121

2.7.6 重載中的類型系統 123

2.8 練習 124

2.8.1 多項式 124

2.8.2 有理數 124

2.8.3 移動賦值 125

2.8.4 初始化器列表 125

2.8.5 資源管理 125

第3章 泛型編程 126

3.1 函數模板 126

3.1.1 實例化 127

3.1.2 參數類型推導 128

3.1.3 處理模板中的異常 132

3.1.4 混合類型 133

3.1.5 統一初始化 134

3.1.6 自動返回的類型 134

3.1.7 模板參數簡化 135

3.2 命名空間和函數查找 135

3.2.1 命名空間 135

3.2.2 參數依賴查找 138

3.2.3 命名空間限定和ADL 142

3.3 類模板 144

3.3.1 容器示例 144

3.3.2 設計統一的類和函數接口 146

3.4 類型推導和定義 151

3.4.1 自動變量類型 152

3.4.2 表達式的類型 152

3.4.3 decltype(auto) 153

3.4.4 類模板參數推導 154

3.4.5 推導多種類型 156

3.4.6 定義類型 157

3.5 模板特例化 159

3.5.1 為某種類型特例化一個類 159

3.5.2 函數特例化和重載 162

3.5.3 類的偏特化 163

3.5.4 偏特化函數 164

3.5.5 用戶自定義類型的結構化綁定 166

3.5.6 用戶自定義格式化 169

3.6 模板的非類型參數 171

3.6.1 固定大小的容器 171

3.6.2 推導非類型參數 173

3.7 函子 174

3.7.1 類函數參數 176

3.7.2 組合函子 177

3.7.3 遞歸 178

3.7.4 泛型規約 181

3.8 lambda表達式 182

3.8.1 捕獲 183

3.8.2 泛型lambda 186

3.9 變量模板 188

3.10 概念編程 190

3.10.1 定義概念 191

3.10.2 通過概念分發 194

3.10.3 類中的概念 195

3.10.4 概念設計 197

3.11 可變參數模板 197

3.11.1  遞歸函數 197

3.11.2 直接展開 199

3.11.3 索引序列 200

3.11.4 折疊表達式 202

3.11.5 類型生成器 202

3.11.6 增長測試 203

3.12 練習 205

3.12.1 字符串表達 205

3.12.2 元組的字符串表達 205

3.12.3 泛型堆棧 205

3.12.4 帶類型參數的有理數 205

3.12.5 向量的迭代器 206

3.12.6 奇數迭代器 206

3.12.7 奇數範圍 206

3.12.8 bool堆棧 206

3.12.9 自定義大小的堆棧 206

3.12.10 梯形法則 207

3.12.11 帶靜態函數的部分特例化 207

3.12.12 Functor函子 207

3.12.13 Lambda 207

3.12.14 實現 make_unique 207

第4章 程序庫 208

4.1 標準模板庫 208

4.1.1 入門示例 209

4.1.2 迭代器 209

4.1.3 容器 214

4.1.4 算法 223

4.1.5 範圍(Range) 228

4.1.6 並行計算 234

4.2 數值計算 236

4.2.1 復數 236

4.2.2 隨機數生成器 239

4.2.3 數學專用函數 247

4.2.4 數學常量 248

4.3 元編程 249

4.3.1 極限(limits) 250

4.3.2 類型特徵 251

4.4 實用程序 253

4.4.1 optional 253

4.4.2 元組(tuple) 254

4.4.3 variant 256

4.4.4 any 258

4.4.5 string_view 259

4.4.6 span 260

4.4.7 function 261

4.4.8 引用包裝器 263

4.5 關於時間 264

4.6 並發編程 267

4.6.1 專用術語 267

4.6.2 概述 267

4.6.3 thread 268

4.6.4 關於調用者 269

4.6.5 異步調用 271

4.6.6 異步解析器 272

4.6.7 可變互斥鎖 277

4.6.8 協程 278

4.6.9 其他新的並發特性 280

4.7 高級科學軟件庫 280

4.7.1 替代算法 280

4.7.2 區間運算 281

4.7.3 線性代數 281

4.7.4 常微分方程 281

4.7.5 偏微分方程 282

4.7.6 圖形算法 282

4.8 練習 282

4.8.1 根據大小排序 282

4.8.2 將lambda表達式作為謂詞進行

查找 282

4.8.3 STL 容器 283

4.8.4 復數 283

4.8.5 並行的向量加法 284

4.8.6 重構並行加法 284

第5章 元編程 285

5.1 讓編譯器計算 285

5.1.1 編譯期函數 285

5.1.2 擴展編譯期函數 287

5.1.3 素數 289

5.1.4 常量的恆定性 291

5.1.5 編譯期lambda表達式 292

5.2 提供和使用類型信息 293

5.2.1 類型特徵 294

5.2.2 條件異常處理 297

5.2.3 const簡潔視圖用例 298

5.2.4 參數化有理數 304

5.2.5 特定領域的類型屬性 306

5.2.6 enable_if 307

5.2.7 可變參數模板的優化 311

5.3 表達式模板 314

5.3.1 簡單的操作符 314

5.3.2 表達式模板類 317

5.3.3 泛型表達式模板 320

5.3.4 在數據過期之前復制 321

5.4 元調優:編寫自定義編譯器優化 323

5.4.1 經典的固定尺寸展開 325

5.4.2 嵌套展開 327

5.4.3 動態展開 332

5.4.4 展開向量表達式 334

5.4.5 優化表達式模板 335

5.4.6 調優簡化操作 338

5.4.7 嵌套循環調優 345

5.4.8 調優小結 348

5.5 語義概念優化 349

5.5.1 語義調優的需求 350

5.5.2 語義概念層次 353

5.6 圖靈完備性 355

5.7 練習 357

5.7.1 類型特徵 357

5.7.2 斐波那契數列 357

5.7.3 最大公約數元程序 358

5.7.4 混合類型的有理數 358

5.7.5 向量表達式模板 358

5.7.6 元列表 359

第6章 面向對象編程 360

6.1 基本原則 360

6.1.1 基類和派生類 361

6.1.2 繼承構造函數 364

6.1.3 虛函數和多態類 365

6.1.4 通過繼承實現函子 371

6.1.5 派生Exception類 372

6.2 去除冗餘 374

6.3 多重繼承 375

6.3.1 多個父類 375

6.3.2 普通的“祖父母” 376

6.4 子類型的動態選擇 381

6.5 轉型 384

6.5.1 基類和派生類之間的轉換 384

6.5.2 常量轉型 388

6.5.3 重新解析的轉型 388

6.5.4 函數式轉型 388

6.5.5 隱式轉換 390

6.6 高級技術 391

6.6.1 CRTP 391

6.6.2 包含重載的類型特徵 395

6.7 練習 399

6.7.1 非冗餘菱形 399

6.7.2 繼承向量類 399

6.7.3 重構向量中的異常 399

6.7.4 拋出異常測試 399

6.7.5 Clone 函數 400

第7章 科學項目 401

7.1 ODE解析器的實現 401

7.1.1 常微分方程 401

7.1.2 Runge-Kutta算法 403

7.1.3 泛型實現 404

7.1.4 展望 411

7.2 創建項目 412

7.2.1 構建過程 412

7.2.2 構建工具 416

7.2.3 單獨編譯 420

7.3 模塊 423

7.4 結語 427

附錄A 程序庫 428

A.1 科學軟件的優劣 428

A.2 基本的細節 434

A.2.1 靜態變量 434

A.2.2 關於if語句 435

A.2.3 達夫設備 436

A.2.4 程序調用 436

A.2.5 斷言和異常 437

A.2.6 二進制I/O 438

A.2.7 C風格的 I/O 439

A.2.8 垃圾回收機制 440

A.2.9 宏的問題 440

A.3 實際用例:矩陣轉置 442

A.4 類的詳細信息 451

A.4.1 指向成員的指針 451

A.4.2 更多初始化示例 451

A.4.3 訪問多維數據結構 452

A.5 方法生成 455

A.5.1 自動生成 455

A.5.2 控制生成 458

A.5.3 生成規則 458

A.5.4 設計指南和不足 462

A.6 模板 465

A.6.1 統一初始化 465

A.6.2 函數調用 466

A.6.3 為特定硬件特例化 469

A.6.4 可變參數二進制I/O 470

A.7 關於軟件庫的更多信息 471

A.7.1 在C++03中使用std::vector 471

A.7.2 可變參數 471

A.8 舊式的動態選擇 472

A.9 元編程 473

A.9.1 歷史上的第 一個元編程 473

A.9.2 元函數 475

A.9.3 向後兼容的靜態斷言 477

A.9.4 匿名類型參數 477

A.10 鏈接到C代碼 480

附錄B 編程工具 483

B.1 g++ 483

B.2 調試 484

B.2.1 基於文本的調試器 484

B.2.2 圖形化界面調試工具:DDD 486

B.3 內存分析 488

B.4 gnuplot 489

B.5 UNIX、Linux和macOS 490

附錄C 語言規範 492

C.1 值類別 492

C.2 操作符概要 493

C.3 轉換規則 496

C.3.1 提升 496

C.3.2 其他轉換 496

C.3.3 常用的算術轉換 497

C.3.4 窄化 498

參考資料 499