Académique Documents
Professionnel Documents
Culture Documents
: 2008/2009
ENSI – II2
1- Introduction
Données Espace de problème Résultats
Chapitre 3
du C à C++ Objets du
monde
Algorithme du monde réel Objets de
(scénario)
réel l’application
Introduction
Historique de C++ Représentation du pb Interprétation humaine
par le programmeur des résultats
C++ versus C & Java
Types de données - définition / déclaration
Les fonctions
Concepts du
Structuration d’un programme C++ Données
langage de Algorithme informatique
programmation de sortie
Chap.3 : UML 2
Class Nom {
--------
--------
}
Algorithme Algorithme
Objets du du monde réel du logiciel
Système
scénario) Objets du (scénario) Objets du
monde d’exploitation
logiciel langage
réel
Langage
De quoi parle-t-on ? Comment ‘logique’ ? Comment ‘physique’ ?
Analyse Conception Code
Modèle physique
Bibliothèques
☺ Disponible sur toutes les plateformes. Il est distribué en Principal inconvénient : compatibilité C/C++
logiciel : • C++ hérite de certains choix ennuyeux du langage C !
• domaine publique (environnement GNU),
• plusieurs sociétés commerciales (Microsoft, Borland, Zortech, …).
Les commentaires
C++ versus Java
....
Ressemblances /* je suis un super commentaire en C
et je étends sur plusieurs lignes
• syntaxe en partie similaire printf("Gros commentaire"); */
• fonctionnalités objet de même nature ....
// je suis un super commentaire C++ sur une ligne
Différences ....
• gestion mémoire (pas de garbage collecting, etc.)
• héritage multiple // n'appartient qu'au C++
• redéfinition des opérateurs
• templates et STL
• pas de threads dans le langage (mais bibliothèques ad hoc)
• langage compilé (et ... plus rapide !)
C++ introduit le type bool pour palier à cette carence En C, lorsqu'on souhaitait réaliser la conversion
en C. Il s'accompagne des mot-clés true et false. d'une expression dans un type donné, on utilisait
bool flag=true; la syntaxe suivante :
• (type)expression (version C)
Définition implicite du type, sans avoir à utiliser Mais cette approche n'est pas cohérente avec le
typedef : formalisme fonctionnel
enum values {1,2,3,4};
enum couleur { rouge=1, noir = 3, blanc =7}; C'est réparé dans le C++ et la même conversion
// Ceci est aussi valable pour : union et struct s'écrit désormais de la manière suivante :
• type(expression) (version C++)
À noter qu'on peut aussi se sécuriser en faisant un
mixage des deux approches :
• (type)(expression) (version mixte)
Ch. 4 - Du C au C++ 9 Ch. 4 - Du C au C++ 10
C++
#define MOI "Etudiant II2"
j+=itmp; const char MOI[]="Etudiant II2";
#define MAX 100
} const int MAX=100;
int i=5;
....
...
int j=2;
for (int i=0; i<10; i++) int tab[MAX]; /* tableau statique de 100 entiers */
{ char c;
j+=i; // on est sur le i local const char *p='t'; /* pointeur sur un caractere constant */
} char const *q=&c; /* pointeur constant sur un caractere */
const char const *q=MOI; /* pointeur constant sur un caractere constant */
// i vaut 5 !
....
// j vaut 47 !
On peut désormais définir des variables référence, c'est-à-dire des L'un des défauts les plus irritants en C réside dans l'impossibilité de
variables que l'on peut identifier à d'autres variables. réaliser un passage de paramètres par référence.
Le C++ palie à cette lacune en introduisant (enfin !) le passage de
paramètre par référence.
int n,m ;
int& i=n ; // i variable référence sur n version C version C++
void Swap (int * a, int * b) void Swap (int & a, int & b)
i=m; { {
int tmp=*a; int tmp=a;
*a=*b; a=b;
// Signifie n=m et *b=tmp; b=tmp;
// non que i devient une référence sur m ! } }
.... ....
int i=2, j=4; int i=2, j=4;
Swap (&i, &j); Swap (i, j);
/* i vaut 4 et j vaut 2 */ // i vaut 4 et j vaut 2
.... ....
Typage et prototypage
La surcharge des fonctions
obligatoire des fonctions
La déclaration des arguments se fait toujours à l’intérieur des parenthèses. Le Elle permet de déclarer puis définir des fonctions ayant un nom identique
typage des fonctions est obligatoires, et possède un sens fort : on ne peut pas mais une signature différente (reprise de la capacité d’ALGOL).
retourner une valeur si la fonction a été déclarée void, et réciproquement, on doit Attention toutefois : le type de retour ne fait pas partie de la signature. La
retourner une valeur dans le cas contraire. surcharge doit par conséquent préserver le type de retour, elle ne touche
qu'aux paramètres.
Exemple :
Exemple :
void f(int, char*) ; int f(int gros_entier);
int f(double gros_reel);
void f(int i, char* c) ; int f(const char gros_nom[], bool gros_flag);
int f(int i) { …return ‘une valeur entière’ }; Remarques :
…. La surcharge est une forme faible de polymorphisme.
f(); // f ne peut pas être appelée avec des arguments. • elle est surtout utilisée dans les classes, pour définir plusieurs variantes du
constructeur
…. • la surcharge peut se révéler particulièrement intéressante lorsqu'on souhaite éviter
f(…) ; // f peut être appelée avec un nombre quelconque d’arguments. des conversions de types indésirables lors du passage des paramètres.