深度探索 C++14 (Discovering Modern C++: An Intensive Course for Scientists, Engineers, and Programmers)

Peter Gottschling 吳野譯

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

商品描述

本書從傳統的Hello World開始,先介紹了語言入門C++所必須的基本要素(如表達式、語句、聲明);
再到和程序組織有關的函數、類;然後深入探討了C++所支持的泛型編程、元編程和麵向對像等不同編程範式,
並且提供了很多的例子可以讓讀者仔細體會它們之間的聯繫、區別和適用場景;
最後再以一個中型項目為例介紹了一些大型工程所必備的基礎知識。
本書適合C++初學者、正在開發和維護科學和工程軟件的軟件工程師,
以及希望學習和理解現代C++機制如泛型編程和元編程的讀者。

作者簡介

Peter Gottschling

熱衷於編寫前沿的科學計算軟件,他希望他的熱情也能感染讀者。
因為職業的緣故他編寫了MTL4(矩陣模板庫4),同時也是Boost Graph Library的作者之一。
他曾在多個C++課程和專業培訓中分享過開發經驗,並撰寫了本書。
譯者吳野,線上常用ID“空明流轉”。畢業後在數家IT企業工作過,擁有數年軟件開發和硬件設計經驗。
C++為其常用編程語言之一,業餘時間也會閱讀一些C++標準和標準提案。

目錄大綱

目錄
第1章C++基礎(C++ Basics) 1
1.1第一個程序(Our First Program) 1
1.2變量(Variables) 4
1.2.1常量(Constants) 7
1.2.2字面量(Literals ) 7
1.2.3非窄化的初始化(non-narrowing initialization) 9
1.2.4作用域(Scopes) 11
1.3操作符(Operators) 13
1.3.1算術操作符(Arithmetic Operators ) 14
1.3.2布爾操作符(Boolean Operators) 17
1.3.3位操作符(Bitwise Operators) 18
1.3.4賦值(Assignment) 19
1.3.5程序流(Program Flow) 19
1.3.6內存處理(Memory Handling) 20
1.3.7訪問操作符(Access Operators) 21
1.3.8類型處理(Type Handling) 21
1.3.9錯誤處理(Error Handling) 21
1 .3.10重載(Overloading) 22
1.3.11操作符優先級(Operator Precedence) 22
1.3.12避免副作用(Avoid Side Effects!) 22
1.4表達式和語句(Expressions and Statements) 25
1.4.1表達式(Expressions) 25
1.4.2語句(Statements) 26
1.4.3分支(Branching) 27
1.4.4循環(Loops) 29
1.4.5 goto 33
1.5函數(Functions) 33
1.5.1參數(Arguments) 34
1.5.2返回結果(Returning Results) 36
1.5.3內聯(Inlining ) 37
1.5.4重載(Overloading) 38
1.5.5 main函數(main Function) 40
1.6錯誤處理(Error Handling) 41
1.6.1斷言(Assertions) 41
1.6.2異常(Exceptions) 43
1.6.3靜態斷言(Static Assertions) 48
1.7 I/O 48
1.7.1標準輸出(Standard Output) 48
1.7.2標準輸入(Standard Input) 49
1. 7.3文件的輸入和輸出(Input/Output with Files) 49
1.7.4泛化的流概念(Generic Stream Concept) 50
1.7.5格式化(Formatting) 51
1.7.6處理輸入輸出錯誤(Dealing with I/O Errors) 53
1.8數組、指針和引用(Arrays, Pointers, and References) 56
1.8. 1數組(Arrays) 56
1.8.2指針(Pointers) 58
1.8.3智能指針(Smart Pointers) 62
1.8.4引用(References) 65
1.8.5指針和引用的比較(Comparison between Pointers and References) 66
1.8.6不要引用過期數據(Do Not Refer to Outdated Data!) 67
1.8.7數組的容器(Containers for Arrays) 67
1.9軟件項目結構化(Structuring Software Projects ) 70
1.9.1註釋(Comments) 70
1.9.2預編譯指示字(Preprocessor Directives) 71
1.10練習(Exercises) 75
1.10.1年齡(Age) 75
1.10.2數組和指針(Arrays and Pointers) 76
1.10.3讀取一個矩陣市場文件的頭部(Read the Header of a Matrix Market File) 76

第2章類(Classes) 77
2.1為普遍意義而不是技術細節編程(Program for Universal Meaning Not for Technical Details) 77
2.2成員(Members) 79
2.2.1成員變量(Member Variables) 80
2.2.2可訪問性(Accessibility) 80
2.2.3訪問操作符(Access Operators) 83
2.2.4類的靜態聲明符(The Static Declarator for Classes) 84
2.2.5成員函數(Member Functions) 84
2.3設置值:構造函數和賦值(Setting Values: Constructors and Assignments) 85
2.3.1構造函數(Constructors) 86
2.3.2賦值(Assignment) 96
2.3.3初始化器列表(Initializer Lists) 97
2.3.4一致性初始化(Uniform Initialization) 99
2.3.5移動語義(Move Semantic) 101
2.4析構函數(Destructors) 105
2.4.1實現準則(Implementation Rules) 105
2.4.2適當處理資源(Dealing with Resources Properly) 106
2.5自動生成方法清單(Method Generation Résumé) 112
2.6成員變量訪問(Accessing Member Variables) 113
2.6.1訪問函數(Access Functions ) 113
2.6.2下標操作符(Subscript Operator) 115
2.6.3常量成員函數(Constant Member Functions) 116
2.6.4引用限定的變量(Reference-Qualified Members) 117
2.7操作符重載的設計(Operator Overloading Design) 118
2.7.1保持一致!(Be Consistent!) 119
2.7.2注意優先級(Respect the Priority) 120
2.7.3成員函數和自由函數(Member or Free Function) 120
2.8練習(Exercises) 123
2.8.1多項式(Polynomial) 123
2.8.2移動賦值(Move Assignment) 123
2.8.3初始化器列表(Initializer List) 123
2.8.4資源管理(Resource Rescue) 124

第3章泛型編程(Generic Programming) 125
3.1函數模板(Function Templates) 125
3.1.1實例化(Instantiation) 127
3.1.2參數類型的推導(Parameter Type Deduction) 128
3.1.3在模板中處理錯誤(Dealing with Errors in Templates) 132
3.1.4混合類型(Mixing Types) 133
3.1.5一致性初始化(Uniform Initialization) 134
3.1.6自動返回值類型(Automatic return Type) 134
3.2命名空間與函數查找(Namespaces and Function Lookup) 135
3.2.1命名空間(Namespaces) 135
3.2.2參數相關查找(Argument-Dependent Lookup) 138
3.2.3命名空間限定還是ADL(Namespace Qualification or ADL ) 142
3.3類模板(Class Templates) 144
3.3.1一個容器的範例(A Container Example) 144
3.3.2為類和函數設計統一的接口(Designing Uniform Class and Function Interfaces) 146
3 .4類型推導與定義(Type Deduction and Definition) 153
3.4.1自動變量類型(Automatic Variable Type) 153
3.4.2表達式的類型(Type of an Expression) 154
3.4.3 decltype(auto) 155
3.4.4定義類型(Defining Types ) 156
3.5關於模板的一點點理論:概念(A Bit of Theory on Templates: Concepts) 158
3.6模板特化(Template Specialization) 159
3.6.1為單個類型特化類(Specializing a Class for One Type) 159
3.6.2函數特化和重載(Specializing and Overloading Functions) 162
3.6.3部分特化(Partial Specialization) 164
3.6.4函數的部分特化(Partially Specializing Functions ) 165
3.7模板的非類型參數(Non-Type Parameters for Templates) 168
3.8仿函數(Functors) 170
3.8.1類似函數的參數(Function-like Parameters) 172
3.8.2組合仿函數(Composing Functors) 173
3.8.3遞歸(Recursion) 175
3.8.4泛型歸納函數(Generic Reduction) 179
3.9匿名函數(Lambda) 180
3.9.1捕獲(Capture) 181
3.9.2按值捕獲(Capture by Value) 181
3.9 .3按引用捕獲(Capture by Reference) 182
3.9.4廣義捕獲(Generalized Capture) 184
3.9.5泛型匿名函數(Generic Lambdas) 185
3.10變參模板(Variadic Templates) 186
3. 11練習(Exercises) 188
3.11.1字符串表示(String Representation) 188
3.11.2元組的字符串表示(String Representation of Tuples) 188
3.11.3泛型棧(Generic Stack) 188
3.11.4向量的迭代器(Iterator of a Vector) 189
3.11.5奇數迭代器(Odd Iterator) 189
3.11.6奇數範圍(Odd Range) 189
3.11.7 bool變量的棧(Stack of bool) 190
3.11.8自定義大小的棧(Stack with Custom Size) 190
3.11.9非類型模板參數的推導(Deducing Non-type Template Arguments) 190
3.11.10梯形公式(Trapezoid Rule) 190
3.11.11仿函數(Functor) 191
3.11.12匿名函數(Lambda) 191
3.11.13實現make_unique(Implement make_unique) 191

第4章庫(Libraries) 192
4.1標準模板庫(Standard Template Library) 193
4.1.1入門示例(Introductory Example) 193
4. 1.2迭代器(Iterators) 194
4.1.3容器(Containers) 199
4.1.4算法(Algorithms) 208
4.1.5超越迭代器(Beyond Iterators) 215
4.2數值(Numerics) 216
4.2.1複數(Complex Numbers) 217
4.2.2隨機數發生器(Random Number Generators) 220
4.3元編程(Meta-programming) 230
4.3.1極限(Limits) 230
4.3 .2類型特徵(Type Traits) 232
4.4支持庫(Utilities) 234
4.4.1元組(Tuple) 235
4.4.2函數(function) 238
4.4.3引用包裝器(Reference Wrapper) 240
4.5就是現在(The Time Is Now) 242
4.6並發(Concurrency) 244
4.7標準之外的科學計算程序庫(Scientific Libraries Beyond the Standard) 248
4.7.1其他算術運算庫(Other Arithmetics) 248
4.7.2區間算術(Interval Arithmetic) 248
4 .7.3線性代數(Linear Algebra) 249
4.7.4常微分方程(Ordinary Differential Equations) 249
4.7.5偏微分方程(Partial Differential Equations) 249
4.7.6圖論算法(Graph Algorithms ) 250
4.8練習(Exercises) 250
4.8.1按模排序(Sorting by Magnitude) 250
4.8.2 STL容器(STL Container) 250
4.8.3複數(Complex Numbers) 250

第5章元編程(Meta-Programming) 252
5.1讓編譯器進行計算(Let the Compiler Compute) 252
5.1.1編譯期函數(Compile-Time Functions) 253
5.1.2擴展的編譯期函數(Extended Compile-Time Functions) 255
5.1.3質數(Primeness) 257
5.1.4此常數?彼常數?(How Constant Are Our Constants?) 259
5.2提供和使用類型信息(Providing and Using Type Information) 260
5.2.1類型特徵(Type Traits) 261
5.2.2條件異常處理(Conditional Exception Handling) 264
5.2.3一個const整潔視圖的用例(A const-Clean View Example) 265
5.2.4標準類型特徵(Standard Type Traits) 272
5.2.5領域特定的類型屬性(Domain-Specific Type Properties) 272
5.2.6 enable_if 274
5.2.7新版變參模板(Variadic Templates Revised) 278
5.3表達式模板(Expression Templates) 281
5.3.1一個簡單的操作符實現(Simple Operator Implementation) 281
5.3.2一個表達式模板類(An Expression Template Class) 285
5.3.3泛化的表達式模板(Generic Expression Templates) 288
5.4元優化:編寫你自己的編譯器優化(Meta-Tuning: Write Your Own Compiler Optimization) 290
5.4.1經典的固定大小的循環展開(Classical Fixed-Size Unrolling) 292
5.4.2嵌套展開(Nested Unrolling) 295
5.4.3動態循環展開――熱身(Dynamic Unrolling―Warm-up) 301
5.4.4展開向量表達式(Unrolling Vector Expressions) 303
5.4.5調優表達式模板(Tuning an Expression Template) 305
5.4.6調優縮減運算(Tuning Reduction Operations) 308
5.4.7調優嵌套循環(Tuning Nested Loops) 316
5.4.8調優一覽(Tuning Résumé) 322
5.5練習(Exercises) 323
5.5.1類型特徵(Type Traits) 323
5.5.2 Fibonacci數列(Fibonacci Sequence) 323
5.5.3元編程版的最大公約數(Meta-Program for Greatest Common Divisor) 323
5.5.4向量表達式模板(Vector Expression Template) 324
5.5.5元列表(Meta-List) 325

第6章面向對象編程(Object-Oriented Programming) 326
6.1基本原則(Basic Principles) 327
6.1.1基類和派生類(Base and Derived Classes) 327
6.1.2繼承構造(Inheriting Constructors) 331
6.1.3虛函數和多態類(Virtual Functions and Polymorphic Classes) 332
6 .1.4基於繼承的仿函數(Functors via Inheritance) 338
6.2消除冗餘(Removing Redundancy) 339
6.3多重繼承(Multiple Inheritance) 340
6.3.1多個父類(Multiple Parents) 340
6.3.2公共祖父(Common Grandparents) 342
6.4通過子類型進行動態選擇(Dynamic Selection by Sub-typing) 347
6.5轉換(Conversion) 350
6.5.1在基類和派生類之間轉換(Casting between Base and Derived Classes) 351
6.5.2 const轉換(const-Cast) 356
6.5.3重解釋轉型(Reinterpretation Cast) 356
6.5.4函數風格的轉型(Function-Style Conversion) 357
6.5.5隱式轉換(Implicit Conversions) 359
6.6 CRTP 359
6.6 .1一個簡單的例子(A Simple Example) 360
6.6.2一個可複用的訪問操作符(A Reusable Access Operator) 361
6.7練習(Exercises) 364
6.7.1無冗餘的菱形繼承(Non-redundant Diamond Shape) 364
6.7.2繼承向量類(Inheritance Vector Class) 364
6.7.3克隆函數(Clone Function) 364

第7章科學計算項目(Scientific Projects) 365
7.1常微分方程解算器的實現(Implementation of ODE Solvers) 365
7.1.1常微分方程(Ordinary Differential Equations) 366
7.1.2龍格-庫塔法(Runge-Kutta Algorithms) 368
7.1. 3泛型實現(Generic Implementation) 369
7.1.4展望(Outlook) 376
7.2創建工程(Creating Projects) 377
7.2.1構建過程(Build Process) 378
7.2.2構建工具(Build Tools) 382
7.2.3分離編譯(Separate Compilation) 386
7.3最終的話(Some Final Words) 391
附錄A雜談(Clumsy Stuff) 393
A.1更多好的或者不好的軟件(More Good and Bad Scientific Software) 393
A.2細節中的基礎(Basics in Detail) 400
A.2.1關於字面量修飾的其他事項(More about Qualifying Literals) 400
A.2.2靜態變量(static Variables) 401
A.2.3關於if的其他事項(More about if) 402
A.2.4達夫設備(Duff's Device) 404
A.2.5關於main的其他事項(More about main) 404
A.2.6異常還是斷言?(Assertion or Exception?) 405
A.2.7二進制I/O(Binary I/O) 406
A.2.8 C風格的I/O(C-Style I/O) 407
A.2.9垃圾收集(Garbage Collection) 408
A.2.10宏的麻煩(Trouble with Macros) 409
A.3現實世界的用例:矩陣求逆(Real-World Example: Matrix Inversion) 411
A.4類的一些細節(Class Details) 421
A.4.1指向成員的指針(Pointer to Member) 421
A.4.2更多的初始化例子(More Initialization Examples) 422
A.4.3多維數組的存取(Accessing Multi-dimensional Arrays) 423
A.5方法的生成(Method Generation) 426
A.5.1控制生成的代碼(Controlling the Generation) 428
A.5.2代碼生成的規則(Generation Rules) 429
A.5.3陷阱和設計指南(Pitfalls and Design Guides) 434
A.6模板相關的細節(Template Details) 438
A.6.1統一初始化(Uniform Initialization) 438
A.6.2哪個函數被調用了?(Which Function Is Called?) 439
A.6.3針對特定硬件的特化(Specializing for Specific Hardware) 442
A.6.4變參二進制I/O(Variadic Binary I/O) 443
A.7使用C++03中的std::vector(Using std::vector in C++03) 444
A.8復古風格的動態選擇(Dynamic Selection in Old Style) 445
A.9元編程的一些細節(Meta-Programming Details) 446
A.9.1歷史上的第一個元程序(First Meta-Program in History) 446
A.9.2元函數(Meta-Functions) 448
A.9.3向下兼容的靜態斷言(Backward-Compatible Static Assertion) 450
A.9.4匿名類型參數(Anonymous Type Parameters) 450
A.9.5 “動態循環展開”的性能基準測試源碼(Benchmark Sources of Dynamic Unrolling) 454
A.9.6矩陣乘法的性能基準測試(Benchmark for Matrix Product) 455
附錄B編程工具(Programming Tools) 456
B.1 gcc 456
B.2調試(Debugging) 457
B.2.1基於文本的調試器(Text-Based Debugger) 458
B.2.2使用圖形界面DDD進行調試(Debugging with Graphical Interface: DDD) 460
B.3內存分析(Memory Analysis) 462
B.4 gnuplot 463
B.5 UNIX、Linux和macOS系統(UNIX, Linux, and macOS) 464
附錄C語言定義(Language Definitions) 467
C.1值類別(Value Categories) 467
C.2操作符概覽(Operator Overview) 468
C.3類型轉換規則(Conversion Rules) 470
C.3.1類型提升(Promotion) 471
C.3.2其他類型提升(Other Conversions) 471
C.3.3常用的數值轉換(Usual Arithmetic Conversions) 472
C.3.4窄化(Narrowing)