Show description
C++ Developer's Complete Guide
C++ Developer's Complete Guide
C++ MASTERY
Complete Developer's Guide & Vocabulary
Quick Navigation
Basics
OOP
Memory
Templates
STL
Modern C++
Dev Vocab
C++ Fundamentals
Variables & Types
Strong typing system with compile-time type checking
int age = 25; // 32-bit integer
double pi = 3.14159; // double precision
bool isActive = true; // boolean
char grade = 'A'; // single character
auto result = 42; // type deduction
Functions & Overloading
Function overloading based on parameter types
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
// Compiler chooses based on arguments
int result1 = add(5, 3); // calls int version
double result2 = add(5.5, 3.2); // calls double version
References vs Pointers
Two ways to indirectly access memory
int x = 10;
int& ref = x; // reference (alias)
int* ptr = &x; // pointer (address)
ref = 20; // changes x to 20
*ptr = 30; // changes x to 30
// References can't be reassigned
// Pointers can point to different objects
Dev Speak: Basic Concepts
"Always prefer references over pointers when you don't need pointer arithmetic or reassignment."
"Use auto for complex type declarations, but not when it hurts readability."
"Function overloading is resolved at compile time - it's not runtime polymorphism."
Object-Oriented Programming
Classes & Encapsulation
Data hiding and interface design
class BankAccount {
private:
double balance;
std::string accountNumber;
public:
BankAccount(const std::string& accNum)
: accountNumber(accNum), balance(0.0) {}
void deposit(double amount) {
if (amount > 0) balance += amount;
}
double getBalance() const { return balance; }
};
Inheritance & Polymorphism
Code reuse and runtime behavior selection
class Shape {
public:
virtual double area() const = 0; // pure virtual
virtual ~Shape() = default; // virtual destructor
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() const override {
return 3.14159 * radius * radius;
}
};
Constructor Types
Different ways to initialize objects
class MyClass {
public:
// Default constructor
MyClass() = default;
// Parameterized constructor
MyClass(in…
C++ Developer's Complete Guide
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>C++ Developer's Complete Guide</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', 'Consolas', Monaco, monospace;
background: linear-gradient(135deg, #0a0a0a 0%, #1a1a1a 100%);
color: #ffffff;
line-height: 1.7;
min-height: 100vh;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
.header {
text-align: center;
margin-bottom: 50px;
padding: 50px 20px;
background: linear-gradient(45deg, #ff6600 0%, #ff8533 50%, #ffaa66 100%);
border-radius: 20px;
box-shadow: 0 15px 40px rgba(255, 102, 0, 0.3);
color: #000;
}
.header h1 {
font-size: 4em;
margin-bottom: 15px;
text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
font-weight: 900;
}
.header p {
font-size: 1.4em;
font-weight: 600;
}
.section {
background: linear-gradient(145deg, #1a1a1a, #2a2a2a);
border-radius: 15px;
padding: 40px;
margin-bottom: 40px;
border: 2px solid #ff6600;
box-shadow: 0 10px 30px rgba(0,0,0,0.5);
}
.section h2 {
color: #ff6600;
font-size: 2.5em;
margin-bottom: 25px;
border-bottom: 3px solid #ff6600;
padding-bottom: 10px;
}
.section h3 {
color: #ffaa66;
font-size: 1.8em;
margin: 25px 0 15px 0;
}
.concept-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 25px;
margin: 30px 0;
}
.concept-card {
background: rgba(255, 102, 0, 0.1);
border: 1px solid #ff6600;
border-radius: 12px;
padding: 25px;
transition: all 0.3s ease;
}
.concept-card:hover {
background: rgba(255, 102, 0, 0.2);
transform: translateY(-3px);
box-shadow: 0 8px 25px rgba(255, 102, 0, 0.2);
}
.concept-card h4 {
color: #ff6600;
font-size: 1.4em;
margin-bottom: 12px;
}
.code-block {
background: #0d0d0d;
border: 2px solid #ff6600;
border-radius: 10px;
padding: 20px;
margin: 20px 0;
font-family: 'Consolas', 'Courier New', monospace;
font-size: 0.95em;
overflow-x: auto;
position: relative;
}
.code-block::before {
content: "C++";
position: absolute;
top: -1px;
right: 15px;
background: #ff6600;
color: #000;
padding: 2px 8px;
font-size: 0.8em;
border-radius: 0 0 5px 5px;
font-weight: bold;
}
.keyword { color: #ff6600; font-weight: bold; }
.type { color: #66ccff; }
.string { color: #99ff99; }
.comment { color: #888; font-style: italic; }
.function { color: #ffaa66; }
.number { color: #ff9999; }
.vocab-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
margin: 30px 0;
}
.vocab-item {
background: rgba(255, 255, 255, 0.05);
border-left: 4px solid #ff6600;
padding: 20px;
border-radius: 8px;
}
.vocab-term {
color: #ff6600;
font-size: 1.3em;
font-weight: bold;
margin-bottom: 8px;
}
.vocab-def {
margin-bottom: 10px;
line-height: 1.6;
}
.dev-quote {
background: rgba(255, 102, 0, 0.1);
border-left: 4px solid #ffaa66;
padding: 15px;
font-style: italic;
color: #ffaa66;
margin-top: 10px;
border-radius: 0 8px 8px 0;
}
.nav-menu {
position: sticky;
top: 20px;
background: rgba(26, 26, 26, 0.95);
border: 2px solid #ff6600;
border-radius: 15px;
padding: 20px;
margin-bottom: 30px;
backdrop-filter: blur(10px);
}
.nav-menu h3 {
color: #ff6600;
margin-bottom: 15px;
text-align: center;
}
.nav-links {
display: flex;
flex-wrap: wrap;
gap: 15px;
justify-content: center;
}
.nav-links a {
color: #ffaa66;
text-decoration: none;
padding: 8px 15px;
border: 1px solid #ff6600;
border-radius: 20px;
transition: all 0.3s ease;
font-weight: 500;
}
.nav-links a:hover {
background: #ff6600;
color: #000;
transform: scale(1.05);
}
.highlight-box {
background: linear-gradient(45deg, rgba(255, 102, 0, 0.2), rgba(255, 170, 102, 0.1));
border: 2px solid #ff6600;
border-radius: 12px;
padding: 25px;
margin: 25px 0;
}
.highlight-box h4 {
color: #ff6600;
font-size: 1.5em;
margin-bottom: 15px;
}
.best-practices {
background: rgba(255, 102, 0, 0.05);
border-radius: 10px;
padding: 20px;
margin: 20px 0;
}
.best-practices ul {
list-style: none;
padding-left: 0;
}
.best-practices li {
padding: 8px 0;
padding-left: 25px;
position: relative;
}
.best-practices li::before {
content: "▶";
position: absolute;
left: 0;
color: #ff6600;
font-weight: bold;
}
@media (max-width: 768px) {
.header h1 {
font-size: 2.5em;
}
.concept-grid {
grid-template-columns: 1fr;
}
.nav-links {
flex-direction: column;
align-items: center;
}
.container {
padding: 10px;
}
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>C++ MASTERY</h1>
<p>Complete Developer's Guide & Vocabulary</p>
</div>
<nav class="nav-menu">
<h3>Quick Navigation</h3>
<div class="nav-links">
<a href="#basics">Basics</a>
<a href="#oop">OOP</a>
<a href="#memory">Memory</a>
<a href="#templates">Templates</a>
<a href="#stl">STL</a>
<a href="#modern">Modern C++</a>
<a href="#vocab">Dev Vocab</a>
</div>
</nav>
<section id="basics" class="section">
<h2>C++ Fundamentals</h2>
<div class="concept-grid">
<div class="concept-card">
<h4>Variables & Types</h4>
<p>Strong typing system with compile-time type checking</p>
<div class="code-block">
<span class="keyword">int</span> age = <span class="number">25</span>; <span class="comment">// 32-bit integer</span>
<span class="keyword">double</span> pi = <span class="number">3.14159</span>; <span class="comment">// double precision</span>
<span class="keyword">bool</span> isActive = <span class="keyword">true</span>; <span class="comment">// boolean</span>
<span class="keyword">char</span> grade = <span class="string">'A'</span>; <span class="comment">// single character</span>
<span class="keyword">auto</span> result = <span class="number">42</span>; <span class="comment">// type deduction</span>
</div>
</div>
<div class="concept-card">
<h4>Functions & Overloading</h4>
<p>Function overloading based on parameter types</p>
<div class="code-block">
<span class="keyword">int</span> <span class="function">add</span>(<span class="keyword">int</span> a, <span class="keyword">int</span> b) {
<span class="keyword">return</span> a + b;
}
<span class="keyword">double</span> <span class="function">add</span>(<span class="keyword">double</span> a, <span class="keyword">double</span> b) {
<span class="keyword">return</span> a + b;
}
<span class="comment">// Compiler chooses based on arguments</span>
<span class="keyword">int</span> result1 = <span class="function">add</span>(<span class="number">5</span>, <span class="number">3</span>); <span class="comment">// calls int version</span>
<span class="keyword">double</span> result2 = <span class="function">add</span>(<span class="number">5.5</span>, <span class="number">3.2</span>); <span class="comment">// calls double version</span>
</div>
</div>
<div class="concept-card">
<h4>References vs Pointers</h4>
<p>Two ways to indirectly access memory</p>
<div class="code-block">
<span class="keyword">int</span> x = <span class="number">10</span>;
<span class="keyword">int</span>& ref = x; <span class="comment">// reference (alias)</span>
<span class="keyword">int</span>* ptr = &x; <span class="comment">// pointer (address)</span>
ref = <span class="number">20</span>; <span class="comment">// changes x to 20</span>
*ptr = <span class="number">30</span>; <span class="comment">// changes x to 30</span>
<span class="comment">// References can't be reassigned</span>
<span class="comment">// Pointers can point to different objects</span>
</div>
</div>
</div>
<div class="highlight-box">
<h4>Dev Speak: Basic Concepts</h4>
<div class="dev-quote">"Always prefer references over pointers when you don't need pointer arithmetic or reassignment."</div>
<div class="dev-quote">"Use auto for complex type declarations, but not when it hurts readability."</div>
<div class="dev-quote">"Function overloading is resolved at compile time - it's not runtime polymorphism."</div>
</div>
</section>
<section id="oop" class="section">
<h2>Object-Oriented Programming</h2>
<div class="concept-grid">
<div class="concept-card">
<h4>Classes & Encapsulation</h4>
<p>Data hiding and interface design</p>
<div class="code-block">
<span class="keyword">class</span> <span class="type">BankAccount</span> {
<span class="keyword">private</span>:
<span class="keyword">double</span> balance;
<span class="keyword">std::string</span> accountNumber;
<span class="keyword">public</span>:
<span class="function">BankAccount</span>(<span class="keyword">const</span> <span class="keyword">std::string</span>& accNum)
: accountNumber(accNum), balance(<span class="number">0.0</span>) {}
<span class="keyword">void</span> <span class="function">deposit</span>(<span class="keyword">double</span> amount) {
<span class="keyword">if</span> (amount > <span class="number">0</span>) balance += amount;
}
<span class="keyword">double</span> <span class="function">getBalance</span>() <span class="keyword">const</span> { <span class="keyword">return</span> balance; }
};
</div>
</div>
<div class="concept-card">
<h4>Inheritance & Polymorphism</h4>
<p>Code reuse and runtime behavior selection</p>
<div class="code-block">
<span class="keyword">class</span> <span class="type">Shape</span> {
<span class="keyword">public</span>:
<span class="keyword">virtual</span> <span class="keyword">double</span> <span class="function">area</span>() <span class="keyword">const</span> = <span class="number">0</span>; <span class="comment">// pure virtual</span>
<span class="keyword">virtual</span> <span class="function">~Shape</span>() = <span class="keyword">default</span>; <span class="comment">// virtual destructor</span>
};
<span class="keyword">class</span> <span class="type">Circle</span> : <span class="keyword">public</span> <span class="type">Shape</span> {
<span class="keyword">private</span>:
<span class="keyword">double</span> radius;
<span class="keyword">public</span>:
<span class="function">Circle</span>(<span class="keyword">double</span> r) : radius(r) {}
<span class="keyword">double</span> <span class="function">area</span>() <span class="keyword">const</span> <span class="keyword">override</span> {
<span class="keyword">return</span> <span class="number">3.14159</span> * radius * radius;
}
};
</div>
</div>
<div class="concept-card">
<h4>Constructor Types</h4>
<p>Different ways to initialize objects</p>
<div class="code-block">
<span class="keyword">class</span> <span class="type">MyClass</span> {
<span class="keyword">public</span>:
<span class="comment">// Default constructor</span>
<span class="function">MyClass</span>() = <span class="keyword">default</span>;
<span class="comment">// Parameterized constructor</span>
<span class="function">MyClass</span>(<span class="keyword">int</span> value) : data(value) {}
<span class="comment">// Copy constructor</span>
<span class="function">MyClass</span>(<span class="keyword">const</span> <span class="type">MyClass</span>& other) : data(other.data) {}
<span class="comment">// Move constructor</span>
<span class="function">MyClass</span>(<span class="type">MyClass</span>&& other) <span class="keyword">noexcept</span>
: data(<span class="function">std::move</span>(other.data)) {}
<span class="keyword">private</span>:
<span class="keyword">int</span> data;
};
</div>
</div>
</div>
<div class="highlight-box">
<h4>The Big Five/Six</h4>
<p>Essential special member functions every C++ dev should know:</p>
<div class="best-practices">
<ul>
<li><strong>Destructor</strong> - Clean up resources</li>
<li><strong>Copy Constructor</strong> - Deep copy semantics</li>
<li><strong>Copy Assignment</strong> - Assignment operator overload</li>
<li><strong>Move Constructor</strong> - Efficient resource transfer</li>
<li><strong>Move Assignment</strong> - Move assignment operator</li>
<li><strong>Default Constructor</strong> - Zero-argument initialization</li>
</ul>
</div>
</div>
</section>
<section id="memory" class="section">
<h2>Memory Management</h2>
<div class="concept-grid">
<div class="concept-card">
<h4>Stack vs Heap</h4>
<p>Understanding memory allocation strategies</p>
<div class="code-block">
<span class="comment">// Stack allocation - automatic cleanup</span>
<span class="keyword">void</span> <span class="function">stackExample</span>() {
<span class="keyword">int</span> localVar = <span class="number">42</span>; <span class="comment">// on stack</span>
<span class="type">MyClass</span> obj(<span class="number">10</span>); <span class="comment">// on stack</span>
} <span class="comment">// automatic destruction here</span>
<span class="comment">// Heap allocation - manual management</span>
<span class="keyword">void</span> <span class="function">heapExample</span>() {
<span class="keyword">int</span>* ptr = <span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">42</span>); <span class="comment">// on heap</span>
<span class="comment">// ... use ptr ...</span>
<span class="keyword">delete</span> ptr; <span class="comment">// manual cleanup</span>
}
</div>
</div>
<div class="concept-card">
<h4>Smart Pointers</h4>
<p>RAII-based automatic memory management</p>
<div class="code-block">
<span class="comment">// unique_ptr - exclusive ownership</span>
<span class="keyword">std::unique_ptr</span><<span class="keyword">int</span>> ptr1 = <span class="function">std::make_unique</span><<span class="keyword">int</span>>(<span class="number">42</span>);
<span class="comment">// shared_ptr - shared ownership</span>
<span class="keyword">std::shared_ptr</span><<span class="keyword">int</span>> ptr2 = <span class="function">std::make_shared</span><<span class="keyword">int</span>>(<span class="number">42</span>);
<span class="keyword">std::shared_ptr</span><<span class="keyword">int</span>> ptr3 = ptr2; <span class="comment">// ref count = 2</span>
<span class="comment">// weak_ptr - non-owning reference</span>
<span class="keyword">std::weak_ptr</span><<span class="keyword">int</span>> weak = ptr2;
</div>
</div>
<div class="concept-card">
<h4>RAII Pattern</h4>
<p>Resource Acquisition Is Initialization</p>
<div class="code-block">
<span class="keyword">class</span> <span class="type">FileHandler</span> {
<span class="keyword">private</span>:
<span class="keyword">std::ifstream</span> file;
<span class="keyword">public</span>:
<span class="function">FileHandler</span>(<span class="keyword">const</span> <span class="keyword">std::string</span>& filename)
: file(filename) {
<span class="keyword">if</span> (!file.is_open()) {
<span class="keyword">throw</span> <span class="function">std::runtime_error</span>(<span class="string">"Failed to open file"</span>);
}
}
<span class="comment">// Destructor automatically closes file</span>
<span class="function">~FileHandler</span>() {
<span class="keyword">if</span> (file.is_open()) file.close();
}
};
</div>
</div>
</div>
<div class="highlight-box">
<h4>Dev Speak: Memory Management</h4>
<div class="dev-quote">"If you're using raw new/delete in modern C++, you're probably doing it wrong."</div>
<div class="dev-quote">"RAII isn't just about memory - it's about any resource that needs cleanup."</div>
<div class="dev-quote">"Smart pointers express ownership semantics in the type system."</div>
</div>
</section>
<section id="templates" class="section">
<h2>Templates & Generic Programming</h2>
<div class="concept-grid">
<div class="concept-card">
<h4>Function Templates</h4>
<p>Generic functions that work with any type</p>
<div class="code-block">
<span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">T</span>>
<span class="type">T</span> <span class="function">max</span>(<span class="keyword">const</span> <span class="type">T</span>& a, <span class="keyword">const</span> <span class="type">T</span>& b) {
<span class="keyword">return</span> (a > b) ? a : b;
}
<span class="comment">// Template specialization</span>
<span class="keyword">template</span><>
<span class="keyword">const</span> <span class="keyword">char</span>* <span class="function">max</span>(<span class="keyword">const</span> <span class="keyword">char</span>* <span class="keyword">const</span>& a,
<span class="keyword">const</span> <span class="keyword">char</span>* <span class="keyword">const</span>& b) {
<span class="keyword">return</span> (<span class="function">strcmp</span>(a, b) > <span class="number">0</span>) ? a : b;
}
</div>
</div>
<div class="concept-card">
<h4>Class Templates</h4>
<p>Generic classes for type-safe containers</p>
<div class="code-block">
<span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">T</span>>
<span class="keyword">class</span> <span class="type">Stack</span> {
<span class="keyword">private</span>:
<span class="keyword">std::vector</span><<span class="type">T</span>> elements;
<span class="keyword">public</span>:
<span class="keyword">void</span> <span class="function">push</span>(<span class="keyword">const</span> <span class="type">T</span>& item) {
elements.<span class="function">push_back</span>(item);
}
<span class="type">T</span> <span class="function">pop</span>() {
<span class="keyword">if</span> (elements.<span class="function">empty</span>()) {
<span class="keyword">throw</span> <span class="function">std::runtime_error</span>(<span class="string">"Stack is empty"</span>);
}
<span class="type">T</span> top = elements.<span class="function">back</span>();
elements.<span class="function">pop_back</span>();
<span class="keyword">return</span> top;
}
};
</div>
</div>
<div class="concept-card">
<h4>Template Metaprogramming</h4>
<p>Compile-time computation and type manipulation</p>
<div class="code-block">
<span class="comment">// SFINAE - Substitution Failure Is Not An Error</span>
<span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">T</span>>
<span class="keyword">typename</span> <span class="function">std::enable_if</span><<span class="function">std::is_integral</span><<span class="type">T</span>>::value, <span class="type">T</span>>::type
<span class="function">process</span>(<span class="type">T</span> value) {
<span class="keyword">return</span> value * <span class="number">2</span>; <span class="comment">// only for integral types</span>
}
<span class="comment">// Concepts (C++20)</span>
<span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">T</span>>
<span class="keyword">concept</span> <span class="type">Numeric</span> = <span class="function">std::is_arithmetic_v</span><<span class="type">T</span>>;
<span class="keyword">template</span><<span class="type">Numeric</span> <span class="type">T</span>>
<span class="type">T</span> <span class="function">square</span>(<span class="type">T</span> x) { <span class="keyword">return</span> x * x; }
</div>
</div>
</div>
</section>
<section id="stl" class="section">
<h2>Standard Template Library (STL)</h2>
<div class="concept-grid">
<div class="concept-card">
<h4>Containers</h4>
<p>Data structures for different use cases</p>
<div class="code-block">
<span class="comment">// Sequence containers</span>
<span class="keyword">std::vector</span><<span class="keyword">int</span>> vec = {<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>}; <span class="comment">// dynamic array</span>
<span class="keyword">std::deque</span><<span class="keyword">int</span>> deq = {<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>}; <span class="comment">// double-ended queue</span>
<span class="keyword">std::list</span><<span class="keyword">int</span>> lst = {<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>}; <span class="comment">// doubly linked list</span>
<span class="comment">// Associative containers</span>
<span class="keyword">std::map</span><<span class="keyword">std::string</span>, <span class="keyword">int</span>> ages; <span class="comment">// ordered key-value</span>
<span class="keyword">std::unordered_map</span><<span class="keyword">std::string</span>, <span class="keyword">int</span>> fast_ages; <span class="comment">// hash table</span>
<span class="keyword">std::set</span><<span class="keyword">int</span>> unique_nums; <span class="comment">// unique sorted elements</span>
</div>
</div>
<div class="concept-card">
<h4>Algorithms</h4>
<p>Generic algorithms that work with iterators</p>
<div class="code-block">
<span class="keyword">std::vector</span><<span class="keyword">int</span>> numbers = {<span class="number">3</span>, <span class="number">1</span>, <span class="number">4</span>, <span class="number">1</span>, <span class="number">5</span>};
<span class="comment">// Sorting and searching</span>
<span class="function">std::sort</span>(numbers.<span class="function">begin</span>(), numbers.<span class="function">end</span>());
<span class="keyword">auto</span> it = <span class="function">std::find</span>(numbers.<span class="function">begin</span>(), numbers.<span class="function">end</span>(), <span class="number">4</span>);
<span class="comment">// Transformations</span>
<span class="keyword">std::vector</span><<span class="keyword">int</span>> squared(numbers.<span class="function">size</span>());
<span class="function">std::transform</span>(numbers.<span class="function">begin</span>(), numbers.<span class="function">end</span>(),
squared.<span class="function">begin</span>(),
[](<span class="keyword">int</span> x) { <span class="keyword">return</span> x * x; });
</div>
</div>
<div class="concept-card">
<h4>Iterators</h4>
<p>Generalized pointers for container traversal</p>
<div class="code-block">
<span class="keyword">std::vector</span><<span class="keyword">int</span>> vec = {<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>};
<span class="comment">// Different iterator types</span>
<span class="keyword">auto</span> forward_it = vec.<span class="function">begin</span>(); <span class="comment">// forward iterator</span>
<span class="keyword">auto</span> reverse_it = vec.<span class="function">rbegin</span>(); <span class="comment">// reverse iterator</span>
<span class="keyword">auto</span> const_it = vec.<span class="function">cbegin</span>(); <span class="comment">// const iterator</span>
<span class="comment">// Range-based for loop (syntactic sugar)</span>
<span class="keyword">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& element : vec) {
<span class="function">std::cout</span> << element << <span class="string">" "</span>;
}
</div>
</div>
</div>
</section>
<section id="modern" class="section">
<h2>Modern C++ Features</h2>
<div class="concept-grid">
<div class="concept-card">
<h4>Lambda Expressions</h4>
<p>Anonymous functions for functional programming</p>
<div class="code-block">
<span class="comment">// Basic lambda</span>
<span class="keyword">auto</span> add = [](<span class="keyword">int</span> a, <span class="keyword">int</span> b) { <span class="keyword">return</span> a + b; };
<span class="comment">// Capture by value and reference</span>
<span class="keyword">int</span> multiplier = <span class="number">10</span>;
<span class="keyword">auto</span> scale = [multiplier](<span class="keyword">int</span> x) { <span class="keyword">return</span> x * multiplier; };
<span class="keyword">auto</span> modify = [&multiplier](<span class="keyword">int</span> x) { multiplier += x; };
<span class="comment">// Generic lambda (C++14)</span>
<span class="keyword">auto</span> generic = [](<span class="keyword">auto</span> x, <span class="keyword">auto</span> y) { <span class="keyword">return</span> x + y; };
<span class="comment">// Used with algorithms</span>
<span class="function">std::sort</span>(vec.<span class="function">begin</span>(), vec.<span class="function">end</span>(),
[](<span class="keyword">int</span> a, <span class="keyword">int</span> b) { <span class="keyword">return</span> a > b; });
</div>
</div>
<div class="concept-card">
<h4>Move Semantics</h4>
<p>Efficient resource transfer without copying</p>
<div class="code-block">
<span class="keyword">class</span> <span class="type">MyString</span> {
<span class="keyword">private</span>:
<span class="keyword">char</span>* data;
<span class="keyword">size_t</span> size;
<span class="keyword">public</span>:
<span class="comment">// Move constructor</span>
<span class="function">MyString</span>(<span class="type">MyString</span>&& other) <span class="keyword">noexcept</span>
: data(other.data), size(other.size) {
other.data = <span class="keyword">nullptr</span>; <span class="comment">// leave other in valid state</span>
other.size = <span class="number">0</span>;
}
<span class="comment">// Move assignment</span>
<span class="type">MyString</span>& <span class="keyword">operator</span>=(<span class="type">MyString</span>&& other) <span class="keyword">noexcept</span> {
<span class="keyword">if</span> (<span class="keyword">this</span> != &other) {
<span class="keyword">delete</span>[] data;
data = other.data;
size = other.size;
other.data = <span class="keyword">nullptr</span>;
other.size = <span class="number">0</span>;
}
<span class="keyword">return</span> *<span class="keyword">this</span>;
}
};
</div>
</div>
<div class="concept-card">
<h4>Perfect Forwarding</h4>
<p>Preserving value categories in template functions</p>
<div class="code-block">
<span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">T</span>, <span class="keyword">typename</span>... <span class="type">Args</span>>
<span class="keyword">std::unique_ptr</span><<span class="type">T</span>> <span class="function">make_unique</span>(<span class="type">Args</span>&&... args) {
<span class="keyword">return</span> <span class="function">std::unique_ptr</span><<span class="type">T</span>>(
<span class="keyword">new</span> <span class="type">T</span>(<span class="function">std::forward</span><<span class="type">Args</span>>(args)...)
);
}
<span class="comment">// Universal reference with perfect forwarding</span>
<span class="keyword">template</span><<span class="keyword">typename</span> <span class="type">T</span>>
<span class="keyword">void</span> <span class="function">wrapper</span>(<span class="type">T</span>&& arg) {
<span class="function">some_function</span>(<span class="function">std::forward</span><<span class="type">T</span>>(arg));
}
</div>
</div>
</div>
</section>
<section id="vocab" class="section">
<h2>C++ Developer Vocabulary</h2>
<div class="vocab-grid">
<div class="vocab-item">
<div class="vocab-term">RAII</div>
<div class="vocab-def">Resource Acquisition Is Initialization - tie resource lifetime to object lifetime</div>
<div class="dev-quote">"RAII is the foundation of exception-safe C++ code"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">PIMPL</div>
<div class="vocab-def">Pointer to Implementation - hide implementation details in private pointer</div>
<div class="dev-quote">"PIMPL reduces compilation dependencies and hides implementation details"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">SFINAE</div>
<div class="vocab-def">Substitution Failure Is Not An Error - template metaprogramming technique</div>
<div class="dev-quote">"SFINAE lets you enable/disable template instantiations based on type properties"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">ODR</div>
<div class="vocab-def">One Definition Rule - each entity can have only one definition in program</div>
<div class="dev-quote">"ODR violations are undefined behavior and hard to debug"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">ADL</div>
<div class="vocab-def">Argument-Dependent Lookup - compiler looks for functions in namespaces of arguments</div>
<div class="dev-quote">"ADL is why you can write 'std::cout << x' without qualifying operator<<"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">CRTP</div>
<div class="vocab-def">Curiously Recurring Template Pattern - template inherits from instantiation of itself</div>
<div class="dev-quote">"CRTP gives you static polymorphism without virtual function overhead"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">UB</div>
<div class="vocab-def">Undefined Behavior - code that can do anything, compiler makes no guarantees</div>
<div class="dev-quote">"Undefined behavior isn't just unpredictable - it can break your entire program"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">ABI</div>
<div class="vocab-def">Application Binary Interface - low-level interface between compiled code modules</div>
<div class="dev-quote">"Breaking ABI means recompiling everything that links against your library"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">POD</div>
<div class="vocab-def">Plain Old Data - C-compatible data types with trivial construction/destruction</div>
<div class="dev-quote">"POD types can be memcpy'd safely and work with C APIs"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">NRVO</div>
<div class="vocab-def">Named Return Value Optimization - compiler eliminates unnecessary copies</div>
<div class="dev-quote">"NRVO means returning large objects by value can be zero-cost"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">TMP</div>
<div class="vocab-def">Template Metaprogramming - computation at compile time using templates</div>
<div class="dev-quote">"TMP moves runtime costs to compile time, but can make compilation slow"</div>
</div>
<div class="vocab-item">
<div class="vocab-term">Tag Dispatch</div>
<div class="vocab-def">Overload resolution technique using empty types as discriminators</div>
<div class="dev-quote">"Tag dispatch is cleaner than SFINAE for simple template overloading"</div>
</div>
</div>
<div class="highlight-box">
<h4>Things C++ Devs Actually Say</h4>
<div class="best-practices">
<ul>
<li>"Don't optimize prematurely, but design for performance"</li>
<li>"If it compiles, ship it" (just kidding - write tests!)</li>
<li>"Templates are compile-time duck typing"</li>
<li>"When in doubt, use const"</li>
<li>"RAII or die trying"</li>
<li>"Zero-cost abstractions are the C++ way"</li>
<li>"You don't pay for what you don't use"</li>
<li>"Trust the optimizer, but verify with profiling"</li>
<li>"Prefer composition over inheritance"</li>
<li>"Make interfaces easy to use correctly and hard to use incorrectly"</li>
</ul>
</div>
</div>
</section>
<div class="section">
<h2>Quick Reference Cheat Sheet</h2>
<div class="concept-grid">
<div class="concept-card">
<h4>Memory</h4>
<div class="code-block">
<span class="comment">// Smart pointers</span>
<span class="function">std::make_unique</span><<span class="type">T</span>>(args...) <span class="comment">// unique ownership</span>
<span class="function">std::make_shared</span><<span class="type">T</span>>(args...) <span class="comment">// shared ownership</span>
<span class="keyword">std::weak_ptr</span><<span class="type">T</span>> <span class="comment">// non-owning reference</span>
<span class="comment">// Casts</span>
<span class="function">static_cast</span><<span class="type">T</span>>(expr) <span class="comment">// compile-time cast</span>
<span class="function">dynamic_cast</span><<span class="type">T</span>>(expr) <span class="comment">// runtime polymorphic cast</span>
<span class="function">const_cast</span><<span class="type">T</span>>(expr) <span class="comment">// remove const</span>
<span class="function">reinterpret_cast</span><<span class="type">T</span>>(expr) <span class="comment">// low-level cast</span>
</div>
</div>
<div class="concept-card">
<h4>Common Patterns</h4>
<div class="code-block">
<span class="comment">// Range-based for</span>
<span class="keyword">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& item : container) { }
<span class="comment">// Structured bindings (C++17)</span>
<span class="keyword">auto</span> [key, value] = map_pair;
<span class="comment">// If with initializer (C++17)</span>
<span class="keyword">if</span> (<span class="keyword">auto</span> result = <span class="function">find</span>(x); result != <span class="keyword">end</span>()) { }
<span class="comment">// Uniform initialization</span>
<span class="type">std::vector</span><<span class="keyword">int</span>> v{<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>};
</div>
</div>
</div>
</div>
</div>
</body>
</html>