C++20 實踐入門, 6/e (Beginning C++20: From Novice to Professional, 6/e)

Ivor Horton,Peter Van Weert 譯 周百順

  • C++20 實踐入門, 6/e (Beginning C++20: From Novice to Professional, 6/e)-preview-1
  • C++20 實踐入門, 6/e (Beginning C++20: From Novice to Professional, 6/e)-preview-2
  • C++20 實踐入門, 6/e (Beginning C++20: From Novice to Professional, 6/e)-preview-3
C++20 實踐入門, 6/e (Beginning C++20: From Novice to Professional, 6/e)-preview-1

商品描述

主要內容: ● 開始使用C++20標準編寫程序 ● 使用C++進行模塊化編程 ● 使用數組、循環、指針、引用和字符串等 ● 編寫自己的函數、類型和運算符 ● 瞭解面向對象編程的要素 ● 使用重載、繼承、虛函數和多態性 ● 編寫泛型函數和類模板,並使用概念讓它們更安全 ● 深入瞭解容器、算法和範圍 ● 使用自動類型推斷、異常、移動語義、lambda表達式等

目錄大綱

第1章  基本概念 1

1.1  現代C++ 1

1.2  標準庫 2

1.3  C++程序概念 3

1.3.1  源文件 3

1.3.2  註釋和空白 3

1.3.3  標準庫模塊 4

1.3.4  函數 4

1.3.5  語句 5

1.3.6  數據的輸入和輸出 6

1.3.7  return語句 6

1.3.8  名稱空間 6

1.3.9  名稱和關鍵字 7

1.4  類和對象 7

1.5  模板 8

1.6  代碼的表示樣式和編程風格 8

1.7  創建可執行文件 9

1.8  過程化編程和麵向對象編程 10

1.9  表示數字 11

1.9.1  二進制數 11

1.9.2  十六進制數 12

1.9.3  負的二進制數 13

1.9.4  八進制數 15

1.9.5  Big-Endian和Little-Endian系統 15

1.9.6  浮點數 16

1.10  表示字符 17

1.10.1  ASCII 碼 18

1.10.2  UCS和Unicode 18

1.11  C++源字符 19

1.12  本章小結 20

1.13  練習 21

第2章  基本數據類型 23

2.1  變量、數據和數據類型 23

2.1.1  定義整型變量 24

2.1.2  零初始化 27

2.1.3  定義有固定值的變量 27

2.2  整型字面量 27

2.2.1  十進制整型字面量 27

2.2.2  十六進制的整型字面量 28

2.2.3  八進制的整型字面量 29

2.2.4  二進制的整型字面量 29

2.3  整數的計算 29

2.4  賦值運算 31

2.5  sizeof運算符 35

2.6  整數的遞增和遞減 35

2.7  定義浮點變量 37

2.8  浮點字面量 38

2.9  浮點數的計算 38

2.9.1  數學常量 38

2.9.2  數學函數 39

2.9.3  無效的浮點結果 42

2.9.4  缺點 43

2.10  混合的表達式和類型轉換 43

2.11  顯式類型轉換 44

2.12  格式化字符串 47

2.13  確定數值的上下限 52

2.14  使用字符變量 54

2.15  auto關鍵字 56

2.16  本章小結 57

2.17  練習 57

第3章  處理基本數據類型 59

3.1  運算符的優先級和相關性 59

3.2  位運算符 61

3.2.1  移位運算符 61

3.2.2  位模式下的邏輯運算 64

3.3  變量的生存期 69

3.4  全局變量 70

3.5  枚舉數據類型 73

3.6  數據類型的別名 76

3.7  本章小結 77

3.8  練習 78

第4章  決策 79

4.1  比較數據值 79

4.1.1  應用比較運算符 80

4.1.2  比較浮點數值 81

4.1.3  太空飛船運算符 82

4.2  if語句 84

4.2.1  嵌套的if語句 87

4.2.2  字符分類和轉換 88

4.3  if-else語句 90

4.3.1  嵌套的if-else語句 91

4.3.2  理解嵌套的if語句 92

4.4  邏輯運算符 93

4.4.1  邏輯與運算符 94

4.4.2  邏輯或運算符 94

4.4.3  邏輯非運算符 95

4.4.4  組合邏輯運算符 95

4.4.5  對整數操作數應用邏輯運算符 97

4.4.6  對比邏輯運算符與位運算符 97

4.5  條件運算符 99

4.6  switch語句 100

4.7  語句塊和變量作用域 106

4.8  本章小結 108

4.9  練習 108

第5章  數組和循環 111

5.1  數組 111

5.2  理解循環 113

5.3  for循環 113

5.4  避免幻數 115

5.5  用初始化列表定義數組的大小 117

5.6  確定數組的大小 117

5.7  用浮點數控制for循環 119

5.8  使用更復雜的for循環控制

表達式 120

5.9  基於範圍的for循環 122

5.10  while循環 123

5.11  do-while循環 125

5.12  嵌套的循環 127

5.13  跳過循環迭代 129

5.14  循環的中斷 131

5.15  使用無符號整數控制for循環 134

5.16  字符數組 135

5.17  多維數組 138

5.17.1  初始化多維數組 140

5.17.2  多維字符數組 141

5.18  在運行期間給數組分配內存

空間 143

5.19  數組的替代品 145

5.19.1  使用array<T,N>容器 145

5.19.2  使用std::vector<T>容器 150

5.20  本章小結 153

5.21  練習 154

第6章  指針和引用 157

6.1  什麽是指針 157

6.2  地址運算符 159

6.3  間接運算符 160

6.4  為什麽使用指針 161

6.5  char類型的指針 162

6.6  常量指針和指向常量的指針 165

6.7  指針和數組 167

6.7.1  指針的算術運算 168

6.7.2  使用數組名的指針表示法 170

6.8  動態內存分配 172

6.8.1  棧和自由存儲區 172

6.8.2  運算符new和delete 173

6.8.3  數組的動態內存分配 174

6.9  通過指針選擇成員 177

6.10  動態內存分配的危險 178

6.10.1  懸掛指針和多次釋放 178

6.10.2  分配與釋放的不匹配 178

6.10.3  內存泄漏 179

6.10.4  自由存儲區的碎片 179

6.11  內存分配的黃金準則 180

6.12  原始指針和智能指針 180

6.12.1  使用unique_ptr<T>指針 181

6.12.2  使用shared_ptr<T>指針 184

6.13  理解引用 187

6.13.1  定義引用 187

6.13.2  在基於範圍的for循環中

使用引用變量 188

6.14  本章小結 189

6.15  練習 190

第7章  操作字符串 191

7.1  更強大的string類 191

7.1.1  定義string對象 191

7.1.2  string對象的操作 195

7.1.3  訪問字符串中的字符 198

7.1.4  訪問子字符串 200

7.1.5  比較字符串 201

7.1.6  搜索字符串 207

7.1.7  修改字符串 213

7.1.8  對比std::string與

std::vector<char> 217

7.2  將字符串轉換為數字 217

7.3  國際字符串 218

7.3.1  存儲wchar_t字符的字符串 218

7.3.2  包含Unicode字符串的對象 219

7.4  原始字符串字面量 219

7.5  本章小結 221

7.6  練習 221

第8章  定義函數 223

8.1  程序的分解 223

8.1.1  類中的函數 224

8.1.2  函數的特徵 224

8.2  定義函數 224

8.2.1  函數體 226

8.2.2  返回值 227

8.2.3  函數聲明 227

8.3  給函數傳遞實參 229

8.3.1  按值傳遞 229

8.3.2  按引用傳遞 236

8.4  默認實參值 242

8.5  main()函數的實參 244

8.6  從函數中返回值 245

8.6.1  返回指針 245

8.6.2  返回引用 249

8.6.3  對比返回值與輸出參數 249

8.6.4  返回類型推斷 250

8.7  靜態變量 251

8.8  函數重載 252

8.8.1  重載和指針參數 254

8.8.2  重載和引用參數 254

8.8.3  重載和const參數 256

8.8.4  重載和默認實參值 257

8.9  遞歸 258

8.9.1  基本示例 258

8.9.2  遞歸算法 260

8.10  本章小結 265

8.11  練習 266

第9章  詞匯類型 269

9.1  使用可選值 269

9.2  字符串視圖:新的const string

引用 272

9.2.1  使用字符串視圖函數參數 274

9.2.2  合適的動機 274

9.3  span:新的向量或數組引用 275

9.3.1  span與視圖 276

9.3.2  const元素的span 277

9.3.3  固定大小的span 278

9.4  本章小結 278

9.5  練習 278

第10章  函數模板 281

10.1  函數模板 281

10.2  創建函數模板的實例 282

10.3  模板類型參數 283

10.4  顯式指定模板實參 284

10.5  函數模板的特化 284

10.6  函數模板和重載 285

10.7  帶有多個參數的函數模板 286

10.8  模板的返回類型推斷 287

10.9  模板參數的默認值 289

10.10  非類型的模板參數 290

10.11  縮寫的函數模板 293

10.12  本章小結 294

10.13  練習 294

第11章  模塊和名稱空間 297

11.1  模塊 297

11.1.1  第一個模塊 298

11.1.2  導出塊 300

11.1.3  將接口與實現分開 301

11.1.4  可達性與可見性 305

11.1.5  導出import聲明 306

11.1.6  管理較大的模塊 307

11.1.7  全局模塊片段 310

11.2  名稱空間 311

11.2.1  全局名稱空間 311

11.2.2  定義名稱空間 311

11.2.3  嵌套名稱空間 313

11.2.4  名稱空間和模塊 314

11.2.5  函數和名稱空間 315

11.2.6  使用指令和聲明 316

11.2.7  名稱空間別名 318

11.3  本章小結 318

11.4  練習 319

第12章  定義自己的數據類型 321

12.1  類和麵向對象編程 321

12.1.1  封裝 322

12.1.2  繼承 325

12.1.3  多態性 326

12.2  術語 326

12.3  定義類 327

12.4  構造函數 329

12.4.1  默認構造函數 329

12.4.2  定義類的構造函數 330

12.4.3  使用default關鍵字 331

12.4.4  在類的外部定義函數 332

12.4.5  默認構造函數的參數值 333

12.4.6  使用成員初始化列表 333

12.4.7  使用explicit關鍵字 334

12.4.8  委托構造函數 336

12.4.9  副本構造函數 337

12.5  訪問私有類成員 340

12.6  this指針 342

12.7  const對象和const成員函數 343

12.7.1  const成員函數 344

12.7.2  const正確性 345

12.7.3  重載const 346

12.7.4  常量的強制轉換 348

12.7.5  使用mutable關鍵字 348

12.8  友元 349

12.8.1  類的友元函數 349

12.8.2  友元類 351

12.9  類的對象數組 351

12.10  類對象的大小 353

12.11  類的靜態成員 353

12.11.1  靜態成員變量 354

12.11.2  訪問靜態成員變量 356

12.11.3  靜態常量 357

12.11.4  類類型的靜態成員變量 358

12.11.5  靜態成員函數 358

12.12  析構函數 359

12.13  使用指針作為類成員 361

12.14  嵌套類 374

12.15  本章小結 378

12.16  練習 379

第13章  運算符重載 381

13.1  為類實現運算符 381

13.1.1  運算符重載 382

13.1.2  實現重載運算符 382

13.1.3  非成員運算符函數 384

13.1.4  提供對運算符的全部支持 384

13.2  可以重載的運算符 386

13.3  運算符函數習語 388

13.4  為輸出流重載<<運算符 394

13.5  重載算術運算符 396

13.6  成員與非成員函數 400

13.7  重載一元運算符 402

13.8  重載遞增和遞減運算符 403

13.9  重載下標運算符 404

13.10  函數對象 409

13.11  重載類型轉換 410

13.12  重載賦值運算符 411

13.12.1  實現復制賦值運算符 411

13.12.2  復制賦值運算符與副本

構造函數 415

13.12.3  賦值不同類型 415

13.13  本章小結 416

13.14  練習 416

第14章  繼承 419

14.1  類和麵向對象編程 419

14.2  類的繼承 420

14.2.1  繼承和聚合 421

14.2.2  派生類 422

14.3  把類的成員聲明為protected 424

14.4  派生類成員的訪問級別 424

14.4.1  在類層次結構中使用訪問

修飾符 425

14.4.2  在類層次結構中選擇訪問

修飾符 426

14.4.3  改變繼承成員的訪問修飾符 427

14.5  派生類中的構造函數 428

14.5.1  派生類中的副本構造函數 431

14.5.2  派生類中的默認構造函數 432

14.5.3  繼承構造函數 433

14.6  繼承中的析構函數 434

14.7  重復的成員變量名 436

14.8  重復的成員函數名 436

14.9  多重繼承 437

14.9.1  多個基類 437

14.9.2  繼承成員的模糊性 438

14.9.3  重復繼承 442

14.9.4  虛基類 442

14.10  在相關的類類型之間轉換 443

14.11  本章小結 444

14.12  練習 444

第15章  多態性 447

15.1  理解多態性 447

15.1.1  使用基類指針 447

15.1.2  調用繼承的函數 449

15.1.3  虛函數 452

15.1.4  虛函數中的默認實參值 459

15.1.5  通過引用調用虛函數 460

15.1.6  多態集合 461

15.1.7  通過指針釋放對象 462

15.1.8  在指針和類對象之間轉換 464

15.1.9  動態強制轉換 465

15.1.10  調用虛函數的基類版本 468

15.1.11  在構造函數或析構函數中

調用虛函數 469

15.2  多態性引發的成本 471

15.3  確定動態類型 472

15.4  純虛函數 475

15.4.1  抽象類 476

15.4.2  用作接口的抽象類 478

15.5  本章小結 481

15.6  練習 481

第16章  運行時錯誤和異常 483

16.1  處理錯誤 483

16.2  理解異常 484

16.2.1  拋出異常 485

16.2.2  異常處理過程 486

16.2.3  導致拋出異常的代碼 487

16.2.4  嵌套的try塊 488

16.3  用類對象作為異常 489

16.3.1  匹配catch處理程序和異常 491

16.3.2  用基類處理程序捕獲派生類

異常 493

16.4  重新拋出異常 495

16.5  未處理的異常 497

16.6  捕獲所有的異常 498

16.7  不拋出異常的函數 500

16.7.1  noexcept限定符 500

16.7.2  異常和析構函數 501

16.8  異常和資源泄露 501

16.8.1  資源獲取即初始化 503

16.8.2  用於動態內存的標準RAII類 505

16.9  標準庫異常 506

16.9.1  異常類的定義 507

16.9.2  使用標準異常 508

16.10  本章小結 512

16.11  練習 512

第17章  類模板 515

17.1  理解類模板 515

17.2  定義類模板 516

17.2.1  模板類型參數 517

17.2.2  簡單的類模板 518

17.3  定義類模板的成員函數 519

17.3.1  構造函數模板 519

17.3.2  析構函數模板 520

17.3.3  下標運算符模板 520

17.3.4  賦值運算符模板 522

17.4  創建類模板的實例 526

17.5  測試數組類模板 527

17.6  非類型的類模板參數 530

17.6.1  帶有非類型參數的成員函數的

模板 531

17.6.2  非類型參數的實參 534

17.6.3  對比非類型模板實參與構造

函數實參 535

17.7  模板參數的默認值 536

17.8  類模板實參推斷 536

17.9  類模板特化 538

17.9.1  定義類模板特化 538

17.9.2  部分模板特化 539

17.10  帶有嵌套類的類模板 540

17.11  依賴名稱的麻煩問題 546

17.12  本章小結 550

17.13  練習 551

第18章  移動語義 555

18.1  lvalue和rvalue 555

18.2  移動對象 557

18.3  顯式移動對象 563

18.3.1  只能移動的類型 563

18.3.2  移動對象的繼續使用 564

18.4  看似矛盾的情況 565

18.4.1  std::move()並不移動任何東西 565

18.4.2  rvalue引用是一個lvalue 566

18.5  繼續探討函數定義 566

18.5.1  按rvalue引用傳遞 566

18.5.2  按值傳遞 568

18.5.3  按值返回 570

18.6  繼續討論定義移動成員 572

18.6.1  總是添加noexcept 572

18.6.2  “移動後交換”技術 575

18.7  特殊成員函數 577

18.7.1  默認移動成員 578

18.7.2  5的規則 578

18.7.3  0的規則 579

18.8  本章小結 580

18.9  練習 580

第19章  頭等函數 583

19.1  函數指針 583

19.1.1  定義函數指針 584

19.1.2  高階函數的回調函數 586

19.1.3  函數指針的類型別名 588

19.2  函數對象 589

19.2.1  基本的函數對象 589

19.2.2  標準函數對象 591

19.2.3  參數化函數對象 592

19.3  lambda表達式 593

19.3.1  定義lambda表達式 593

19.3.2  命名lambda閉包 594

19.3.3  向函數模板傳遞lambda

表達式 595

19.3.4  泛型lambda 596

19.3.5  捕獲子句 596

19.4  std::function<>模板 600

19.5  本章小結 602

19.6  練習 603

第20章  容器與算法 605

20.1  容器 605

20.1.1  順序容器 606

20.1.2  棧和隊列 608

20.1.3  關聯容器 610

20.2  迭代器 617

20.2.1  迭代器設計模式 617

20.2.2  標準庫容器的迭代器 618

20.2.3  數組的迭代器 626

20.3  算法 627

20.3.1  第一個示例 627

20.3.2  尋找元素 629

20.3.3  處理多個輸出值 630

20.3.4  刪除-擦除技術 632

20.3.5  排序 634

20.3.6  並行算法 635

20.3.7  範圍與視圖 635

20.4  視圖與範圍 637

20.5  本章小結 641

20.6  練習 642

第21章  受約束的模板和概念 645

21.1  無約束模板 645

21.2  受約束的模板 646

21.3  概念 648

21.3.1  概念定義和表達式 648

21.3.2  requires表達式 649

21.3.3  斷言類型建模了一個概念 653

21.3.4  標準概念 653

21.4  requires子句 654

21.5 簡寫表示法 655

21.6  受約束的函數模板 656

21.7 受約束的類模板 657

21.8  基於約束的特化 659

21.9  約束auto 661

21.10  本章小結 662

21.11  練習 662