Introduction au C++
Table des matières
1) INTRODUCTION
2) PREMIÈRES SPÉCIFICITÉS C++
3) VOCABULAIRE
4)APPLICATIONS
5) EXEMPLE COMPLET (COMMENTÉ)
le C++
Introduction pour qui connaît le C
Cette page n'est pas destinée au débutant. Je suppose que
le lecteur connait bien le C standard (ANSI). Sinon, vous pouvez d'abord
voir mon cours C complet. Pour un problème
précis, allez directement à son index.
1) INTRODUCTION
Le C++ est LA solution pour passer aux L.O.O. (langages orientés
objet) sans trop de problèmes.
a) qu'est-ce qu'un objet ?
une STRUCTure regroupant des données et les fonctions pour les manipuler.
b) pourquoi un L.O.O. ?
Le passage de l'assembleur aux langages structurés a permis d'obtenir
des programmes maintenables : on peut les comprendre, les modifier, les
améliorer : on a une structure de programme claire. Par contre si
l'on décide de modifier la structure des données importantes
(par exemple remplacer le tableau des données par une liste chaînée),
il fallait réécrire tout le programme. Les objets structurent
les données : en changeant la structure d'un objet, il suffit de
modifier ses "méthodes" pour que la transformation s'applique à
tout le programme. La programmation est plus simple, les méthodes
(fonctions en C) sont classées par types de données plutôt
que séquentiellement. De plus elles sont organisées hiérarchiquement
(arborescence=bidimensionnel plutôt que séquentiel=linéaire).
c) avantages - inconvénients ?
-
Programmes plus faciles à écrire et à maintenir. Modification
aisée, y compris des types de données. Modularité
accrue (un objet bien défini reservira dans de nombreux programmes)
-
Programme résultant (exécutable) un peu moins efficace (plus
gros et moins rapide, mais aujourd'hui le prix de la vitesse et de la mémoire
est inférieur au coût d'une optimisation de programme, on
n'écrit plus grand chose en assembleur).
d) Pourquoi C++ ?
C++ est sûrement un mauvais L.O.O. (du point de vue de l'informaticien
puriste), par contre il permet de garder tous les avantages du C : portable,
possibilité d'utiliser différents niveaux d'optimisation
au sein d'un même programme (objets - langage structuré classique
- assembleur). Il permet de passer en douceur aux objets, mais surtout
de garder et réutiliser toutes les bibliothèques existantes.
Bien que plus strict que C, il acceptera à peu près tout,
donc sera avare en messages d'erreur de compilation. C'est le programmeur
qui doit se forcer à programmer "objets", s'il ne le fait pas le
compilateur ne le prévient même pas. Comme vous le verrez
ici, le passage aux objets (si l'on connaît déjà C)
est très simple.
2) PREMIERES SPECIFICITES C++
a) commentaires
Les commentaires /* ... */ restent possibles, on y a ajouté les
commentaires commençant par / et se finissant à la fin de
la ligne.
b) entrées-sorties (flux)
à condition d'inclure <iostream.h> (et donc pas <stdio.h>),
on peut utiliser cout (pour afficher à l'écran) et cin (pour
lire sur le clavier). Exemple :
L'avantage de ces fonctions est qu'elles peuvent être plus facilement
surchargées que printf et scanf (par exemple étendues aux
tableaux). Les flux fstream possèdent les mêmes fonctionnalités
pour les fichiers (je ne détaille pas).
c) mot clef const
e) arguments par défaut
On peut déclarer des valeurs par défaut des arguments d'une
fonction (uniquement dans le prototype, pas dans l'entête). Les arguments
réels peuvent être omis en commençant par le dernier
(impossible d'omettre les premiers si l'on veut préciser un suivant).
f) résolution de portée
Si vous disposez de deux (ou plus) entités (donnée ou méthode)
de même nom, en C standard seule la plus locale est accessible. ou::nom
permet en C++ de préciser de quel nom on parle (en général
ou correspond à une classe, ::nom pour accéder
à une variable globale).
3) VOCABULAIRE
a) la classe
Une classe est un regroupement de données et de méthodes.
C'est donc une extension des STRUCT du C :
class MaClasse {déclaration données et méthodes
} MonInstance;
Ne pas oublier le ; final même quand on ne déclare pas
d'instance ici (en général les classes sont globales, les
variables devraient plutôt être locales). En fait les mots
clef struct et union permettent également la déclaration
de méthodes en plus de données, simplement elles sont par
défaut publiques (public) (accessibles aux autres classes) alors
que pour une classe elles sont par défaut privées (private).
b) l'instance
On utilisera le terme "instanciation" à chaque création d'une
instance (ce qu'on appelait avant une variable). L'adresse de l'instance
actuelle est appelée "this" (sans avoir à la déclarer).
c) l'héritage
les classes sont structurées de manière arborescente. Si
l'on crée une classe d'objets A (dite classe de base), on peut créer
une classe B qui "dérive" de A : elle en hérite toutes les
composantes (données et méthodes). On peut, à partir
de C++ version 2, utiliser l'héritage multiple (une classe hérite
de plusieurs classes de base), alors que ce n'était pas possible
avant.
d) la surcharge
On peut décrire plusieurs méthodes de même nom, à
condition que chacune s'applique à des types de données différents.
Par exemple on peut définir int puissance(int,int) et float
puissance(float,float), les deux fonctions ayant une implémentation
différente suivant le type de données, c'est le compilateur
qui choisira en fonction des types des arguments. On peut même surcharger
les opérateurs classiques du C (redéfinir + pour les vecteurs
par exemple). On ne peut pas surcharger deux fonctions ayant exactement
les mêmes types d'arguments mais retournant un type différent
(produits scalaire et vectoriel par exemple)
e) le constructeur
Pour chaque classe, il existe une méthode nécessaire (mais
non obligatoire, si on ne la définit pas le compilateur en crée
une par défaut) : le constructeur. Son nom est toujours le même
que celui de la classe. Il est appelé implicitement à chaque
nouvelle création d'instance ou explicitement par la fonction new
(correspond au malloc, mais c'est le compilateur qui détermine la
taille nécessaire). Le constructeur est une fonction qui ne retourne
rien (même pas void). Le destructeur est appelé implicitement
à la destruction d'un objet ou explicitement par delete. Remarque
: le constructeur peut affecter une valeur à un membre constant
(mais qui ne pourra pas changer jusqu'à sa destruction).
4)APPLICATIONS
a)simple
si je déclare :
je peux par exemple appeler la fonction (attention, pas n'importe où,
voir paragraphe suivant) :
On peut utiliser les 3 accès, autant de fois que l'on veut et dans
n'importe que ordre. L'accès qui s'applique est le dernier spécifié
(ou celui par défaut, private pour class et public pour struct).
c) héritage
Les accès dérivés sont le plus restrictif entre celui
défini dans la classe de base et celui précisé lors
de la dérivation (ici dérivation publique, les accès
restent inchangés sauf pour les privés qui sont inaccessibles).
On pourrait maintenant définir une classe segment contenant un pixel
et un point (la couleur n'a besoin d'être stockée qu'une fois).
On redéfinirait des méthodes de même nom : Segment::allume...
d) new, delete
Si l'on veut définir explicitement le destructeur d'une classe (pour
fermer un fichier par exemple), on utilise le nom de la classe précédé
de ~ :
On peut aussi surcharger << (pour cout) :
Ces deux surcharges sont globales. Mais on peut également les définir
comme fonctions membres :
f) classes virtuelles
Soient : une classe A, deux classes B et C dérivant de A, une classe
D dérivant de B et C. Nous aurons dans D deux instances de A (qui
peuvent être différentes). Mais si une seule instance de A
suffisait, il suffit de les déclarer :
Le constructeur de D appellera une seule fois celui de A
g) polymorphisme
Si plusieurs classes (point, ligne, segment) possèdent des méthodes
de même signature (écriture similaire du prototype), on peut
éviter de réécrire des fonctions dont le contenu serait
identique mais d'appliquant à des objets différents (déplacer=éteindre+ajouter+allumer
pout tous mes objets). On peut pour cela utiliser les fonctions virtuelles
(dynamiques : le choix de la fonction a utiliser est déterminée
à l'exécution) ou les fonctions templates (statiques : le
choix des fonctions est fait à la compilation). Voyez l'exemple
complet.
5) EXEMPLE COMPLET (commenté)
----------- La bibliothèque graphique pour Tubo C (DOS) -
Graphiq0.cpp -----------