C++ est un vieux langage toujours actif qui est régulièrement remis au gout du jour avec de nouvelles versions introduisant certaines fonctionnalités et constructions syntaxiques.
Lorsqu'une nouvelle version de C++ est introduite, la philosophie est de rester rétro-compatible avec les versions antérieures sans impact sur la performance du programme.
Ainsi du code C++ compilant avec la version N restera valide (dans la majorité des cas) pour la version N+1 avec des performances au moins aussi bonnes.
Une brève histoire de C++
C : l'ancêtre
Le langage C a été développé par l'informaticien Dennis Ritchie (Bell Labs) entre 1969 et 1973. Il a servi initialement à développer le système d'exploitation Unix (ainsi que de nombreux autres OS par la suite). Ses principales caractéristiques sont d'être un langage :
- statiquement typé : le compilateur vérifie à la compilation la cohérence du typage
- structuré : des structures conditionnelles et de boucles sont proposées (ce qui était relativement novateur pour l'époque où beaucoup de langages utilisaient encore des sauts et étiquettes)
- impératif : les instructions sont regroupées dans des fonctions (possiblement appelables récursivement) qui peuvent avoir un effet de bord
Le langage C propose un opérateur de référencement (&) et déréférencement (*) ce qui permet une manipulation fine et puissante de la mémoire (ce qui nécessite certaines précautions).
C++ : du C dopé avec des classes
Bjarne Stroustrup développe le successeur de C (nommé C++) à partir de 1979 avec l'idée d'y greffer un système de classes afin de pouvoir réaliser de la programmation orientée objet.
Il devient alors possible d'écrire des classes qui peuvent être liées entre-elles avec des relations d'héritage. Une classe contient différents types de membres :
- des champs variables ou constants
- des fonctions classiques ou virtuelles
La première version standardisée par l'organisme ISO de C++ date de 1998 (C++98).
La plupart des programmes C peuvent être compilés par un compilateur C++ (la principale source d'incompatibilité étant l'usage de mots réservés du C++). Ainsi l'adaptation de sources en C vers le C++ est relativement triviale. Cependant un programme C porté trivialement en C++ ne respectera pas la philosophie de la programmation orientée objet : pour s'y conformer un important travail de reconception devra être réalisé (création de classes, factorisation de code...).
Les versions standardisées ISO
C++98
C++98 date de 1998 et propose le support :
- des templates (types paramétrés)
- de la bibliothèque standard STL (Standard Template Library) avec les containers et algorithmes
- du RTTI (Run-time type information) qui permet de connaître dynamiquement à l'exécution le type d'un objet
C++03
Peu de nouveautés ont été introduites par C++03, il s'agit essentiellement d'amélioration et de corrections de bugs de la précédente version C++98.
C++11
Il s'agit de la révision la plus conséquente du langage C++. De nombreuses fonctionnalités ont été introduites :
- au niveau du langage lui-même (déclaration avec type auto ou decltype, références de rvalue, délégation et héritage de constructeur, expressions lambda, multithreading, attributs...)
- concernant la gestion de la mémoire (différents types de pointeurs, allocateurs personnalisés, possibilité d'utiliser un ramasse-miettes...)
- au niveau de la STL (std::chrono pour la gestion des dates, std::forward_list pour une liste simplement chaînée...)
C++14
C++14 est une révision d'ampleur relativement limitée (ajout de certains attributs comme [[deprecated]], facilités pour l'écriture de littéraux numériques..., fonctions lambda génériques et polymorphes...)
C++17
C++17 propose certaines nouveautés :
- concernant le langage (nouveaux attributs, if constexpr(exp), initialisations dans if et switch, déduction des types des templates...)
- pour la bibliothèque STL (introduction de std::string_view, container std::optional, bibliothèque de système de fichier inspirée de ``boost::filesystem, parallélisation de certains algorithmes...)
C++20
C++20 est en cours d'élaboration avec une publication attendue pour... 2020 (étonnant, n'est-ce pas ?). Voici un aperçu rapide des principales nouveautés :
- au niveau du langage (opérateur de comparaison <=>, contraintes pour la spécialisation de templates, coroutines, métaclasses, réflexion...)
- pour la bibliothèque (nouvelles classes pour la programmation concurrente, introduction d'une nouvelle API réseau orientée objet...)