1. GENERALITES CONCERNANT C++
Le C++ a été conçu à partir de 1982 par Bjarne Stroustrup dans l'objectif d'ajouter au C des classes. Il s'agissait donc de greffer au C classique des possibilités de Programmation Orientée Objet(POO).
Le canevas minimal à utiliser pour réaliser un programme C++ se présente ainsi :
#include < iostream >
using namespace std ;
main() // en-tête
{ ..... // corps du programme
}
Toute variable utilisée dans un programme doit avoir fait l’objet d’une déclaration en précisant
le type et, éventuellement, la valeur initiale. Voici des exemples de déclarations :
int i ; /* i est une variable de type int nommée i */
float x = 5.25 ; /* x est une variable de type float nommée x
initialisée avec la valeur 5.25*/
const int NFOIS = 5 ; /* NFOIS est une variable de type int dont la
valeur, fixée à 5, ne peut plus être modifiée*/
1-1. Programmation Orientée Objet
La programmation a toujours suscité diverses réactions. Pour certains, c'est un jeu de construction enfantin, dans lequel il suffit d'enchaîner un petit nombre d'instructions élémentaires pour résoudre un problême, pour d'autres, c'est de produire des logiciels avec des exigences de qualité basées sur des critères:
*exactitude: aptitude d'un logiciel à fournir les bons résultats, dans des conditions normales d'utilisation;
*robustesse: aptitude à bien réagir lorsque l'on s'écarte des conditions normales d'utilisation;
*extensibilité: facilité d'adaptation pour satisfaire à une évolution des spécifications;
*réutilisabilité: possibilités d'utiliser certaines parties du logiciel pour résoudre un autre problème;
*portabilité: facilité d'exploiter un même logiciel dans différentes implémentations;
*efficience: temps d'exécution,taille,maille...
La contradiction est apparente et liée à l'importance des projets concernés. Il est facile d'écrire un programme exact et robuste s'il ne comporte qu'une centaine d'instructions; ilen va tout autrement s'il s'agit d'un projet de dix bonnes années. Les aspects extensibilité et réutilisabilté ont très peu d'importance dans le premier cas, alors qu'ils seront cruciaux dans le second, ne serait-ce que pour des raisons économiques.
Programmation structurée
Bien que la programmation structurée ait fait progresser la qualité de production des logiciels, ses propres fondements lui imposaient des limitations. elle reposait sur l'équation de Wirth:
Méthodes + Données + Objet
Encapsulation
En POO pure, l'encapsulation signifie qu'il est impossible d'agir directement sur les données d'un objet sans passer par l'intermédiaire de ses méthodes. On dit que l'appel d'une méthode estl'envoi d'un message à l'objet. Ainsi, vu de l'extérieur, un objet ne se caractérise que par les spécifications de ses méthodes, la manière dont sont implantées les données étant sans importance. L'encapsulation facilite la réutilisation d'objets et la maintenance des logiciels. La modification d'une stucture des données n'ayant d'incidence que sur l'objet lui-même, ses utilisateurs ne seront plus concernés par la teneur de cette modification.
Concept de classe
Le concept de classe correpond à une généralisation de la notion de type, une classe n'étant que la description d'un ensemble d'objets ayant une même structure de données et disposant des mêmes méthodes. Les objets apparaissent alors comme des variables de type classe.
Héritage
L'héritage permet de définir une nouvelle classe à partir de celle existante, à laquelle on peut ajouter nouvelles classe, héritant propriétés et aptitudes de l'ancienne, peut ainsi s'appuyer sur des réalisations antérieures parfaitement mises au point pour une spécification. Pouvant être réitéré réutilisation des produits existants.
POO et langage de programmation
Des langages peuvent être conçus pour appliquer les principes de POO pure (Simula, Smaltalk, Eiffel ou Java). Le C++ est obtenu en ajoutant au C les outils permettant de réaliser les principes fondamentaux de POO. Programmer en C++ va donc plus loin qu'adopter une philosophie POO en C, mais moins loin que de faire de POO pure avec Eiffel. Cette situation permet de préserver l'existant et de transiter en douceur de la programmation sturcturée vers POO sans imposer une application stricte des principes de POO.
1-2. Les spécificités du C++
Le C++ présente, par rapport au C ANSI, des extensions qui ne sont pas véritablement orientées POO:
- nouvelle forme de commentaire (en fin de ligne);
- plus grande liberté dans l'emplacement des déclarations;
- surdéfinition des fonctions;
- notion de référence facilitant la mise en oeuvre de la transmission d'arguments par adresse;
- nouveaux opérateurs de gestion dynamique de la mémoire: new et delete;
- possibilité de définir des fonctions en ligne (inline).
1-3. Le C++ et la Programmation Orientée Objet
Les possibilités de POO constituent l'essentiel de l'apport de C++, qui dispose de la classe - description d'une structure de données et de méthodes. Concernant le vocabulaire, le C++ utilise ses propres termes:
- membres données, désignant les membres de la structure de données associée à la classe;
- fonctions membres, désignant les méthodes.
A partir d'une classe, des objets peuvent être créés soit par déclarations, ou par allocation dynamique. Le C++ permet d'encapsuler les données, mais n'en impose pas. Il permet aussi de définir un constructeur (un destructeur aussi) qui est une fonction membre particulière, exécutée au moment de la création (destruction) de l'objet. L'existence d'un contructeur garantit l'initialisation correcte de l'objet, pendant que le destructeur assure la libération de la mémoire (dynamiquement) allouée.
Une autre originalité du C++ par rapport aux autres langages de POO est la possibilité de définir des fonctions amies et la surdéfinition de fonctions ou surdéfinitions d'opérateurs. A l'instar du C, le C++ dispose aussi des possibilités de conversions explicites et implicites des types de base qu'il élargit, de plus, aux types classes. IL dispose des techniques d'héritage simple et multiple. IL comporte de nouvelles possibilités d'entrées-sorties avec des avantages évidents (simplicité d'utilisation, taille mémoire réduite et possibilité de les appliquer aux objets de type classes). Dans ces dernières versions, le C++ s'est doté de patrons, permettant de définir des méthodes générant différentes classes ou fonctions génériques, même si cette généricité n'est pas totalement intégrée dans le langage, comme c'est le cas avec le ADA, par exemple.
Enfin, la norme ANSI a accru le contenu de la bibliothèque standard de C++, qui vient compléter celle du C, toujours disponible. On y trouve de nombreux patrons de classes et de fonctions permettant d'utiliser les structures de données et les algorithmes usuels, évitant la roue à la moindre occasion.
1-4. Types de base
Les types de base sont ceux à partir desquels seront construits tous les autres, dits dérivés (il s’agira des types structurés comme les tableaux, les structures, les unions et les classes, ou d’autres types simples comme les pointeurs ou les énumérations).
Il existe trois types entiers : short int (ou short), int et long int (ou long). Les limitations correspondantes dépendent de l’implémentation. On peut également définir des types entiers non signés : unsigned short int (ou unsigned short), unsigned int et unsigned long int (ou unsigned long). Ces derniers sont essentiellement destinés à la manipulation de motifs binaires.
Les constantes entières peuvent être écrites en notation hexadécimale (comme 0xF54B) ou octale (comme 014). On peut ajouter le « suffixe » u pour un entier non signé et le suffixe l pour un entier de type long.
Il existe trois types flottants : float, double et long double. La précision et le « domaine représentable » dépendent de l’implémentation.
Le type « caractère » permet de manipuler des caractères codés sur un octet. Le code utilisé
dépend de l’implémentation. Il existe trois types caractère : signed char, unsigned char et
char (la norme ne précise pas s’il correspond à signed char ou unsigned char).
Les constantes de type caractère, lorsqu’elles correspondent à des « caractères imprimables »,
se notent en plaçant le caractère correspondant entre apostrophes.
Certains caractères disposent d’une représentation conventionnelle utilisant le caractère « \ »
notamment ’\n’ qui désigne un saut de ligne. De même, ’\’’ représente le caractère ’ et ’\"’
désigne le caractère ". On peut également utiliser la notation hexadécimale (comme dans ’\
x41’) ou octale (comme dans ’\07’).
Le type bool permet de manipuler des « booléens ». Il dispose de deux constantes notées true et false.