s scientific and engineering projects grow larger and more complex, it is increasingly likely that those projects will be written in C++. With embedded hardware growing more powerful, much of its software is moving to C++, too. Mastering C++ gives you strong skills for programming at nearly every level, from “close to the hardware” to the highest-level abstractions. In short, C++ is a language that scientific and technical practitioners need to know.
Author(s): Peter Gottschling
Series: C++ In-Depth Series
Edition: 1st
Publisher: Addison-Wesley Professiona
Year: 2015
Language: English
Pages: 474
Tags: C++
Cover......Page 1
Title Page......Page 4
Copyright Page......Page 5
Contents......Page 8
Reasons to Learn C++......Page 18
The Beauty and the Beast......Page 19
Languages in Science and Engineering......Page 20
Typographical Conventions......Page 21
Acknowledgments......Page 24
About the Author......Page 26
1.1 Our First Program......Page 28
1.2 Variables......Page 30
1.2.1 Constants......Page 32
1.2.2 Literals......Page 33
1.2.3 Non-narrowing Initialization......Page 34
1.2.4 Scopes......Page 35
1.3 Operators......Page 37
1.3.1 Arithmetic Operators......Page 38
1.3.2 Boolean Operators......Page 41
1.3.4 Assignment......Page 42
1.3.5 Program Flow......Page 43
1.3.8 Type Handling......Page 44
1.3.12 Avoid Side Effects!......Page 45
1.4.2 Statements......Page 48
1.4.3 Branching......Page 49
1.4.4 Loops......Page 51
1.4.5 goto......Page 54
1.5.1 Arguments......Page 55
1.5.2 Returning Results......Page 57
1.5.4 Overloading......Page 58
1.5.5 main Function......Page 60
1.6.1 Assertions......Page 61
1.6.2 Exceptions......Page 62
1.7.1 Standard Output......Page 67
1.7.3 Input/Output with Files......Page 68
1.7.4 Generic Stream Concept......Page 69
1.7.5 Formatting......Page 70
1.7.6 Dealing with I/O Errors......Page 71
1.8.1 Arrays......Page 74
1.8.2 Pointers......Page 76
1.8.3 Smart Pointers......Page 78
1.8.6 Do Not Refer to Outdated Data!......Page 82
1.8.7 Containers for Arrays......Page 83
1.9 Structuring Software Projects......Page 85
1.9.1 Comments......Page 86
1.9.2 Preprocessor Directives......Page 87
1.10.1 Age......Page 90
1.10.3 Read the Header of a Matrix Market File......Page 91
2.1 Program for Universal Meaning Not for Technical Details......Page 92
2.2.1 Member Variables......Page 94
2.2.2 Accessibility......Page 95
2.2.4 The Static Declarator for Classes......Page 97
2.2.5 Member Functions......Page 98
2.3.1 Constructors......Page 99
2.3.2 Assignment......Page 108
2.3.3 Initializer Lists......Page 109
2.3.4 Uniform Initialization......Page 110
2.3.5 Move Semantics......Page 112
2.4.1 Implementation Rules......Page 116
2.4.2 Dealing with Resources Properly......Page 117
2.5 Method Generation Résumé......Page 122
2.6.1 Access Functions......Page 123
2.6.2 Subscript Operator......Page 124
2.6.3 Constant Member Functions......Page 125
2.6.4 Reference-Qualified Members......Page 126
2.7 Operator Overloading Design......Page 127
2.7.2 Respect the Priority......Page 128
2.7.3 Member or Free Function......Page 129
2.8.2 Move Assignment......Page 131
2.8.4 Resource Rescue......Page 132
3.1 Function Templates......Page 134
3.1.1 Instantiation......Page 135
3.1.2 Parameter Type Deduction......Page 136
3.1.4 Mixing Types......Page 140
3.2.1 Namespaces......Page 142
3.2.2 Argument-Dependent Lookup......Page 145
3.2.3 Namespace Qualification or ADL......Page 149
3.3 Class Templates......Page 150
3.3.1 A Container Example......Page 151
3.3.2 Designing Uniform Class and Function Interfaces......Page 152
3.4.1 Automatic Variable Type......Page 158
3.4.2 Type of an Expression......Page 159
3.4.3 decltype(auto)......Page 160
3.4.4 Defining Types......Page 161
3.6 Template Specialization......Page 163
3.6.1 Specializing a Class for One Type......Page 164
3.6.2 Specializing and Overloading Functions......Page 166
3.6.3 Partial Specialization......Page 168
3.6.4 Partially Specializing Functions......Page 169
3.7 Non-Type Parameters for Templates......Page 171
3.8 Functors......Page 173
3.8.1 Function-like Parameters......Page 175
3.8.2 Composing Functors......Page 176
3.8.3 Recursion......Page 177
3.8.4 Generic Reduction......Page 180
3.9 Lambda......Page 181
3.9.1 Capture......Page 182
3.9.2 Capture by Value......Page 183
3.9.3 Capture by Reference......Page 184
3.9.4 Generalized Capture......Page 185
3.10 Variadic Templates......Page 186
3.11.3 Generic Stack......Page 188
3.11.7 Stack of bool......Page 189
3.11.10 Trapezoid Rule......Page 190
3.11.13 Implement make_unique......Page 191
4.1 Standard Template Library......Page 192
4.1.2 Iterators......Page 193
4.1.3 Containers......Page 198
4.1.4 Algorithms......Page 206
4.1.5 Beyond Iterators......Page 212
4.2.1 Complex Numbers......Page 213
4.2.2 Random Number Generators......Page 216
4.3.1 Limits......Page 225
4.3.2 Type Traits......Page 227
4.4.1 Tuple......Page 229
4.4.2 function......Page 232
4.4.3 Reference Wrapper......Page 234
4.5 The Time Is Now......Page 236
4.6 Concurrency......Page 238
4.7 Scientific Libraries Beyond the Standard......Page 240
4.7.3 Linear Algebra......Page 241
4.8.1 Sorting by Magnitude......Page 242
4.8.3 Complex Numbers......Page 243
5.1.1 Compile-Time Functions......Page 246
5.1.2 Extended Compile-Time Functions......Page 248
5.1.3 Primeness......Page 250
5.1.4 How Constant Are Our Constants?......Page 252
5.2.1 Type Traits......Page 253
5.2.2 Conditional Exception Handling......Page 256
5.2.3 A const-Clean View Example......Page 257
5.2.5 Domain-Specific Type Properties......Page 264
5.2.6 enable-if......Page 266
5.2.7 Variadic Templates Revised......Page 269
5.3.1 Simple Operator Implementation......Page 272
5.3.2 An Expression Template Class......Page 275
5.3.3 Generic Expression Templates......Page 278
5.4 Meta-Tuning: Write Your Own Compiler Optimization......Page 280
5.4.1 Classical Fixed-Size Unrolling......Page 281
5.4.2 Nested Unrolling......Page 284
5.4.3 Dynamic Unrolling–Warm-up......Page 290
5.4.4 Unrolling Vector Expressions......Page 292
5.4.5 Tuning an Expression Template......Page 293
5.4.6 Tuning Reduction Operations......Page 296
5.4.7 Tuning Nested Loops......Page 303
5.4.8 Tuning Résumé......Page 309
5.5.3 Meta-Program for Greatest Common Divisor......Page 310
5.5.4 Vector Expression Template......Page 311
5.5.5 Meta-List......Page 312
6.1 Basic Principles......Page 314
6.1.1 Base and Derived Classes......Page 315
6.1.2 Inheriting Constructors......Page 318
6.1.3 Virtual Functions and Polymorphic Classes......Page 319
6.1.4 Functors via Inheritance......Page 324
6.2 Removing Redundancy......Page 325
6.3 Multiple Inheritance......Page 326
6.3.1 Multiple Parents......Page 327
6.3.2 Common Grandparents......Page 328
6.4 Dynamic Selection by Sub-typing......Page 333
6.5 Conversion......Page 335
6.5.1 Casting between Base and Derived Classes......Page 336
6.5.3 Reinterpretation Cast......Page 340
6.5.4 Function-Style Conversion......Page 341
6.5.5 Implicit Conversions......Page 342
6.6.1 A Simple Example......Page 343
6.6.2 A Reusable Access Operator......Page 345
6.7.3 Clone Function......Page 347
7.1.1 Ordinary Differential Equations......Page 348
7.1.2 Runge-Kutta Algorithms......Page 350
7.1.3 Generic Implementation......Page 352
7.1.4 Outlook......Page 358
7.2 Creating Projects......Page 359
7.2.1 Build Process......Page 360
7.2.2 Build Tools......Page 364
7.2.3 Separate Compilation......Page 367
7.3 Some Final Words......Page 372
A.1 More Good and Bad Scientific Software......Page 374
A.2.1 More about Qualifying Literals......Page 380
A.2.3 More about if......Page 382
A.2.5 More about main......Page 384
A.2.6 Assertion or Exception?......Page 385
A.2.7 Binary I/O......Page 386
A.2.9 Garbarge Collection......Page 387
A.2.10 Trouble with Macros......Page 388
A.3 Real-World Example: Matrix Inversion......Page 389
A.4.1 Pointer to Member......Page 398
A.4.2 More Initialization Examples......Page 399
A.4.3 Accessing Multi-dimensional Arrays......Page 400
A.5 Method Generation......Page 402
A.5.1 Controlling the Generation......Page 404
A.5.2 Generation Rules......Page 405
A.5.3 Pitfalls and Design Guides......Page 410
A.6.2 Which Function Is Called?......Page 413
A.6.3 Specializing for Specific Hardware......Page 416
A.6.4 Variadic Binary I/O......Page 417
A.7 Using std::vector in C++03......Page 418
A.9.1 First Meta-Program in History......Page 419
A.9.2 Meta-Functions......Page 421
A.9.3 Backward-Compatible Static Assertion......Page 423
A.9.4 Anonymous Type Parameters......Page 424
A.9.5 Benchmark Sources of Dynamic Unrolling......Page 427
A.9.6 Benchmark for Matrix Product......Page 428
B.1 gcc......Page 430
B.2.1 Text-Based Debugger......Page 431
B.2.2 Debugging with Graphical Interface: DDD......Page 433
B.3 Memory Analysis......Page 435
B.4 gnuplot......Page 436
B.5 Unix, Linux, and Mac OS......Page 438
C.2 Operator Overview......Page 440
C.3.2 Other Conversions......Page 443
C.3.3 Usual Arithmetic Conversions......Page 444
C.3.4 Narrowing......Page 445
Bibliography......Page 446
A......Page 450
B......Page 451
C......Page 452
E......Page 455
F......Page 456
G......Page 457
I......Page 458
K......Page 459
L......Page 460
M......Page 461
N......Page 462
O......Page 463
P......Page 464
R......Page 466
S......Page 467
T......Page 469
V......Page 470
Y......Page 471