Preface What this book covers What you need for this book Who this book is for Conventions Reader feedback Customer support Downloading the example code Errata Piracy Questions C++17 Features C++17 background What's new in C++17? What features are deprecated or removed in C++17? Key features in C++17 Easier nested namespace syntax New rules for type auto-detection from braced initializer list Simplified static_assert The std::invoke( ) method Structured binding If and Switch local scoped variables Template type auto-deduction for class templates Inline variables Summary Standard Template Library The Standard Template Library architecture Algorithms Iterators Containers Functors Sequence containers Array Code walkthrough Commonly used APIs in an array Vector Code walkthrough Commonly used vector APIs Code walkthrough Pitfalls of a vector List Commonly used APIs in a list Forward list Code walkthrough Commonly used APIs in a forward_list container Deque Commonly used APIs in a deque Associative containers Set Code walkthrough Commonly used APIs in a set Map Code walkthrough Commonly used APIs in a map Multiset Multimap Unordered sets Unordered maps Unordered multisets Unordered multimaps Container adapters Stack Commonly used APIs in a stack Queue Commonly used APIs in a queue Priority queue Commonly used APIs in a priority queue Summary Template Programming Generic programming Function templates Code walkthrough Overloading function templates Code walkthrough Class template Code walkthrough Explicit class specializations Code walkthrough Partial template specialization Summary Smart Pointers Memory management Issues with raw pointers Smart pointers auto_ptr Code walkthrough - Part 1 Code walkthrough - Part 2 unique_ptr Code walkthrough shared_ptr Code walkthrough weak_ptr Circular dependency Summary Developing GUI Applications in C++ Qt Installing Qt 5.7.0 in Ubuntu 16.04 Qt Core Writing our first Qt console application Qt Widgets Writing our first Qt GUI application Layouts Writing a GUI application with a horizontal layout Writing a GUI application with a vertical layout Writing a GUI application with a box layout Writing a GUI application with a grid layout Signals and slots Using stacked layout in Qt applications Writing a simple math application combining multiple layouts Summary Multithreaded Programming and Inter-Process Communication Introduction to POSIX pthreads Creating threads with the pthreads library How to compile and run Does C++ support threads natively? How to write a multithreaded application using the native C++ thread feature How to compile and run Using std::thread in an object-oriented fashion How to compile and run What did you learn? Synchronizing threads What would happen if threads weren't synchronized? How to compile and run Let's use mutex How to compile and run What is a deadlock? How to compile and run What did you learn? Shared mutex Conditional variable How to compile and run What did you learn? Semaphore Concurrency How to compile and run Asynchronous message passing using the concurrency support library How to compile and run Concurrency tasks How to compile and run Using tasks with a thread support library How to compile and run Binding the thread procedure and its input to packaged_task How to compile and run Exception handling with the concurrency library How to compile and run What did you learn? Summary Test-Driven Development TDD Common myths and questions around TDD Does it take more efforts for a developer to write a unit test? Is code coverage metrics good or bad? Does TDD work for complex legacy projects? Is TDD even applicable for embedded or products that involve hardware? Unit testing frameworks for C++ Google test framework Installing Google test framework on Ubuntu How to build google test and mock together as one single static library without installing? Writing our first test case using the Google test framework Using Google test framework in Visual Studio IDE TDD in action Testing a piece of legacy code that has dependency Summary Behavior-Driven Development Behavior-driven development TDD versus BDD C++ BDD frameworks The Gherkin language Installing cucumber-cpp in Ubuntu Installing the cucumber-cpp framework prerequisite software Building and executing the test cases Feature file Spoken languages supported by Gherkin The recommended cucumber-cpp project folder structure Writing our first Cucumber test case Integrating our project in cucumber-cpp CMakeLists.txt Executing our test case Dry running your cucumber test cases BDD - a test-first development approach Let's build and run our BDD test case It's testing time! Summary Debugging Techniques Effective debugging Debugging strategies Debugging tools Debugging your application using GDB GDB commands quick reference Debugging memory leaks with Valgrind The Memcheck tool Detecting memory access outside the boundary of an array Detecting memory access to already released memory locations Detecting uninitialized memory access Detecting memory leaks Fixing the memory leaks Mismatched use of new and free or malloc and delete Summary Code Smells and Clean Code Practices Code refactoring Code smell What is agile? SOLID design principle Single responsibility principle Open closed principle Liskov substitution principle Interface segregation Dependency inversion Code smell Comment smell Long method Long parameter list Duplicate code Conditional complexity Large class Dead code Primitive obsession Data class Feature envy Summary