- an organized collection of links to topic articles
- about learning modern, idiomatic C++
- (roughly) ordered by increasing level of C++ proficiency (top to bottom)
- many articles are based on slide decks taken from an undergraduate C++ crash course
You should know how to use a command line and should have a basic understanding of fundamental imperative programming concepts, like
- variables (
int i = 0, var x = 0, …
) - conditional branching (
if, then, else, …
) - loops (
for, while, repeat, …
) - functions / subroutines (
int main(), fn main, …
)
It certainly helps if you are already somewhat familiar with other programming languages like Python or Java. You should be aware however, that C++ is very different from Java or C# despite the superficial syntactic similarities.
Predictable Resource Control
"direct map to hardware": CPU, memory, …
Zero-Overhead Abstractions
"you only pay for what you use"
- multi-paradigm: value-oriented, procedural, generic, functional, object-oriented
- value semantics by default
- custom types can behave exactly like built-in types
- deterministic object lifetime
- precise memory control down to individual bits
ISO Standard C++
C++98 | 1998 | the original standard | |
C++11 | 2011 | almost a new language | modern C++ |
C++14 | 2014 | some improvements |
C++17 | 2017 | new features & library extensions |
C++20 | 2020 | game-changing new features & libraries |
C++ vs. …
C
| not a strict subset of C++ |
stronger type system | weak type system |
high-level abstractions | only low-level memory abstraction |
typed compile-time programming | only untyped macros for compile-time programming |
powerful custom types (class es) | only data aggregation (struct ) |
use compiler as correctness checker | get the code to compile quickly |
if it compiles, it should be correct | debugging is the real work |
Java
multi-paradigm: value-oriented, procedural, generic, functional, object-oriented | mainly object-oriented, some functional and generic aspects |
value semantics by default for fundamental & custom types | value semantics only for primitives (int , float ,… ) |
optional reference semantics for all types | baked-in reference semantics for class types |
precise control over memory (de-)allocation; no garbage collection | garbage collector; can degrade performance |
deterministic & controllable object lifetime | no predictable object lifetime control |
⇒ memory frugal | ⇒ high memory consumption |
aggressive inlining can eliminate slow function calls | performance degradation due to un-devirtualizable, non-inlinable methods |
Python
almost always faster | almost always slower (in practice around 25-50 times) |
complex syntax and tons of features can be intimidating to newcomers | simple syntax; usually easy to comprehend |
statically typed | dynamically typed |
many types of bugs can be caught at compile time | many types of bugs will only manifest at runtime |
suited for safety-critical large-scale systems | hard to build reliable large-scale systems |
even simple, small-scope tasks can quickly require an expert knowledge of various arcane corner cases & quirks | tends to be more beginner-friendly and small scripts are usually quickly written |
fairly small standard library but extensive ecosystem with libraries for nearly everything | batteries included philosophy with tons of libraries only one import away |
Where it does and doesn't shine
- if memory consumption is critical
- if runtime is critical
- if energy consumption is critical
- OS level programming
- embedded systems
- large-scale, massively parallel systems
- source-code portability across architectures
- "scripting" & rapid prototyping
- GUIs with trivial internal logic
Comments…