C++, un langage système et d'applications rapides

Le langage C a été doté d'objets pour faciliter la représentation des entités à traiter, et la réutilisation du code. Cela a permis de transformer ce langage système créé en 1972, en un langage de plus haut niveau, le C++.
D'autres capacités ont été ajoutées avec le temps comme les templates, les tuples, la concurrence.

C++ a été créé en 1981 par Bjarne Stroutstrup, qui avait découvert l'orientation objet dans Simula 67 et voulait l'ajouter au langage C tout en restant compatible avec lui et ainsi conserver ses avantages, notamment la portabilité entre systèmes.

Langage de programmation C++ pour systèmes

Sa conception obéit à un ensemble de règles:

Le premier standard ISO pour le langage C++ date de 1998, c'est C++ 98. Une nouvelle version lui a succédé en 2011, c'est C++ 11. Avec cette version qui n'apporte rien quand à la lisibilité et la modernité, le langage s'ancre dans son rôle d'outil système dont il a été détourné un temps.

Il est utilisé comme langage d'application grâce à des interfaces graphiques comme Qt et GTK ou pour les jeux avec des moteurs 3D Unreal Engine. Il est clair qu'il a été conçu pour optimiser les performances de l'ordinateur et certainement pas la productivité du programmeur. Les erreurs qui arrivent inévitablement avec sa syntaxe hard-core et peu lisible se paient cher en temps de déboguage. Utilisé là où il convient, pour des outils systèmes, il apporte des avantages indéniable sur C, tels que le RAII, dont on parlera plus loin.

Exemple de code: Afficher les caractères d'une chaîne.

string s = "demo" + "suffixe";
int l = s.length();
for(int i = 0; i < l; i++) {
   char c = s[i];
   printf("%c\n", c);
} 

Bref historique du langage

Les objets de l'activité formalisés

C++ décrit des classes dans les fichiers d'en-tête, et le corps des méthodes dans les fichiers source. En déclarant des instances de classes vous pouvez réutiliser les ensembles de variables et méthodes sans avoir à les déclarer de nouveau.
La surcharge des fonctions permet de les déclarer avec des paramètres différents mais avec le même nom.

Les classes héritent les unes des autres et partagent leurs méthodes. L'héritage multiple lui est propre, cela n'a pas été repris dans les langages dérivés.
Au cours du temps, la définition de struct a évolué au point de devenir l'équivalent de celle d'une classe, avec la différente qu'une structure est publique par défaut alors qu'une classe est privée par défaut. Les structs peuvent être dotées de méthodes et supporter l'héritage et en fait, on peut se passer des classes entièrement dans un programme orienté objet.

Ce modèle conceptuel est critiqué par Trygve Reenskaug, l'inventeur du MVC et du DCI,  qui le trouve trop statique et peu adapté à la réalité d'un traitement pour lequel la représentation des objets devrait varier en fonction du contexte. Mais ce défaut est partagé par tous les langages orientés objet actuels sauf peut-être par ceux comme Go qui remplacent l'héritage par la composition.

Gestion mémoire

C++ a introduit le RAII (Resource Acquisition Is Initialization), un principe selon lequel, quand un objet est créé et donc une zone de mémoire est requise, celle-ci sera libérée automatiquement lors de la destruction de l'objet. Cela dispense d'un garbage collector et de l'instruction free du langage C.
La ressource peut être un objet, une classe, une instance de fichier. Elle est déclarée dans un scope et libérée quand on sort du scope.

C++11

Le nouveau langage C++ est amélioré, nous dit Bjarne Stroustrup, son créateur, selon trois plans:

  1. Le langage.
  2. La bibliothèque standard.
  3. La concurrence.

La définition du standard a été approuvée le 25 mars 2011 par le comité C++ ISO.
Le format interne UTF-8 est maintenant supporté pour les chaînes de caractères.

Nouveaux types et mots-clés

  1. auto
    Le type de la variable se déduit de ce qui est assigné.
    Exemple:
    vector<string> v = {"Alicia", "Bea", "Clara",  "Dara" };
    for (auto x : v) cout << x <<'\n';
  2. constexpr
    Une expression constante.
  3. nullptr
    Un mot réservé pour un pointeur nul.
    Ex:
    char *x = nullptr;
  4. littéral brut de chaîne (raw string).
    Des chaînes où les codes d'échappement ne sont pas interprétés, comme entre guillemets simples en PHP.
    Elles ont le préfixe R.
  5. decltype
    Mode d'utilisation du type dans une expression, retourne le type et les modifieurs de tout objet y compris une fonction.
  6. Litéraux UTF 8
    u8"Un text quelconque".
    On utilise u pour l'UTF16 et U pour l'UTF 32.

Sécurité sur les types

  1. Contrôle de l'alignement des valeurs.
  2. Contrôle des valeurs par défaut.

Nouvelles constructions

Boucle For sur un intervalle.
Comme cela est implémenté sur la plupart des langages de script.

int arr[5] = {2, 8, 21, 56, 995}; 
 
for (int &x : arr) {
  printf("%d\n", x);  
}

Comme on peut le voir, le langage conserve le principe du code source minimal. Il n'utilise pas le mot-clé in comme le font la plupart des langages, mais est plutôt un symbole.
Une tradition qui est née à l'époque où l'on économisait chaque caractère pour réduire la taille du code! La mémoire coûtait cher en 1972...

Fonction lambda.
Fonctions définies et utilisées sur place de façon contextuelle et éphémère.

rvalue
C'est un mode de référence au contenu d'une variable qui consiste à assigner à A le contenu de B sans le copier mais en déplaçant le pointeur sur le contenu, dans la perspective ou B n'est plus utilisée.

Modèle "variadic".
Template dont le nombre d'arguments est variable.

Assertion statique
Introduite avec le mot-clé static_assert, elle teste la validité d'une assertion à la compilation.

Enumération typée et avec scope

Les classes

Délégation et héritage des constructeurs. Le constructeur d'une classe peut appeler le constructeur d'autres classes.

Les attributs de classes pourront être assignés directement dans la définition de la classe.

La bibliothèque standard

De nouveaux objets apparaîssent qui sont devenus familiers dans les langages de scripts tels que PHP.

  1. regexp
    Expressions régulières
  2. tuple
    Propre au langage Python.
  3. array
    Tableau statique.
  4. unordered_map
    Table de hâchage.
  5. date.
  6. smart pointer
    Pointeur malin;

Plus divers composants de librairies et améliorations. Par exemple on peut maintenant assigner statiquement une liste à un vector dans sa déclaration.

La concurrence

Les threads multiples avec mémoire partagée sont faciles à utiliser. On crée une fonction et on l'appelle grâce à un pointeur de fonction avec la commande thread...

#include <thread>

void f(int a) {
  ... code...
}

int main() {
  ...
  thread t(&f, 1000);
  t.join();
  ...
}

La commande join() démarre le thread.
La commande async appelle une fonction en mode asynchrone, quelque chose qui est devenu familier avec Ajax.

Caractéristiques de la concurrence sous C++11:

  1. Modèle de mémoire adapté aux ordinateurs actuels avec processeurs multi-coeurs.
  2. Thread ABI.
  3. Types atomiques.
  4. Mutexes et verrous.
  5. Stockage local de thread.
  6. Echange de messages asynchrone.

Outils et documents

Objective C est une version de C orientée objet plus simple d'emploi que C++. GnuStep est un environnement de développement pour Linux et Windows.

Voir aussi: Les candidats successeurs de C++.