This open-access course is directed at those who are already familiar with C and object-oriented programming towards a proficiency level of C++ programming. The course covers the basics of C++ programming and moves on to advanced C++ semantics and concepts.
Key features:
- Free and frequently updated
- 25 lectures, 1600+ slides
- Include the last language standard concepts and features
- Practical teaching: non-verbose, short structured descriptions associated with code
- Minimal code examples for showing just a specific feature or issue without digressing
- Complementary language aspects: tools, coding conventions, project organization, and code optimization
- Experience-based: many aspects, examples, and problems come from real-world cases faced during my work as software engineer
If you enjoy the course or you find it useful, please add a Star
# | TITLE | MAIN FOCUS |
---|---|---|
1 | Introduction (html) | History of C/C++, Areas of applications, Course introduction |
2 | Preparation (html) | Books, How to compile, Hello world |
3 | Basic Concepts I (html) | Type System, Fundamental types, and Operators |
4 | Basic Concepts II (html) | Integral and Floating-point types and their arithmetic |
5 | Basic Concepts III (html) | Entities, Enumerators, Structures, Control flow statements |
6 | Basic Concepts IV (html) | Heap, Stack, Pointers, References, Const properties, Conversion operators |
7 | Basic Concepts V (html) | Functions, Lambda expressions, Preprocessing directives |
8 | Object-Oriented Programming I (html) | Class hierarchy, Constructor, Destructor, Class keywords |
9 | Object Oriented Programming II (html) | Polymorphism, Operators overloading |
10 | Templates and Meta-programming I (html) | Function template, Type traits, Compile-time utilities |
11 | Templates and Meta-programming II (html) | Class template, SFINAE |
12 | Translation Units I (html) | Linkage and One Definition Rule |
13 | Translation Units II (html) | Dealing with multiple translation units and files,#include , Modules |
14 | Code Conventions (html) | Project organization, Main code conventions |
15 | Debugging and Testing (html) | Execution/memory debugging, Sanitizers, Harding techniques, Unit test, Test-Driven Development |
16 | Ecosystem (html) | Cmake, Documenting, and Other Tools |
17 | Utilities (html) | Main std libraries |
18 | Containers, Iterators, and Algorithms (html) | Containers, Iterators, Algorithms, Ranges |
19 | Advanced Topics I (html) | Move semantics, Universal reference, Type deduction |
20 | Advanced Topics II (html) | Error handling, C++ idioms, Smart pointers |
21 | Performance Optimizations I (html) | Ahmdal Law, Performance bounds, Architecture concepts (ILP, SIMD, etc.), Memory hierarchy |
22 | Performance Optimizations II (html) | Arithmetic optimizations, Memory optimizations, etc. |
23 | Performance Optimizations III (html) | Compiler optimizations, Profiling, Benchmarking tools |
24 | Software Design I (html) | Basic Concepts, Principles, Use cases |
25 | Software Design II (html) | Design Patterns and Idioms |
ALL-IN-ONE BOOK: modern-cpp.pdf (could be a few commits behind), html
- A Little History of C/C++ Programming Languages
- Areas of Application and Popularity
- C++ Philosophy
- C++ Weakness: C++ alternatives, Why switching to a new language is hard?
- The Course
- Books and References
- Slide Legend
- What Editor/ IDE/Compiler Should I Use?
- How to compile?
- Hello World: I/O Stream
3. Basic Concepts I - Type System, Fundamental Types, and Operators
- The C++ Type System: Type categories, Type properties
- C++ Fundamental Types Overview: Arithmetic types, Suffix and prefix, Non-standard arithmetic types,
void
type,nullptr
- Conversion Rules
auto
declaration- C++ Operators: Operators precedence, Prefix/Postfix increment/decrement, Assignment, compound, and comma operators, Spaceship operator
<=>
, Safe comparison operators
4. Basic Concepts II - Integral and Floating-point Types
- Integral Data Types: Fixed width integers,
size_t
andptrdiff_t
, Signed/Unsigned integer characteristics, Promotion, Truncation, Undefined behavior - Floating-point Types and Arithmetic: IEEE Floating-point standard and other representations, Normal/Denormal values, Infinity, Not a Number (
NaN
), Machine Epsilon, Units at the Last Place (ULP), Cheatsheet, Limits and useful functions, Arithmetic properties, Special values behavior, Undefined behavior, Detect floating-point errors - Floating-point Issues: Catastrophic cancellation, Floating-point comparison
5. Basic Concepts III - Entities and Control Flow
- Entities
- Declaration and Definition
- Enumerators
struct
, Bitfield,union
[[deprecated]]
Attribute- Control Flow:
if
statement,for
loop, Range-basefor
loop,switch
,goto
, Avoid unused variable warning
6. Basic Concepts IV - Memory Concepts
- Heap and Stack: Stack memory,
new
,delete
, Non-allocating placement allocation, Non-throwing allocation, Memory leak - Initialization: Variable initialization, Uniform initialization, Fixed-size array initialization, Structure initialization, Dynamic memory initialization
- Pointers and References: Pointer operations, Address-of operator
&
, Reference - Constant and Literals,
const
,constexpr
,consteval
,constinit
,if constexpr
,std::is constant evaluated()
,if consteval
volatile
keyword- Explicit Type Conversion:
static_cast
,const_cast
,reinterpret_cast
, Type punning sizeof
Operator: overview,[[no_unique_address]]
7. Basic Concepts V - Functions and Preprocessing
- Functions: Pass by-value, Pass by-pointer, Pass by-reference, Function signature and overloading, Overloading and
=delete
, Default parameters, Attributes[[attributes]]
- Function Pointer and Function Objects
- Lambda Expressions: Capture list, Parameters, Composability,
constexpr/consteval
,template
,mutable
,[[nodiscard]]
, Capture list and classes - Preprocessing: Preprocessors, Common errors, Source location macros, Conditional compiling macros, Stringizing operator (
#
),#error
andwarning
,#pragma
, Token-pasting operator (##
), Variadic macro
8. Object-Oriented Programming I - Class Concepts
- C++ Classes: RAII idiom
- Class Hierarchy
- Access specifiers: Inheritance access specifiers, When use
public/protected/private
for data members? - Class Constructor: Default constructor, Class initialization, Uniform initialization for objects, Delegate constructor,
explicit
keyword,[[nodiscard]]
and classes - Copy Constructor
- Class Destructor
- Defaulted Constructors, Destructor, and Operators (
= default
) - Class Keywords:
this
,static
,const
,mutable
,using
,friend
,delete
9. Object-Oriented Programming II - Polymorphism and Operator Overloading
- Polymorphism:
virtual
methods, Virtual table,override
keyword,final
keyword, Common errors, Pure virtual method, Abstract class and interface - Inheritance Casting and Run-time Type Identification
- Operator Overloading: Overview, Comparison operator
<
, Spaceship operator<=>
, Subscript operator[]
, Multidimensional subscript operator[]
, Function call operator()
, static operator[]
and operator()
, Conversion operatorT()
, Return type overloading resolution, Increment and decrement operators++
/--
, Assignment operator=
, Stream operator<<
, Operator notes - C++ Object Layout: Aggregate, Trivial class, Standard-layout class, Plain old data (POD), Hierarchy
10. Templates and Meta-programming I - Function Templates and Compile-Time Utilities
- Function Template: Overview, Template parameters,Template instantiation, Template parameter - default value, Overloading, Specialization
- Template Variable
- Template Parameter Types: Generic Type Notes,
auto
Placeholder, Class template parameter type, Array and pointer types, Function type - Compile-Time Utilities:
static_assert
,decltype
keyword,using
keyword - Type Traits: Overview, Type traits library, Type manipulation
11. Templates and Meta-programming II - Class Templates and SFINAE
- Class Template: Class specialization, Class template constructor
- Constructor template automatic deduction (CTAD)
- Class Template - Advanced Concepts: Class + Function - specialization, Dependent names -
typename
andtemplate
keywords, Class template hierarchy andusing
,friend
keyword, Template template arguments - Template Meta-Programming
- SFINAE: Substitution Failure Is Not An Error: Function SFINAE, Class SFINAE
- Variadic Template: Folding expression, Variadic class template
- C++20 Concepts: Overview,
concept
keyword,requires
clause,requires
expression,requires
expression + clause,requires
clause + expression,requires
andconstexpr
, Nestedrequires
12. Translation Units I - Linkage and One Definition Rule
- Basic Concepts: Translation unit, Local and global scope, Linkage
- Storage Class and Duration: Storage duration, Storage class,
static
andextern
keywords, Internal/External linkage examples - Linkage of
const
andconstexpr
: Static initialization order fiasco - Linkage Summary
- Dealing with Multiple Translation Units: Class in multiple translation units
- One Definition Rule (ODR): Global variable issues, ODR - Point 3,
inline
functions/variables,constexpr
andinline
- ODR - Function Template: Cases,
extern
keyword - ODR - Class Template: Cases,
extern
keyword - ODR Undefined Behavior and Summary
13. Translation Units II - Include, Module, and Namespace
#include
Issues: Include guard, Forward declaration, Circular dependencies, Common linking errors- C++20 Modules: Overview, Terminology, Visibility and reachability, Module unit types, Keywords, Global module fragment, Private module fragment, Header module unit, Module partitions
- Namespace: Namespace functions vs.
static
methods, Namespace alias, Anonymous namespace,inline
namespace, Attributes and namespace - Compiling Multiple Translation Units: Fundamental compiler flags, Compile Methods, Deal with libraries, Build static/dynamic libraries, Find dynamic library dependencies, Analyze object/executable symbols
- C++ Project Organization: Project directories, Project files, "Common" project organization notes, Alternative - “Canonical” project organization
- Coding Styles and Conventions
#include
- Macro and Preprocessing
- Namespace
- Variables and Arithmetic Types
- Functions
- Structs and Classes
- Control Flow
- Modern C++ Features
- Maintainability
- Naming
- Readability and Formatting
- Code Documentation
- Debugging
- Assertion
- Execution debugging: Breakpoints, Watchpoints / Catchpoints, Control flow, Stack and Info, Print, Disassemble
- Memory Debugging:
valgrind
- Hardening Techniques: Stack usage, Standard library checks, Undefined behavior protections, Control flow protections
- Sanitizers: Address sanitizer, Leak sanitizer, Memory sanitizers, Undefined behavior sanitizer
- Debugging Summary
- Compiler Warnings
- Static Analysis
- Code Testing: Unit test, Test-Driven Development (TDD), Code coverage, Fuzz testing
- Code Quality:
clang-tidy
16. Ecosystem - Cmake and Other Tools
- CMake:
cmake
andctest
- Code Documentation:
doxygen
- Code Statistics: Count lines of code, Cyclomatic complexity analyzer
- Other Tools: Code formatting -
clang-format
,Compiler Explorer
, Code transformation -CppInsights
, Code autocompletion -GitHub Co-Pilot/TabNine/Kite
, Local code search -ugrep
,ripgrep
,hypergrep
, Code search engine -searchcode/grep.app
, Code benchmarking -Quick-Bench
, Font for coding
- I/O Stream: Manipulator,
ofstream/ifstream
- Strings:
std::string
, Conversion from/to numeric values,std::string_view
,std::format
,std::print
- View:
std::span
- Math Libraries
- Random Number: Basic concepts, C++
<random>
, Seed, PRNG period and quality, Distribution, Quasi-random - Time Measuring: Wall-Clock time, User time, System time
- Std Class Templates:
std::pair
,std::tuple
,std::variant
,std::optional
,std::any
,std::stacktrace
- Filesystem Library: Query methods, Modify methods
18. Containers, Iterators, and Algorithms
- Containers and Iterators
- Sequence Containers:
std::array
,std::vector
,std::list
,std::deque
,std::forward_list
- Associative Containers:
std::set
,std::map
,std::multiset
- Container Adaptors:
std::stack
,std::queue
,std::priority_queue
- View:
std::span
- Implement a Custom Iterator: Semantic, Implement a simple Iterator
- Iterator Notes:
- Iterator Utility Methods:
std::advance
,std::next
,std::prev
,std::distance
, Container access methods, Iterator traits - Algorithms Library:
std::find_if
,std::sort
,std::accumulate
,std::generate
,std::remove_if
- C++20 Ranges: Key concepts, Range view, Range adaptor, Range factory, Range algorithms, Range actions
- Move Semantic:
lvalues
andrvalues
references, Move semantic,std::move
, Class declaration semantic - Universal Reference and Perfect Forwarding: Universal reference, Reference collapsing rules, Perfect forwarding
- Value Categories
&
,&&
Ref-qualifiers andvolatile
Overloading- Copy Elision and RVO
- Type Deduction: Pass by-reference, Pass by-pointer, Pass by-value,
auto
deduction, auto(x): Decay-copy const
Correctness
- Undefined Behavior: Illegal behavior, Platform specific behavior, unspecified behavior, Detecting undefined behavior
- Error Handling: Recoverable error handing, Return code, C++ Exceptions, Defining custom exceptions,
noexcept
keyword, Memory allocation issues, Return code and exception summary,std::expected
, Alternative error handling approaches - Smart pointers:
std::unique_ptr
,std::shared_ptr
,std::weak_ptr
- Concurrency: Thread methods, Mutex, Atomic, Task-based parallelism
21. Optimization I - Basic Concepts
- Introduction: Moore's Law, Moore's Law limitations, Reasons for optimizing
- Basic Concepts: Asymptotic complexity, Time-Memory trade-off, Developing cycle, Ahmdal's law, Throughput, Bandwidth, Latency, Performance bounds, Arithmetic intensity
- Basic Architecture Concepts: Instruction throughput, In-Order, and Out-of-Order Execution, Instruction pipelining, Instruction-level parallelism (ILP), Little’s law, Data-level parallelism (DLP) and SIMD, Thread-level parallelism (TLP), Single Instruction Multiple Threads (SIMT), RISC, CISC instruction sets
- Memory Hierarchy: Memory hierarchy concepts, Memory locality, Core-to-core latency and thread affinity, Memory ordering model
22. Optimization II - Code Optimization
- I/O Operations:
printf
, Memory mapped I/O, Speed up raw data loading - Memory Optimizations: Heap memory, Stack memory, Cache utilization, Data alignment, Memory Prefetch
- Arithmetic Types: Data types, Arithmetic operations, Conversion, Floating-point, Compiler intrinsic functions, Value in a range, Lookup table
- Control Flow: Branch Hints -
[[likely]]
/[[unlikely]]
, Signed/Unsigned integers, Loops, Loop hoisting, Loop unrolling, Assertions, Compiler hints[[assume]]
, Recursion - Functions: Function call cost, Argument passing, Function inlining, Function attributes, Pointers aliasing
- Object-Oriented Programming
- Std Library and Other Language Aspects
23. Optimization III - Non-Coding Optimizations and Benchmarking
- Compiler Optimizations: About the compiler, Compiler optimization flags, Floating-point optimization flags, Linker optimization flags, Architecture flags, Help the compiler to produce better code, Profile guided optimization (PGO), Post-processing binary optimizer
- Compiler Transformation Techniques: Basic transformations, Loop unswitching, Loop fusion, Loop fission, Loop interchange, Loop tiling
- Libraries and Data Structures: External libraries
- Performance Benchmarking: What to test?, Workload/Dataset quality, Cache behavior, Stable CPU performance, Multi-threads considerations, Program memory layout, Measurement overhead, Compiler optimizations, Metric evaluation
- Profiling:
gprof
,uftrace
,callgrind
,cachegrind
,perf
Linux profiler - Parallel Computing: Concurrency vs. parallelism, Performance scaling, Gustafson’s Law, Parallel programming languages
24. Software Design I - Basic Concepts (DRAFT)
-
Books and References
-
Basic Concepts: Abstraction, interface, and module, Class Invariant
-
Software Design Principles: Separation of concern, Low coupling, high cohesion, Encapsulation and information hiding, Design by contract, Problem decomposition, Code reuse
-
Software Complexity: Software entropy, Technical debt
-
The SOLID Design Principles
-
Member Functions vs. Free Functions
-
BLAS GEMM Case Study
-
Owning Objects and Views
-
Value vs. Reference Semantic
-
Global Variables
25. Software Design II - Design Patterns and Idioms (DRAFT)
-
C++ Idioms: Rule of Zero, Rule of Three, Rule of Five
-
Design Pattern: Singleton, PIMPL, Curiously Recurring Template Pattern (CRTP), Template virtual functions
- Improve Software Design Chapters
- Build Aspects Chapter (e.g. reducing build time)
If you find any typo, conceptual error, or section to improve, please report them by using the issue
panel.
Federico Busato
, https://federico-busato.github.io/
- LinkedIn: www.linkedin.com/in/federico-busato/
- Twitter: twitter.com/fedebusato