Preface xxi <br> Before You Begin xliii <br> <br> Chapter 1: Intro and Test-Driving Popular, Free C++ Compilers 1 <br>1.1 Introduction 2 <br>1.2 Test-Driving a C++20 Application 4 <br>1.3 Moore's Law, Multi-Core Processors and Concurrent Programming 16 <br>1.4 A Brief Refresher on Object Orientation 17 <br>1.5 Wrap-Up 20 <br> <br> Chapter 2: Intro to C++20 Programming 21 <br>2.1 Introduction 22 <br>2.2 First Program in C++: Displaying a Line of Text 22 <br>2.3 Modifying Our First C++ Program 25 <br>2.4 Another C++ Program: Adding Integers 26 <br>2.5 Arithmetic 30 <br>2.6 Decision Making: Equality and Relational Operators 31 <br>2.7 Objects Natural: Creating and Using Objects of Standard-Library Class string 35 <br>2.8 Wrap-Up 38 <br> <br> Chapter 3: Control Statements: Part 1 39 <br>3.1 Introduction 40 <br>3.2 Control Structures 40 <br>3.3 if Single-Selection Statement 43 <br>3.4 if…else Double-Selection Statement 44 <br>3.5 while Iteration Statement 47 <br>3.6 Counter-Controlled Iteration 48 <br>3.7 Sentinel-Controlled Iteration 50 <br>3.8 Nested Control Statements 54 <br>3.9 Compound Assignment Operators 57 <br>3.10 Increment and Decrement Operators 58 <br>3.11 Fundamental Types Are Not Portable 60 <br>3.12 Objects-Natural Case Study: Arbitrary-Sized Integers 61 <br>3.13 C++20: Text Formatting with Function format 65 <br>3.14 Wrap-Up 67 <br> <br> Chapter 4: Control Statements: Part 2 69 <br>4.1 Introduction 70 <br>4.2 Essentials of Counter-Controlled Iteration 70 <br>4.3 for Iteration Statement 71 <br>4.4 Examples Using the for Statement 74 <br>4.5 Application: Summing Even Integers 74 <br>4.6 Application: Compound-Interest Calculations 75 <br>4.7 do…while Iteration Statement 78 <br>4.8 switch Multiple-Selection Statement 80 <br>4.9 C++17 Selection Statements with Initializers 85 <br>4.10 break and continue Statements 86 <br>4.11 Logical Operators 88 <br>4.12 Confusing the Equality (==) and Assignment (=) Operators 92 <br>4.13 Objects-Natural Case Study: Using the miniz-cpp Library to Write and Read ZIP files 94 <br>4.14 C++20 Text Formatting with Field Widths and Precisions 98 <br>4.15 Wrap-Up 100 <br> <br> Chapter 5: Functions and an Intro to Function Templates 101 <br>5.1 Introduction 102 <br>5.2 C++ Program Components 103 <br>5.3 Math Library Functions 103 <br>5.4 Function Definitions and Function Prototypes 105 <br>5.5 Order of Evaluation of a Function's Arguments 108 <br>5.6 Function-Prototype and Argument-Coercion Notes 108 <br>5.7 C++ Standard Library Headers 111 <br>5.8 Case Study: Random-Number Generation 113 <br>5.9 Case Study: Game of Chance; Introducing Scoped enums 119 <br>5.10 Scope Rules 124 <br>5.11 Inline Functions 128 <br>5.12 References and Reference Parameters 129 <br>5.13 Default Arguments 132 <br>5.14 Unary Scope Resolution Operator 133 <br>5.15 Function Overloading 134 <br>5.16 Function Templates 137 <br>5.17 Recursion 139 <br>5.18 Example Using Recursion: Fibonacci Series 142 <br>5.19 Recursion vs. Iteration 145 <br>5.20 Lnfylun Lhqtomh Wjtz Qarcv: Qjwazkrplm xzz Xndmwwqhlz 147 <br>5.21 Wrap-Up 150 <br> <br> Chapter 6: arrays, vectors, Ranges and Functional-Style Programming 153 <br>6.1 Introduction 154 <br>6.2 arrays 155 <br>6.3 Declaring arrays 155 <br>6.4 Initializing array Elements in a Loop 155 <br>6.5 Initializing an array with an Initializer List 158 <br>6.6 C++11 Range-Based for and C++20 Range-Based for with Initializer 159 <br>6.7 Calculating array Element Values and an Intro to constexpr 161 <br>6.8 Totaling array Elements 163 <br>6.9 Using a Primitive Bar Chart to Display array Data Graphically 164 <br>6.10 Using array Elements as Counters 165 <br>6.11 Using arrays to Summarize Survey Results 166 <br>6.12 Sorting and Searching arrays 168 <br>6.13 Multidimensional arrays 170 <br>6.14 Intro to Functional-Style Programming 174 <br>6.15 Objects-Natural Case Study: C++ Standard Library Class Template vector 180 <br>6.16 Wrap-Up 187 <br> <br> Chapter 7: (Downplaying) Pointers in Modern C++ 189 <br>7.1 Introduction 190 <br>7.2 Pointer Variable Declarations and Initialization 192 <br>7.3 Pointer Operators 192 <br>7.4 Pass-by-Reference with Pointers 195 <br>7.5 Built-In Arrays 199 <br>7.6 Using C++20 to_array to Convert a Built-In Array to a std::array 201 <br>7.7 Using const with Pointers and the Data Pointed To 202 <br>7.8 sizeof Operator 205 <br>7.9 Pointer Expressions and Pointer Arithmetic 208 <br>7.10 Objects-Natural Case Study: C++20 spans--Views of Contiguous Container Elements 210 <br>7.11 A Brief Intro to Pointer-Based Strings 216 <br>7.12 Looking Ahead to Other Pointer Topics 220 <br>7.13 Wrap-Up 220 <br> <br> Chapter 8: strings, string_views, Text Files, CSV Files and Regex 221 <br>8.1 Introduction 222 <br>8.2 string Assignment and Concatenation 223 <br>8.3 Comparing strings 225 <br>8.4 Substrings 226 <br>8.5 Swapping strings 227 <br>8.6 string Characteristics 227 <br>8.7 Finding Substrings and Characters in a string 230 <br>8.8 Replacing and Erasing Characters in a string 232 <br>8.9 Inserting Characters into a string 234 <br>8.10 C++11 Numeric Conversions 235 <br>8.11 C++17 string_view 236 <br>8.12 Files and Streams 239 <br>8.13 Creating a Sequential File 240 <br>8.14 Reading Data from a Sequential File 243 <br>8.15 C++14 Reading and Writing Quoted Text 245 <br>8.16 Updating Sequential Files 246 <br>8.17 String Stream Processing 247 <br>8.18 Raw String Literals 249 <br>8.19 Objects-Natural Case Study: Reading and Analyzing a CSV File Containing Titanic Disaster Data 250 <br>8.20 Objects-Natural Case Study: Intro to Regular Expressions 259 <br>8.21 Wrap-Up 267 <br> <br> Chapter 9: Custom Classes 269 <br>9.1 Introduction 270 <br>9.2 Test-Driving an Account Object 271 <br>9.3 Account Class with a Data Member and Set and Get Member Functions 272 <br>9.4 Account Class: Custom Constructors 275 <br>9.5 Software Engineering with Set and Get Member Functions 279 <br>9.6 Account Class with a Balance 280 <br>9.7 Time Class Case Study: Separating Interface from Implementation 283 <br>9.8 Compilation and Linking Process 290 <br>9.9 Class Scope and Accessing Class Members 291 <br>9.10 Access Functions and Utility Functions 292 <br>9.11 Time Class Case Study: Constructors with Default Arguments 292 <br>9.12 Destructors 298 <br>9.13 When Constructors and Destructors Are Called 298 <br>9.14 Time Class Case Study: A Subtle Trap--Returning a Reference or a Pointer to a private Data Member 302 <br>9.15 Default Assignment Operator 304 <br>9.16 const Objects and const Member Functions 306 <br>9.17 Composition: Objects as Members of Classes 308 <br>9.18 friend Functions and friend Classes 313 <br>9.19 The this Pointer 314 <br>9.20 static Class Members: Classwide Data and Member Functions 320 <br>9.21 Aggregates in C++20 324 <br>9.22 Objects-Natural Case Study: Serialization with JSON 326 <br>9.23 Wrap-Up 333 <br> <br> Chapter 10: OOP: Inheritance and Runtime Polymorphism 335 <br>10.1 Introduction 336 <br>10.2 Base Classes and Derived Classes 339 <br>10.3 Relationship Between Base and Derived Classes 341 <br>10.4 Constructors and Destructors in Derived Classes 349 <br>10.5 Intro to Runtime Polymorphism: Polymorphic Video Game 350 <br>10.6 Relationships Among Objects in an Inheritance Hierarchy 351 <br>10.7 Virtual Functions and Virtual Destructors 357 <br>10.8 Abstract Classes and Pure virtual Functions 362 <br>10.9 Case Study: Payroll System Using Runtime Polymorphism 363 <br>10.10 Runtime Polymorphism, Virtual Functions and Dynamic Binding "Under the Hood" 373 <br>10.11 Non-Virtual Interface (NVI) Idiom 376 <br>10.12 Program to an Interface, Not an Implementation 383 <br>10.13 Runtime Polymorphism with std::variant and std::visit 391 <br>10.14 Multiple Inheritance 397 <br>10.15 protected Class Members: A Deeper Look 405 <br>10.16 public, protected and private Inheritance 406 <br>10.17 More Runtime Polymorphism Techniques; Compile-Time Polymorphism 408 <br>10.18 Wrap-Up 412 <br> <br> Chapter 11: Operator Overloading, Copy/Move Semantics and Smart Pointers 415 <br>11.1 Introduction 416 <br>11.2 Using the Overloaded Operators of Standard Library Class string 418 <br>11.3 Operator Overloading Fundamentals 423 <br>11.4 (Downplaying) Dynamic Memory Management with new and delete 425 <br>11.5 Modern C++ Dynamic Memory Management: RAII and Smart Pointers 427 <br>11.6 MyArray Case Study: Crafting a Valuable Class with Operator Overloading 430 <br>11.7 C++20 Three-Way Comparison Operator (<=>) 459 <br>11.8 Converting Between Types 462 <br>11.9 explicit Constructors and Conversion Operators 463 <br>11.10 Overloading the Function Call Operator () 466 <br>11.11 Wrap-Up 466 <br> <br> Chapter 12: Exceptions and a Look Forward to Contracts 467 <br>12.1 Introduction 468 <br>12.2 Exception-Handling Flow of Control 471 <br>12.3 Exception Safety Guarantees and noexcept 476 <br>12.4 Rethrowing an Exception 477 <br>12.5 Stack Unwinding and Uncaught Exceptions 479 <br>12.6 When to Use Exception Handling 481 <br>12.7 Constructors, Destructors and Exception Handling 483 <br>12.8 Processing new Failures 487 <br>12.9 Standard Library Exception Hierarchy 490 <br>12.10 C++'s Alternative to the finally Block: Resource Acquisition Is Initialization (RAII) 493 <br>12.11 Some Libraries Support Both Exceptions and Error Codes 493 <br>12.12 Logging 494 <br>12.13 Looking Ahead to Contracts 495 <br>12.14 Wrap-Up 503 <br> <br> Chapter 13: Standard Library Containers and Iterators 505 <br>13.1 Introduction 506 <br>13.2 Introduction to Containers 508 <br>13.3 Working with Iterators 513 <br>13.4 A Brief Introduction to Algorithms 518 <br>13.5 Sequence Containers 518 <br>13.6 vector Sequence Container 519 <br>13.7 list Sequence Container 526 <br>13.8 deque Sequence Container 531 <br>13.9 Associative Containers 533 <br>13.10 Container Adaptors 543 <br>13.11 bitset Near Container 547 <br>13.12 Optional: A Brief Intro to Big O 549 <br>13.13 Optional: A Brief Intro to Hash Tables 552 <br>13.14 Wrap-Up 553 <br> <br> Chapter 14: Standard Library Algorithms and C++20 Ranges & Views 555 <br>14.1 Introduction 556 <br>14.2 Algorithm Requirements: C++20 Concepts 558 <br>14.3 Lambdas and Algorithms 560 <br>14.4 Algorithms 563 <br>14.5 Function Objects (Functors) 603 <br>14.6 Projections 608 <br>14.7 C++20 Views and Functional-Style Programming 611 <br>14.8 Intro to Parallel Algorithms 617 <br>14.9 Standard Library Algorithm Summary 619 <br>14.10 A Look Ahead to C++23 Ranges 622 <br>14.11 Wrap-Up 623 <br> <br> Chapter 15: Templates, C++20 Concepts and Metaprogramming 625 <br>15.1 Introduction 626 <br>15.2 Custom Class Templates and Compile-Time Polymorphism 629 <br>15.3 C++20 Function Template Enhancements 634 <br>15.4 C++20 Concepts: A First Look 636 <br>15.5 Type Traits 644 <br>15.6 C++20 Concepts: A Deeper Look 648 <br>15.7 Testing C++20 Concepts with static_assert 659 <br>15.8 Creating a Custom Algorithm 661 <br>15.9 Creating a Custom Container and Iterators 663 <br>15.10 Default Arguments for Template Type Parameters 678 <br>15.11 Variable Templates 678 <br>15.12 Variadic Templates and Fold Expressions 679 <br>15.13 Template Metaprogramming 693 <br>15.14 Wrap-Up 705 <br> <br> Chapter 16: C++20 Modules: Large-Scale Development 707 <br>16.1 Introduction 708 <br>16.2 Compilation and Linking Before C++20 710 <br>16.3 Advantages and Goals of Modules 711 <br>16.4 Example: Transitioning to Modules--Header Units 712 <br>16.5 Modules Can Reduce Translation Unit Sizes and Compilation Times 715 <br>16.6 Example: Creating and Using a Module 716 <br>16.7 Global Module Fragment 724 <br>16.8 Separating Interface from Implementation 725 <br>16.9 Partitions 732 <br>16.10 Additional Modules Examples 740 <br>16.11 Migrating Code to Modules 746 <br>16.12 Future of Modules and Modules Tooling 746 <br>16.13 Wrap-Up 748 <br> <br> Chapter 17: Parallel Algorithms and Concurrency: A High-Level View 755 <br>17.1 Introduction 756 <br>17.2 Standard Library Parallel Algorithms (C++17) 759 <br>17.3 Multithreaded Programming 767 <br>17.4 Launching Tasks with std::jthread 771 <br>17.5 Producer–Consumer Relationship: A First Attempt 776 <br>17.6 Producer–Consumer: Synchronizing Access to Shared Mutable Data 783 <br>17.7 Producer–Consumer: Minimizing Waits with a Circular Buffer 795 <br>17.8 Readers and Writers 804 <br>17.9 Cooperatively Canceling jthreads 805 <br>17.10 Launching Tasks with std::async 808 <br>17.11 Thread-Safe, One-Time Initialization 815 <br>17.12 A Brief Introduction to Atomics 816 <br>17.13 Coordinating Threads with C++20 Latches and Barriers 820 <br>17.14 C++20 Semaphores 826 <br>17.15 C++23: A Look to the Future of C++ Concurrency 830 <br>17.16 Wrap-Up 831 <br> <br> Chapter 18: C++20 Coroutines 833 <br>18.1 Introduction 834 <br>18.2 Coroutine Support Libraries 835 <br>18.3 Installing the concurrencpp and generator Libraries 837 <br>18.4 Creating a Generator Coroutine with co_yield and the generator Library 837 <br>18.5 Launching Tasks with concurrencpp 841 <br>18.6 Creating a Coroutine with co_await and co_return 845 <br>18.7 Low-Level Coroutines Concepts 853 <br>18.8 C++23 Coroutines Enhancements 855 <br>18.9 Wrap-Up 856 <br> <br> Appendix A: Operator Precedence and Grouping 857 <br> <br> Appendix B: Character Set 859 <br> <br> Index 861 <br> <br> Online Chapters and Appendices <br>Chapter 19: Stream I/O and C++20 Text Formatting <br>Chapter 20: Other Topics and a Look Toward the Future of C++ <br>Appendix C: Number Systems <br>Appendix D: Preprocessor <br>Appendix E: Bit Manipulation