I. Le langage C++

Le C++ est l'un des langages de programmation les plus utilisés actuellement. Il est à la fois facile à utiliser et très efficace. Il souffre cependant de la réputation d'être compliqué et illisible. Cette réputation est en partie justifiée. La complexité du langage est inévitable lorsqu'on cherche à avoir beaucoup de fonctionnalités. En revanche, en ce qui concerne la lisibilité des programmes, tout dépend de la bonne volonté du programmeur.

Les caractéristiques du C++ en font un langage idéal pour certains types de projets. Il est incontournable dans la réalisation des grands programmes. Les optimisations des compilateurs actuels en font également un langage de prédilection pour ceux qui recherchent les performances. Enfin, ce langage est, avec le C, idéal pour ceux qui doivent assurer la portabilité de leurs programmes au niveau des fichiers sources (pas des exécutables).

Les principaux avantages du C++ sont les suivants :

  • grand nombre de fonctionnalités ;

  • performances du C ;

  • facilité d'utilisation des langages objets ;

  • portabilité des fichiers sources ;

  • facilité de conversion des programmes C en C++, et, en particulier, possibilité d'utiliser toutes les fonctionnalités du langage C ;

  • contrôle d'erreurs accru.

On dispose donc de quasiment tout : puissance, fonctionnalité, portabilité et sûreté. La richesse du contrôle d'erreurs du langage, basé sur un typage très fort, permet de signaler un grand nombre d'erreurs à la compilation. Toutes ces erreurs sont autant d'erreurs que le programme ne fait pas à l'exécution. Le C++ peut donc être considéré comme un « super C ». Le revers de la médaille est que les programmes C ne se compilent pas directement en C++ : il est courant que de simples avertissements en C soient des erreurs blocantes en C++. Quelques adaptations sont donc souvent nécessaires, cependant, celles-ci sont minimes, puisque la syntaxe du C++ est basée sur celle du C. On remarquera que tous les programmes C peuvent être corrigés pour compiler à la fois en C et en C++.

Tout le début de cette partie (chapitres 1 à 8) traite des fonctionnalités communes au C et au C++, en insistant bien sur les différences entre ces deux langages. Ces chapitres présentent essentiellement la syntaxe des constructions de base du C et du C++. Le début de cette partie peut donc également être considéré comme un cours allégé sur le langage C. Cependant, les constructions syntaxiques utilisées sont écrites de telle sorte qu'elles sont compilables en C++. Cela signifie qu'elles n'utilisent pas certaines fonctionnalités douteuses du C. Ceux qui désirent utiliser la première partie comme un cours de C doivent donc savoir qu'il s'agit d'une version épurée de ce langage. En particulier, les appels de fonctions non déclarées ou les appels de fonctions avec trop de paramètres ne sont pas considérés comme des pratiques de programmation valables.

Les chapitres suivants (chapitres 8 à 12) ne traitent que du C++. Le Chapitre 8 traite de la programmation orientée objet et de toutes les extensions qui ont été apportées au langage C pour gérer les objets. Le Chapitre 9 présente le mécanisme des exceptions du langage, qui permet de gérer les erreurs plus facilement. L'identification dynamique des types sera décrite dans le Chapitre 10. Le Chapitre 11 présente la notion d'espace de nommage, que l'on utilise afin d'éviter les conflits de noms entre les différentes parties d'un grand projet. Enfin, le Chapitre 12 décrit le mécanisme des template, qui permet d'écrire des portions de code paramétrées par des types de données ou par des valeurs constantes. Ces dernières notions sont utilisées intensivement dans la bibliothèque standard C++, aussi la lecture complète de la première partie est-elle indispensable avant de s'attaquer à la deuxième.

Dans toute cette première partie, la syntaxe sera donnée, sauf exception, avec la convention suivante : ce qui est entre crochets ('[' et ']') est facultatif. De plus, quand plusieurs éléments de syntaxe sont séparés par une barre verticale ('|'), l'un de ces éléments, et un seulement, doit être présent (c'est un « ou » exclusif). Enfin, les points de suspension désigneront une itération éventuelle du motif précédent.

Par exemple, si la syntaxe d'une commande est la suivante :

[fac|rty|sss] zer[(kfl[,kfl[...]])];
les combinaisons suivantes seront syntaxiquement correctes :
zer;
fac zer;
rty zer;
zer(kfl);
sss zer(kfl,kfl,kfl,kfl);
mais la combinaison suivante sera incorrecte :
fac sss zer()
pour les raisons suivantes :

  • fac et sss sont mutuellement exclusifs, bien que facultatifs tous les deux ;

  • au moins un kfl est nécessaire si les parenthèses sont mises ;

  • il manque le point virgule final.

Rassurez-vous, il n'y aura pratiquement jamais de syntaxe aussi compliquée. Je suis sincèrement désolé de la complexité de cet exemple.