Le carnet On est
Séance 1 · encre bleue

Introduction au C++

Différences C/C++/Java, projet C++, syntaxe étendue, références, namespaces, premier programme orienté objet.

~ 45 min Source : Cours1Introduction C++ 12 flashcards · 7 QCM

📄 Ressources du cours

📥 Télécharger les slides  ·  🔗 Ouvrir dans un nouvel onglet  ·  📝 Ouvrir le TD/TP

🎥 Vidéos recommandées

1. Pourquoi C++ ?

C++ en quatre mots
  • Très répandu — toujours dans le top 5 des langages industriels
  • Rapide — compilé en code machine optimisé
  • Portable — un même code source compile sur tous les OS
  • Multi-paradigmes — procédural et orienté objet
👍 Forces
Performance, contrôle bas niveau, immense écosystème de bibliothèques, expressivité (multi-paradigme).
👎 Défauts
Complexité importante, gestion mémoire manuelle (attention aux fuites), contrôle fin = plus de pièges.

C++ versus C

  • C est un sous-ensemble de C++ — presque tout code C compile en C++
  • C++ ajoute : programmation orientée objet, programmation générique (templates), type checking plus strict

C++ versus Java

AspectC++Java
ButEfficacité d'exécution (performance)Productivité du programmeur (portabilité)
LibertéFaire confiance au programmeurImposer certaines contraintes
ParadigmeProcédural et orienté objetOrienté objet
MémoireManuelle (attention aux fuites !)Garbage collection
RuntimeCode machine exécuté par l'OS · risques de buffer overflow, segfaultByte code interprété par la JVM · exceptions
PerformanceCompilation statique → code optimiséByte code, JIT (progrès)

2. Outils & projet C++

Outils nécessaires

  • Éditeur de texte — VSCode, Sublime, Vim…
  • Compilateurg++, clang++, cl.exe (MSVC)…
  • Débogueur — gdb, lldb
  • 3-en-1 = IDE (Environnement de Développement Intégré) — Code::Blocks, CLion, Visual Studio

Structure d'un projet C++

Chaîne de compilation
source.cpp ──→ [compile] ──→ object.o ──→ [link] ──→ executable
ExtensionRôle
.h / .hppFichier de déclaration (header) — interface de la classe
.cpp / .cc / .CFichier d'implémentation
.oFichier objet (compilé, pas encore lié)
.lib / .dllBibliothèque statique / dynamique

Compilation avec g++

g++ -Wall -std=c++11 -c file.cpp     # compile (warning all, C++11) -> file.o
g++ -o prog file1.o file2.o          # link les objets -> executable

Un Makefile automatise ce processus pour les projets multi-fichiers.

Architecture d'un projet OO

Vector.h interface user.cpp #include "Vector.h" Vector.cpp #include "Vector.h"

L'en-tête .h sert d'interface : à la fois utilisée par les clients (user.cpp) et par l'implémentation (Vector.cpp).

3. Premier programme

#include <iostream>    // bibliothèque d'entrées/sorties

using namespace std;  // raccourci sur l'espace de noms std

int main()
{
   cout << "Hello world!" << endl;
   return 0;
}
  • #include <iostream> inclut la bibliothèque d'entrées/sorties
  • using namespace std; évite de devoir préfixer chaque appel par std::
  • int main() est le point d'entrée du programme — comme en C
  • cout + opérateur << envoie sur la sortie standard
  • endl = retour à la ligne

4. Spécificités C++ (hors objet)

Types

  • Types C classiques : int, char, float, double
  • Booléen natif : bool (avec true / false)
  • Inférence de type : autoauto z = sqrt(y); infère le type
  • String : type natif via #include <string>

Variables — convention de nommage

Convention camelCase
  • Commencer par une minuscule
  • Décomposer en plusieurs mots collés
  • Chaque nouveau mot commence par une majuscule (sauf le premier)
  • Exemple : tauxOccupationSol

Initialisation

// Syntaxe historique (C)
int i = 7;

// Syntaxe avec parenthèses (préférée en C++)
int ageUser(18);
double pi(3.14159);
bool estMonAmi(true);
char lettre('a');
string nomUser("leVolontaire");

// Brace initialization (C++11) — plus stricte
double d2 {2.3};        // OK
int i {7.2};            // ERROR : narrowing interdit
int i = 7.2;           // OK silencieusement (perte de précision)
📌 Brace initialization
Les { } empêchent toute conversion implicite avec perte (narrowing). Plus sûr que = ou ( ) qui acceptent silencieusement double → int.

Fonctions inline

inline int Max(int i, int j) {
   if (i > j) return i;
   else      return j;
}

Le compilateur inline le code de la fonction à l'endroit de l'appel — pas d'overhead de l'appel. Réservé aux petites fonctions, pas de récursivité, pas de pointeur.

const et volatile

const Rend impossible la modification de la variable. Évite les erreurs, aide aussi l'optimisation.
const int cst1 = 42;
const char* f();        // retourne const
void g(const int tab);  // param const
void methodClass() const; // méthode const
volatile Empêche les optimisations du compilateur sur cette variable — utile pour les variables modifiées hors du flot normal (interruption, hardware).

5. Références (&) et pointeurs

Référence = alias d'une variable On utilise le symbole & dans le type pour déclarer une référence. La référence et la variable d'origine doivent être du même type.
int prixRevient(16);            // déclaration d'une variable
int& prixAchat(prixRevient);    // alias
prixAchat = 20;                  // modifie aussi prixRevient !

Pointeur vs Référence — choisir le plus sûr

Pointeur (héritage C) :

int i = 0;
int* pi = &i;       // pointeur sur i
*pi = *pi + 1;     // déréférencement

Référence (idiomatique C++) :

int i = 0;
int& ri = i;       // alias
ri = ri + 1;       // modifie i
🔑 Préférer la référence
Code plus lisible, pas de risque de pointeur nul ou pendant. Une référence ne peut pas changer de cible après initialisation — elle est moins flexible que le pointeur, mais aussi moins dangereuse.

Passage par référence

void test(int& i) {
   i = 2;        // modifie la variable d'origine
}

int x = 5;
test(x);          // après cet appel : x == 2

Le passage par référence est plus efficace que par valeur (pas de copie) et permet à la fonction de modifier l'argument.

6. Namespaces

Espace de noms = conteneur logique Évite les collisions de noms entre bibliothèques. std::cout et monLib::cout peuvent coexister.
namespace first {
   int x;
}
namespace second {
   int x;          // pas de collision : first::x ≠ second::x
}

int main() {
   first::x = 1;     // résolution explicite
   using namespace first;  // ouverture du namespace
   x = 1;             // désigne first::x
   second::x = 2;    // résolution explicite
}

7. Entrées / sorties standards

C++ redéfinit les I/O pour les simplifier. Tout est dans <iostream> et le namespace std.

En CEn C++Rôle
stdincinEntrée standard
stdoutcoutSortie standard
stderrcerrSortie d'erreur
printf<< (insertion)Écriture
scanf>> (extraction)Lecture
#include <iostream>
using namespace std;

int main() {
   int a;
   cout << "saisir a ";
   cin >> a;
   cout << "le carré de " << a << " vaut " << a*a << endl;
}

8. Première classe — exemple Point

Une classe C++ se déclare typiquement dans un fichier d'en-tête .h et s'implémente dans un .cpp.

point.h — déclaration

#ifndef _POINT_HPP_
#define _POINT_HPP_

class Point {
   private:
      int x;
      int y;

   public:
      void setX(int);
      void setY(int);
      int getX();
      int getY();
};

#endif

point.cpp — implémentation

#include "point.h"

void Point::setX(int px) { x = px; }
void Point::setY(int py) { y = py; }
int Point::getX() { return x; }
int Point::getY() { return y; }

main.cpp — utilisation

#include <iostream>
#include "point.h"
using namespace std;

int main() {
   Point p;
   p.setX(3);
   p.setY(4);
   cout << "x = " << p.getX() << " y = " << p.getY();
   return 0;
}
⚠ Header guards (#ifndef / #define / #endif) Évitent les inclusions multiples du même header dans une même unité de compilation (erreur de "redéfinition"). Indispensable.

Cette structure de base sera enrichie en SE2 avec les constructeurs et destructeurs.

Réviser le chapitre

Pour vérifier ta compréhension

Qu'est-ce qu'un objet en C++ ?

Un objet est une instance d'une classe. Il regroupe des attributs (données membres) et des méthodes (fonctions membres) qui agissent sur ces données.

Quelle est la différence entre public, private et protected ?

public : accessible partout. private : accessible uniquement à l'intérieur de la classe (par défaut). protected : accessible à l'intérieur de la classe et de ses classes dérivées.

À quoi sert le mot-clé this ?

this est un pointeur implicite vers l'objet courant. Il permet d'accéder aux membres d'un objet depuis l'intérieur d'une de ses méthodes. Utile pour distinguer un attribut d'un paramètre du même nom : this->x = x;

Quelle est la différence entre la déclaration et la définition d'une classe ?

La déclaration dans le .h (header) annonce l'existence de la classe et de ses membres. La définition des méthodes se fait dans le .cpp (implémentation), avec la syntaxe type Classe::methode(args) { … }. Cela permet de séparer interface et implémentation.

Pourquoi utilise-t-on des accesseurs (getters/setters) ?

Pour respecter l'encapsulation : les attributs restent private et seuls les accesseurs publics permettent d'y accéder. Cela permet de contrôler les modifications (validation), de modifier l'implémentation interne sans casser le code client, et de garantir des invariants.

🃏 Flashcards

3 paradigmes supportés par C++ ?
Procédural (héritage C), orienté objet, générique (templates).
Différence C++ / Java sur la mémoire ?
C++ = gestion manuelle (attention aux fuites). Java = garbage collector automatique.
À quoi servent les header guards #ifndef / #define / #endif ?
Empêchent les inclusions multiples du même header dans une unité de compilation. Sans eux : erreur de redéfinition.
Qu'apporte la brace initialization int i {5} ?
Empêche toute conversion avec perte (narrowing). int i {7.2} est une erreur ; int i = 7.2 est silencieusement accepté.
Quand utiliser inline ?
Pour des petites fonctions sans récursivité ni pointeur. Le compilateur insère le code à l'appel → pas d'overhead.
Référence vs pointeur ?
Référence : alias, ne peut pas changer de cible, syntaxe propre. Pointeur : adresse stockée, modifiable, syntaxe avec * et &. Préférer la référence.
À quoi sert const sur une variable ?
Rend la variable non modifiable. Aide l'optimisation et évite les bugs (modifications accidentelles).
Que signifie une méthode déclarée void f() const ?
La méthode ne peut pas modifier l'objet sur lequel elle est appelée. Le mot-clé const à la fin de la signature.
À quoi sert using namespace std; ?
Ouvre le namespace std dans le scope courant — on peut écrire cout au lieu de std::cout.
Comment lire et écrire en C++ ?
Écrire : cout << valeur;. Lire : cin >> variable;. Erreurs : cerr << …;. Tout est dans <iostream>.
Convention de nommage des variables C++ ?
camelCase : commencent par minuscule, mots collés, chaque nouveau mot avec majuscule. Ex : tauxOccupationSol.
Que compile g++ -Wall -std=c++11 -c file.cpp ?
Compile file.cpp en file.o (objet, non lié) avec tous les warnings et la norme C++11.

✎ Quiz éclair

1.Qu'inclut-on pour utiliser cout et cin ?
  • <stdio.h>
  • <string>
  • <iostream>
  • <stream>
<iostream> fournit cin, cout, cerr — les flux d'entrée/sortie standards.
2.Quelle initialisation refuse silencieusement une perte de précision ?
  • int i {7.2};
  • int i = 7.2;
  • int i(7.2);
  • Aucune
La brace initialization { } empêche le narrowing — int i {7.2} est une erreur. Les deux autres acceptent silencieusement.
3.Après int a = 5; int& r = a; r = 10;, que vaut a ?
  • 5
  • 15
  • 10
  • Erreur de compilation
r est un alias de a. Modifier r modifie a.
4.Pourquoi déclarer une fonction inline ?
  • Pour la rendre récursive
  • Pour la rendre virtuelle
  • Pour l'appeler depuis un autre fichier
  • Pour éviter l'overhead de l'appel (petite fonction)
Le compilateur insère directement le code à l'appel. Pas de récursivité possible, pas de pointeur de fonction.
5.Que fait const sur une méthode : int getX() const; ?
  • Empêche la méthode de modifier l'objet
  • Empêche tout appel à cette méthode
  • Rend le retour const
  • Crée une copie constante
Une méthode const garantit qu'elle ne modifie pas l'objet courant — utile pour les getters.
6.Que sont .h et .cpp ?
  • Deux versions du même langage
  • Objet et exécutable
  • Déclaration (interface) et implémentation
  • Header HTML et fichier C++
Le .h déclare l'interface (signatures, classes). Le .cpp implémente.
7.Pourquoi C/C++ est-il généralement plus rapide que Java ?
  • Parce qu'il a moins de mots-clés
  • Parce qu'il a un garbage collector
  • Parce qu'il est plus ancien
  • Compilation directe en code machine (vs byte code interprété)
Java compile en byte code interprété par la JVM. C++ compile directement en code machine exécuté par l'OS.

Score : 0 / 7 ·