1. Introduction au C++
sommaire chapitre 1
1.3. C++ un meilleur C ?
C++ introduit un ensemble d'améliorations par rapport au langage C :
- l'encapsulation des données (= la protection des données au sein de la classe / objet)
- espaces de nom namespace (éviter les redondances de types)
- gestion des exceptions (amélioration de la gestion des erreurs)
- opérateurs new et delete (malloc/free simplifié)
- paramètres par défaut des sous-programmes
- type de donnée bool
- les fonctions lambda (C++ 11)
- la généricité
- ...
En ce qui concerne le concept d'objet, on introduit :
- l'héritage (simple / multiple)
- les fonctions virtuelles / virtuelles pures (abstraction)
- la surcharge d'opérateurs (operator overloading)
- la généricité (template)
1.3.1. En quoi C++ est-il meilleur que le langage C
La notion de classe (encapsulation des données) et celle d'héritage (réutilisabilité
du code) permettent d'être plus proche des concepts humains ce qui permet de simplifier
la conception des applications (diagrammes de classes UML).
La généricité apporte également un confort dans la réutilisation du code.
1.3.2. Quels sont les inconvénients du C++
1.3.2.a permissivité
C++ repose sur le langage C et donc en reprend les défauts. C'est un
langage expressif mais très permissif
Le degré de liberté laissé au programmeur dans l'écriture des expressions
ainsi que la sémantique subtile du langage (cas des pointeurs combinés aux
opérateur de post ou pré-incrémentation) conduisent à l'introduction non
volontaire de nombreuses erreurs parfois difficiles à détecter.
On pourra lire à ce sujet l'ouvrage de Jacquelin Charbonnel qui distingue
entre autres causes d'erreurs :
- habitudes acquises dans l'apprentissage d'autres langages comme Pascal (cas du = et ==)
- pièges lexicaux et utilisation de macros
- problèmes liés à l'allocation dynamique
- manque de rigueur dans la gestion des opérations d'entrée / sortie
1.3.2.b plusieurs sémantiques pour un même opérateur
Plusieurs opérateurs possèdent des sémantiques différentes ce qui peut rendre la lecture
du code difficile :
- & : le symbole du ET binaire, on l'utilise aussi :
- pour définir l'adresse d'une variable : int *p = &x;
- pour déclarer une référence à une variable: int &p = x;
- on le double pour réaliser le ET logique : (x == 1) && (y > 2)
- * : le symbole de la multiplication, il permet également :
- de déclarer un pointeur : int *p;
- d'accèder à la valeur d'un pointeur (rvalue, lvalue) : *p = *p + 1;
- peut être surchargé pour une classe donnée : Matrix m = a * b;
- pour les itérateurs de la STL il permet d'avoir accès à la valeur de l'itérateur