Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

C++ – Syntaxe, OOP, STL & Compilation

Guide complet IDEO‑Lab sur le langage C++ (Compilation, Pointeurs, OOP, C++ Moderne).

1.1 Facile

Vue d'ensemble

Langage compilé, typé statiquement, OOP, performance.

Compilé OOP
1.2 Facile

C++ vs C vs Python/Java

Comparaison (performance, mémoire, usage).

Performance Mémoire
1.3 Facile

Installation Compilateur

g++ (Linux), clang (macOS), MSVC (Windows).

g++ clang
1.4 Facile

Workflow: Compiler & Lier

g++ main.cpp -o main, ./main (Exécuter).

Compiler Linker
1.5 Moyen

IDE & Build Systems

VS Code, Make, CMake (le standard).

VS Code CMake
2.1 Facile

Hello World

#include <iostream>, std::cout, main().

#include std::cout
2.2 Facile

Variables & Types

int, double, char, bool, std::string, auto.

int std::string
2.3 Facile

Opérateurs

Arithmétique, Logique, Bitwise.

== && <<
2.4 Facile

Structures de Contrôle

if, else if, else, switch.

if switch
2.5 Facile

Boucles (Loops)

for, while, do-while, Range-based for.

for while
3.1 Avancé

Pointeurs (*) & Références (&)

& (adresse de), * (déréférencement), nullptr.

Pointeur (*) Référence (&)
3.2 Moyen

Mémoire (Stack vs Heap)

Stack (automatique, rapide) vs Heap (dynamique, lent).

Stack Heap
3.3 Avancé

Allocation (new/delete)

new (Heap alloc), delete (Heap free), delete[], Fuites mémoire.

new delete
3.4 Avancé

Allocation (Style C)

malloc(), free() (À éviter en C++).

malloc free
4.1 Moyen

Fonctions (Avancé)

Surcharge (Overloading), .h (Header) vs .cpp (Source).

Overloading Header (.h)
4.2 Moyen

Arrays vs std::vector

Array (style C) vs std::vector (dynamique, C++).

std::vector Array (C-style)
4.3 Facile

Structs

struct (agrégat de données).

struct Data
5.1 Moyen

Classes & Objets

class, public, private, this, Encapsulation.

class public private
5.2 Avancé

Constructeurs/Destructeurs

Constructor(), ~Destructor() (RAII).

Constructor Destructor
5.3 Avancé

Héritage

class B : public A, protected.

extends protected
5.4 Avancé

Polymorphisme

virtual function, = 0 (Pure), Classe Abstraite.

virtual Abstract
6.1 Moyen

STL (Intro)

Standard Template Library (Containers, Algorithms, Iterators).

STL Containers
6.2 Moyen

STL (Containers)

std::vector, std::map, std::string.

std::vector std::map
6.3 Avancé

Smart Pointers (C++11)

std::unique_ptr, std::shared_ptr (RAII, anti-fuite).

unique_ptr shared_ptr
7.1 Moyen

Build (Makefile)

make, Makefile simple (all, clean).

make Makefile
7.2 Avancé

Build (CMake)

CMakeLists.txt (project, add_executable).

CMake Build System
7.3 Moyen

Testing (GTest)

Google Test, TEST(), EXPECT_EQ().

GTest Unit Test
7.4 Avancé

C++ dans le Web

WebAssembly (Wasm), Wt, Node.js Addons (N-API).

WebAssembly Node.js Addon
8.1 Facile

Cheat-sheet

Syntaxe (cout, cin), g++, vector.

cheat Syntax
1.1 Vue d'ensemble : C++
Qu'est-ce que C++ ?

C++ (créé par Bjarne Stroustrup) est un langage de programmation **compilé**, **typé statiquement**, **multi-paradigme** (impératif, orienté objet, fonctionnel) et à usage général.

Il est souvent décrit comme "C avec des classes". Sa philosophie principale est la **performance brute** et le **contrôle total de la mémoire** ("zero-cost abstraction").

C'est un langage complexe mais extrêmement puissant, utilisé lorsque la performance est la priorité absolue.

Domaines d'application
  • Systèmes d'Exploitation (OS) : (Windows, macOS, Linux ont des parties en C++).
  • Moteurs de Jeux Vidéo : (Unreal Engine, Unity).
  • Navigateurs Web : (Google Chrome, Firefox).
  • Calcul Haute Performance (HPC) : (Physique, Finance).
  • Systèmes Embarqués & Robotique : (Contrôle temps réel).
  • Backends (Modules) : (Modules Node.js, Python pour le calcul lourd).
1.2 C++ vs C vs Python/Java
CritèreCC++Python / Java
ParadigmeProcéduralProcédural, Orienté Objet (OOP), FonctionnelOrienté Objet (Script)
ExécutionCompilé (Natif)Compilé (Natif)Interprété (VM / JIT)
Gestion MémoireManuelle (malloc/free)Manuelle (new/delete) ou Auto (RAII) (Smart Pointers)Automatique (Garbage Collector)
PerformanceExtrêmeExtrême (parfois plus lent que C si OOP mal utilisé)Lente (10x-100x plus lent)
UsageNoyau (Linux), Embarqué (bas niveau)Applications (Jeux, GUI), Systèmes complexesApplications Web, Scripts, Data Science
1.3 Installation (Compilateur)
Linux (GCC/G++)

GCC (GNU Compiler Collection) est le standard. gcc est pour le C, g++ est pour le C++.

# Ubuntu / Debian
sudo apt update
sudo apt install -y build-essential gdb

# RHEL / Rocky / Fedora
sudo dnf groupinstall -y "Development Tools"
Windows (MSVC vs MinGW vs WSL)
  • Option 1: MSVC (Natif) : Installez Visual Studio 2022. Sélectionnez la charge de travail "Développement Desktop en C++". C'est le compilateur cl.exe.
  • Option 2: MinGW/MSYS2 (Portage g++) : Installe un environnement g++ pour Windows.
  • Option 3: WSL (Recommandé) : Utiliser "Windows Subsystem for Linux" (WSL2) avec Ubuntu, puis suivre l'installation Linux (onglet 1).
macOS (Clang)

Clang (de LLVM) est le compilateur par défaut (remplace g++). Il est inclus dans "Xcode Command Line Tools".

xcode-select --install
1.4 Workflow : Compilation & Exécution
1. Le Fichier (main.cpp)
#include <iostream>

int main() {
    std::cout << "Hello World!" << std::endl;
    return 0;
}
2. Compiler (Transpiler + Linker)

g++ (ou clang++) compile le .cpp (lisible) en code machine (.o) puis le "lie" (link) aux librairies (iostream) pour créer un exécutable (a.out).

$ g++ main.cpp
# (Crée un fichier 'a.out')

# (BONNE PRATIQUE: Nommer la sortie '-o')
$ g++ main.cpp -o hello

# (BONNE PRATIQUE: Activer les Warnings + C++17)
$ g++ -Wall -Wextra -std=c++17 main.cpp -o hello
3. Exécuter
$ ./hello
Hello World!
Compilation Multi-fichiers

Pour les projets plus larges (Header + Source).

math.h (Header)
#ifndef MATH_H
#define MATH_H

int addition(int a, int b); // Déclaration

#endif
math.cpp (Source)
#include "math.h"

int addition(int a, int b) { // Définition
    return a + b;
}
main.cpp
#include <iostream>
#include "math.h" // Inclure notre header

int main() {
    std::cout << addition(5, 3);
    return 0;
}
Compiler
g++ main.cpp math.cpp -o mon_app
1.5 IDEs & Build Systems
IDE (Environnements)
  • VS Code : (Recommandé) Léger, excellent support (IntelliSense C/C++, CMake Tools).
  • Visual Studio (Windows) : Le "poids lourd", IDE complet (MSVC, Debugger).
  • CLion (JetBrains) : (Payant) Excellent, centré sur CMake.
Build Systems (make, cmake)

g++ main.cpp math.cpp ... devient ingérable. Un "Build System" automatise la compilation.

OutilDescription
Make (Makefile)Ancien standard. Définit les dépendances et les commandes de compilation. (Voir 7.1).
CMake (CMakeLists.txt)(Standard Moderne) Un "générateur de Makefile". Plus haut niveau, multiplateforme. (Voir 7.2).
2.1 Hello World (iostream)
// 1. Préprocesseur: Inclure la "Standard I/O Stream Library"
#include <iostream>

// 2. Point d'entrée principal (int = retourne un code d'erreur)
int main() {
    
    // 3. 'std' (standard) = Espace de noms (namespace)
    //    'cout' (console out) = Objet "stream" de sortie
    //    '<<' = Opérateur "stream insertion"
    std::cout << "Hello World!";
    
    // 'endl' (end line) = Nouvelle ligne + 'flush'
    std::cout << std::endl;
    
    // 4. (Optionnel) "using namespace" (évite 'std::')
    // using namespace std;
    // cout << "Hello";
    
    // 5. Retourner 0 (code 0 = Succès)
    return 0;
}
2.2 Variables & Types Primitifs
Types (Tailles courantes)
TypeTaille (typique)Usage
int4 octetsNombres entiers (-2, 0, 100).
double8 octetsNombres flottants (défaut) (3.14).
float4 octetsFlottants (précision simple).
char1 octetCaractère ('A').
bool1 octettrue ou false.
Modificateurs (unsigned, long)
long int x;
long long y; // (Garanti 64 bits)
unsigned int z; // (Pas de négatifs)
Déclarations
#include <string> // (Nécessaire pour std::string)

int age = 30;
double prix = 19.99;
char initial = 'G';

// Chaîne (Style C) - (À éviter)
const char* nom_c = "Alice";

// Chaîne (Style C++ - Recommandé)
std::string nom_cpp = "Bob";
nom_cpp += " Martin"; // (Facile à manipuler)

// C++11 (Inférence de type)
auto x = 5;     // (Infère 'int')
auto y = 3.14;  // (Infère 'double')
auto z = "txt"; // (Infère 'const char*')

// Constantes
const double PI = 3.14159;
2.3 Opérateurs
// Arithmétique
+ - * /
% (Modulo)
i++ (Incrémenter)
i-- (Décrémenter)

// Assignation
=
+= (i += 1 -> i = i + 1)
-= *= /=

// Comparaison
== (Égal)
!= (Différent)
< > <= >=

// Logique
&& (ET)
|| (OU)
! (NON)

// Bitwise (Niveau bas)
& (ET binaire)
| (OU binaire)
^ (XOR binaire)
<< (Shift Gauche)
>> (Shift Droit)

// Stream (I/O)
<< (Insertion, ex: cout)
>> (Extraction, ex: cin)
2.4 Structures de Contrôle (if, switch)
if / else if / else
int age = 20;

if (age >= 18) {
    std::cout << "Majeur";
} else if (age < 12) {
    std::cout << "Enfant";
} else {
    std::cout << "Adolescent";
}

// Opérateur Ternaire
std::string status = (age >= 18) ? "Majeur" : "Mineur";
switch (cas)
int note = 10;

switch (note) {
    case 20:
        std::cout << "Parfait";
        break; // (Ne pas oublier 'break' !)
    case 10:
        std::cout << "Moyen";
        break;
    default:
        std::cout << "Autre";
        break;
}
2.5 Boucles (for, while)
Boucle for (C-style)
for (int i = 0; i < 10; i++) {
    std::cout << i << std::endl;
}
Range-based for (C++11) (Recommandé)

Pour itérer sur des conteneurs (std::vector, std::string...).

#include <vector>
#include <string>

std::vector nums = {10, 20, 30};

// (Copie 'n')
for (int n : nums) {
    std::cout << n << std::endl;
}

// (Référence 's' (plus rapide))
std::string hello = "Hello";
for (const char& s : hello) {
    std::cout << s << "-";
}
while
int i = 0;
while (i < 10) {
    std::cout << i;
    i++;
}
do-while

(S'exécute au moins 1 fois).

int input;
do {
    std::cout << "Entrez 0 pour sortir: ";
    std::cin >> input;
} while (input != 0);
3.1 Pointeurs (*) & Références (&) (Concept Dense)
Pointeurs (*)

Un **pointeur** est une variable qui ne stocke pas une valeur, mais l'**adresse mémoire** d'une autre variable.

int age = 30; // (Stocké à l'adresse 0x1000)

// 1. Déclaration: 'ptrAge' est un POINTEUR vers un 'int'
int* ptrAge;

// 2. Assignation: '&' (Adresse de)
//    'ptrAge' stocke l'adresse 0x1000
ptrAge = &age;

// 3. Déréférencement: '*' (Valeur à l'adresse)
//    Va à l'adresse 0x1000 et prend la valeur
std::cout << *ptrAge; // Affiche 30

// 4. Modifier via le pointeur
*ptrAge = 31;
std::cout << age; // Affiche 31

// 5. Pointeur nul (ne pointe nulle part)
int* ptrNull = nullptr;
Références (&)

Une **référence** est un **alias** (un surnom) pour une variable existante. Elle ne peut pas être null et ne peut pas être "re-dirigée".

(Souvent plus simple et plus sûr que les pointeurs).

int age = 30;

// 1. Déclaration: 'refAge' est une RÉFÉRENCE à 'age'
// (Doit être initialisée)
int& refAge = age;

// 2. Utilisation (pas besoin de '*')
std::cout << refAge; // Affiche 30

// 3. Modification
refAge = 31;
std::cout << age; // Affiche 31
Passage par Valeur vs Référence
// 1. (Passage par Valeur: Copie)
void func_valeur(int x) {
    x = 100; // Ne modifie que la copie
}

// 2. (Passage par Pointeur)
void func_ptr(int* x) {
    *x = 100; // Modifie l'original
}

// 3. (Passage par Référence) (Recommandé)
void func_ref(int& x) {
    x = 100; // Modifie l'original
}

int main() {
    int a = 10;
    func_valeur(a); // a == 10
    
    func_ptr(&a);   // a == 100
    
    int b = 10;
    func_ref(b);    // b == 100
}
3.2 Mémoire (Stack vs Heap)
La "Stack" (Pile)

Analogie : Une pile d'assiettes.

  • Gestion : Automatique (par le compilateur).
  • Vitesse : Extrêmement rapide (allocation/libération).
  • Durée : Locale (liée au "scope" {}).
  • Usage : Variables locales (int a = 10;).
Le "Heap" (Tas)

Analogie : Un grand entrepôt.

  • Gestion : **Manuelle** (par le développeur).
  • Vitesse : Lent (recherche d'espace libre).
  • Durée : Globale (existe jusqu'à delete).
  • Usage : Allocation dynamique (new).
void maFonction() {
    int x = 10; // (x est créé sur la STACK)
    
    // (p est sur la STACK)
    // ('new int[50]' (50*4 octets) est sur le HEAP)
    int* p = new int[50];
    
} // (Fin de fonction)
// 1. 'x' (Stack) est détruit (automatique)
// 2. 'p' (Stack) est détruit (automatique)
// 3. 'new int[50]' (Heap) N'EST PAS détruit
//    -> FUITE MÉMOIRE (Memory Leak)
3.3 Allocation (new/delete)
C++ (new / delete)

(Appelle le constructeur/destructeur).

// 1. Allouer 1 objet
int* pInt = new int;
*pInt = 10;

// 2. Libérer 1 objet
delete pInt;
C++ (new[] / delete[])

(Le Piège)

// 1. Allouer 1 array
int* pArray = new int[50];

// 2. Libérer 1 array (CRUCIAL: [])
delete[] pArray;

// (Si 'delete pArray' -> Comportement indéfini)
RAII & Smart Pointers

Gérer new/delete est difficile. La solution C++ moderne est de ne **jamais** utiliser new/delete nus.

Utilisez les Smart Pointers (Pointeurs Intelligents) (voir 6.3) qui gèrent le delete automatiquement (RAII).

// (Moderne: C++14)
#include <memory>

void maFonction() {
    // 1. Alloue sur le Heap
    std::unique_ptr pInt = std::make_unique(10);
    
} // 2. 'pInt' sort du scope,
  //    le 'delete' est appelé automatiquement.
3.4 Allocation (Style C : malloc/free)

⚠️ (Héritage C - À ÉVITER en C++) malloc/free (de <cstdlib>) ne comprennent pas les objets C++ (ils n'appellent *pas* les constructeurs/destructeurs).

#include <cstdlib> // (Pour malloc/free)

// 1. Allouer 10 ints (10 * taille d'un int)
// (malloc retourne void*, doit être 'casté')
int* p = (int*) malloc(10 * sizeof(int));

if (p == NULL) {
    // Erreur
}

// 2. Libérer
free(p);
4.1 Fonctions (Surcharge, Headers)
Surcharge (Overloading)

Plusieurs fonctions avec le *même nom* mais des *arguments différents*.

int addition(int a, int b);
double addition(double a, double b);
std::string addition(std::string a, std::string b);

addition(1, 2); // Appelle (int)
addition(1.5, 2.5); // Appelle (double)
Headers (.h) vs Source (.cpp)

(Voir 1.4). C'est la structure standard des projets C++.

  • .h (Header) : Déclarations (signatures) des fonctions/classes. "Ce qui est public".
  • .cpp (Source) : Définitions (implémentation) des fonctions/classes. "Comment c'est fait".
4.2 Arrays (C-style) vs std::vector
Array (Style C) (À éviter)

Taille fixe, pas de vérification des limites, "decay" (déchéance) en pointeur.

int monArray[5] = {10, 20, 30, 40, 50};
monArray[0] = 10;

// (DANGER: Dépassement de buffer, non vérifié !)
// monArray[50] = 999;
std::vector (STL) (Recommandé)

La version C++ moderne. Gère la mémoire, dynamique, sécurisé.

#include <vector>

// Crée un vecteur dynamique
std::vector monVecteur;

monVecteur.push_back(10); // (Ajoute à la fin)
monVecteur.push_back(20);

// Accès (sécurisé)
monVecteur.at(0); // (Vérifie les limites)

// Taille
monVecteur.size();

// Itération
for (int val : monVecteur) { ... }
4.3 Structs

Un struct est un agrégat de données. (En C++, struct est (presque) identique à class, mais public par défaut).

#include <string>
#include <iostream>

struct Utilisateur {
    int id;
    std::string nom;
    bool actif;
};

int main() {
    Utilisateur u1;
    u1.id = 1;
    u1.nom = "Alice";
    u1.actif = true;
    
    std::cout << u1.nom << std::endl;
    return 0;
}
5.1 Classes & Objets (OOP)
class (Encapsulation)

Une classe lie des **données** (membres, propriétés) à des **fonctions** (méthodes) qui opèrent sur ces données.

Encapsulation : L'état interne (private) est protégé et n'est accessible que via des méthodes (public) (Getters/Setters).

  • public: Accessible de l'extérieur.
  • private: (Défaut) Accessible *uniquement* par les méthodes de la classe.
CompteBancaire.h (Déclaration)
#ifndef COMPTEBANCAIRE_H
#define COMPTEBANCAIRE_H

class CompteBancaire {
// 1. Membres privés (Données)
private:
    double solde;

// 2. Membres publics (Interface)
public:
    // Constructeur (voir 5.2)
    CompteBancaire(double soldeInitial);
    
    // Méthodes (Getters/Setters)
    void deposer(double montant);
    bool retirer(double montant);
    double getSolde() const; // 'const' = ne modifie pas l'objet
};

#endif
CompteBancaire.cpp (Implémentation)
#include "CompteBancaire.h"
#include <stdexcept> // (Pour les erreurs)

// (Utilisation de l'opérateur '::' (scope))
CompteBancaire::CompteBancaire(double soldeInitial) {
    if (soldeInitial < 0) {
        throw std::invalid_argument("Solde initial négatif");
    }
    // 'this' est un pointeur vers l'objet actuel
    this->solde = soldeInitial;
}

void CompteBancaire::deposer(double montant) {
    if (montant > 0) {
        this->solde += montant;
    }
}

double CompteBancaire::getSolde() const {
    return this->solde;
}

// main.cpp (Utilisation)
// ...
// CompteBancaire monCompte(100.0);
// monCompte.deposer(50);
// // monCompte.solde = 10000; // ERREUR (private)
5.2 Constructeurs & Destructeurs (RAII)
Constructeur

Appelé lors de la création (new ou stack).

class MaClasse {
public:
    // 1. Constructeur par défaut
    MaClasse() { ... }
    
    // 2. Constructeur (Surchargé)
    MaClasse(int x) { ... }
    
    // 3. Constructeur de Copie
    MaClasse(const MaClasse& autre) { ... }
};

MaClasse obj1;      // (Appelle 1)
MaClasse obj2(10); // (Appelle 2)
MaClasse obj3 = obj1; // (Appelle 3)
Destructeur (~) & RAII

Appelé lors de la destruction (fin de scope (Stack), ou delete (Heap)).

RAII (Resource Acquisition Is Initialization) : C'est le concept C++ le plus important. Lier la *durée de vie* d'une ressource (mémoire, fichier, socket) à la *durée de vie* d'un objet (scope).

class FileHandle {
private:
    FILE* pFile;
public:
    // 1. Acquisition (Constructeur)
    FileHandle(const char* name) {
        pFile = fopen(name, "w");
    }
    
    // 2. Libération (Destructeur)
    ~FileHandle() {
        if (pFile) fclose(pFile);
    }
};

void test() {
    FileHandle f("log.txt"); // 1. Ouvre le fichier
    // ... (écritures)
} // 2. 'f' sort du scope, le destructeur
  //    est appelé, 'fclose' est garanti.
5.3 Héritage (extends)
Syntaxe (: public)

Permet à une classe "enfant" (dérivée) d'hériter des membres (public, protected) d'une classe "parent" (base).

VisibilitéDescription
publicAccessible par tous.
protectedAccessible par la classe et ses enfants.
privateAccessible *uniquement* par la classe.
Exemple
// Classe de Base
class Animal {
protected:
    std::string nom;
public:
    Animal(std::string n) : nom(n) {} // Initializer list
    
    void manger() { std::cout << "Mange..."; }
};

// Classe Dérivée
class Chien : public Animal {
public:
    // (Appelle le constructeur parent)
    Chien(std::string n) : Animal(n) {}
    
    void aboyer() {
        // (Accès OK car 'nom' est 'protected')
        std::cout << this->nom << " aboie !";
    }
};

Chien c("Medor");
c.manger(); // (Hérité)
c.aboyer(); // (Propre)
5.4 Polymorphisme (virtual)
Fonctions Virtuelles

Le polymorphisme permet à un objet (via un pointeur de base) d'appeler la *bonne* méthode (celle de l'enfant).

virtual (Parent) : Dit "cette fonction *peut* être surchargée (overridden)".

override (Enfant) : Dit "je *surcharge* cette fonction virtuelle" (sécurité).

Classe Abstraite (= 0)

Une fonction "pure virtuelle" (= 0) *doit* être implémentée par l'enfant. (Rend la classe "Abstraite").

Exemple
class Forme { // Classe Abstraite
public:
    // Pure virtual
    virtual double getAire() const = 0;
};

class Carre : public Forme {
private:
    double cote;
public:
    Carre(double c) : cote(c) {}
    // Implémentation (override implicite)
    double getAire() const override {
        return cote * cote;
    }
};

class Cercle : public Forme {
private:
    double rayon;
public:
    Cercle(double r) : rayon(r) {}
    double getAire() const override {
        return 3.14 * rayon * rayon;
    }
};

// --- Utilisation ---
// (Pointeur de Base)
Forme* f = new Cercle(10);
std::cout << f->getAire(); // Appelle getAire() de Cercle
delete f;
6.1 STL (Standard Template Library)
La Bibliothèque Standard C++

La STL est la raison pour laquelle le C++ moderne est utilisable. C'est une bibliothèque (basée sur des "templates" / generics) qui fournit des structures de données et des algorithmes pré-codés et optimisés.

Les 3 Piliers de la STL
  • Containers (Conteneurs) : Les structures de données (vector, map, string...).
  • Algorithms (Algorithmes) : Les fonctions (sort, find, for_each...).
  • Iterators (Itérateurs) : Le "lien" entre les deux (ex: vec.begin(), vec.end()).
6.2 STL : Containers (vector, map, string)
std::string (Texte)
#include <string>
std::string s1 = "Hello";
std::string s2 = "World";
std::string s3 = s1 + " " + s2; // "Hello World"
s3.length();
s3.substr(0, 5); // "Hello"
std::vector (Array dynamique)
#include <vector>
std::vector v;
v.push_back(10); // [10]
v.push_back(20); // [10, 20]
v.at(0); // 10
v.size(); // 2

for (int val : v) { ... }
std::map (Dictionnaire K/V)
#include <map>
#include <string>
std::map ages;

ages["Alice"] = 30;
ages["Bob"] = 25;

std::cout << ages["Alice"]; // 30

for (auto const& [key, val] : ages) {
    std::cout << key << ": " << val;
}
6.3 Smart Pointers (RAII)
Le Problème (new/delete)

Cette fonction provoque une fuite mémoire si doSomething() échoue (throw) :

void maFonction() {
    MaClasse* p = new MaClasse(); // 1. Alloc
    p->doSomething();
    // (Si 'doSomething' throw une exception...)
    delete p; // 2. (Cette ligne n'est jamais atteinte)
}
std::unique_ptr (Le défaut)

(Propriétaire Unique) Gère delete automatiquement (RAII). Ne peut pas être copié, doit être "déplacé" (std::move).

#include <memory>

void maFonction() {
    // 1. Alloue (C++14+)
    std::unique_ptr p = std::make_unique();
    
    p->doSomething();
    
} // 2. 'p' sort du scope, 'delete' est appelé (auto),
  //    même si 'doSomething' throw.
std::shared_ptr (Partagé)

(Propriété Partagée) Utilise un compteur de références. L'objet n'est détruit que lorsque le *dernier* shared_ptr sort du scope.

#include <memory>

void maFonction() {
    // 1. (Compteur = 1)
    std::shared_ptr p1 = std::make_shared();
    
    {
        // 2. (Compteur = 2)
        std::shared_ptr p2 = p1;
    
    } // 3. 'p2' sort du scope (Compteur = 1)
    
} // 4. 'p1' sort du scope (Compteur = 0) -> 'delete' est appelé.
7.1 Build (Makefile)
Makefile (Simple)

(Utilise des tabulations, pas des espaces, pour l'indentation !)

# (Makefile)
# Variables
CXX = g++
CXXFLAGS = -Wall -std=c++17 -O2
LDFLAGS =

# Cibles (Phony = pas un fichier)
.PHONY: all clean

# 1. 'make all' (ou 'make')
all: mon_app

# 2. 'mon_app' dépend de .o
mon_app: main.o math.o
    $(CXX) $(LDFLAGS) -o mon_app main.o math.o

# 3. 'main.o' dépend de .cpp/.h
main.o: main.cpp math.h
    $(CXX) $(CXXFLAGS) -c main.cpp

math.o: math.cpp math.h
    $(CXX) $(CXXFLAGS) -c math.cpp

# 4. 'make clean'
clean:
    rm -f *.o mon_app
7.2 Build (CMake) (Standard Moderne)
CMakeLists.txt (Le générateur)

CMake est un "générateur de Makefile" (ou de projets Visual Studio...). Il est multiplateforme.

# (CMakeLists.txt)
# 1. Version minimum
cmake_minimum_required(VERSION 3.10)

# 2. Nom du Projet
project(MonApp VERSION 1.0)

# 3. Standard C++
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 4. L'exécutable (et ses fichiers sources)
add_executable(mon_app
    main.cpp
    math.cpp
    math.h
)

# 5. (Optionnel) Lier des librairies
# target_link_libraries(mon_app PRIVATE GTest::GTest)
Workflow (Out-of-source)
mkdir build
cd build
cmake ..
make
7.3 Testing (GTest)
Google Test (GTest)

Framework de test unitaire standard.

// tests/test_math.cpp
#include <gtest/gtest.h>
#include "../math.h" // (Inclure le code à tester)

// Test(Groupe, Nom)
TEST(AdditionTest, Positifs) {
    // Assertions
    EXPECT_EQ(addition(1, 2), 3);
    EXPECT_TRUE(addition(1, 1) > 1);
}

TEST(AdditionTest, Negatifs) {
    EXPECT_EQ(addition(-1, -1), -2);
}

// (main() est géré par GTest)
7.4 Cas d'usage : C++ dans le Web
1. Backend (Modules Natifs)

Utiliser C++ pour un serveur web complet est rare (ex: Wt, CppCMS).

Usage principal : Écrire des **modules natifs** (add-ons) pour des backends (Node.js, Python) pour le calcul lourd (ex: IA, traitement d'image).

// (Node.js N-API)
// (Python CTypes/Pybind11)
2. Frontend (WebAssembly)

WebAssembly (Wasm) est le cas d'usage moderne.
Permet de compiler C++ (ou Rust) en un binaire .wasm qui s'exécute dans le navigateur (presque à vitesse native).

Usage : Figma (éditeur), AutoCAD Web, jeux vidéo 3D (Unreal Engine) dans le navigateur.

8.1 Cheat-sheet (Syntaxe)
Bases
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    // ...
    return 0;
}
// Commentaire
/* Multi-lignes */
I/O (Console)
cout << "Texte " << variable << endl;
cin >> variable;
Compilation (g++)
g++ -std=c++17 -Wall main.cpp -o app
./app
Pointeurs & Références
int x = 10;
int* p = &x; // Pointeur
int& r = x;  // Référence

*p = 20; // x vaut 20
r = 30;  // x vaut 30
Mémoire (Moderne)
#include <memory>
unique_ptr p1 = make_unique(10);
shared_ptr p2 = make_shared();
STL
std::vector v;
v.push_back(10);
v.at(0);
v.size();

std::map m;
m["cle"] = 100;