Vous êtes sur la page 1sur 12

Chapitre 4

du C C++
Historique C++ versus C & Java Types de donnes - dfinition / dclaration Les fonctions Structuration dun programme C++

au C++

Rappel

Objets du logiciel

Algorithme du logiciel (scnario)

Objets du langage

Systme dexploitation

Langage

Comment logique ?

Comment physique ?

Conception

Code

Bibliothques Modle logique Modle physique


2

au C++

Historique C++
1980 au laboratoire AT&T Bell (Stroustrup) Les classes introduites pr-compilateur de C 1985 : 1re version publique 1995-1997 : rvision standard ANSI
soit pour amliorer les caractristiques de la norme ANSI, soit pour prparer le terrain pour les aspects Objets

Disponible sur toutes les plateformes. Il est distribu en


logiciel :
domaine publique (environnement GNU), plusieurs socits commerciales (Microsoft, Borland, Zortech, ).

au C++

C++ versus C
Principal avantage : compatibilit C/C++
mme syntaxe de base code C "propre" directement compilable en C++ facilit d'intgration de fichiers C++ et C dans un mme programme ( langage hybride)

Principal inconvnient : compatibilit C/C++


C++ hrite de certains choix ennuyeux du langage C !

au C++

C++ versus Java


Ressemblances
syntaxe en partie similaire fonctionnalits objet de mme nature

Diffrences
gestion mmoire (pas de garbage collecting, etc.) hritage multiple redfinition des oprateurs templates et STL pas de threads dans le langage (mais bibliothques ad hoc) langage compil (et ... plus rapide !)

au C++

Les commentaires
.... /* je suis un super commentaire en C et je tends sur plusieurs lignes printf("Gros commentaire"); */ .... // je suis un super commentaire C++ sur une ligne ....

// n'appartient qu'au C++

au C++

Types de donnes
C++ introduit le type bool pour palier cette carence en C. Il s'accompagne des mot-cls true et false.
bool flag=true;

Dfinition implicite du type, sans avoir utiliser typedef :


enum values {1,2,3,4}; enum couleur { rouge=1, noir = 3, blanc =7}; // Ceci est aussi valable pour : union et struct

au C++

Les conversions de type


En C, lorsqu'on souhaitait raliser la conversion d'une expression dans un type donn, on utilisait la syntaxe suivante :
(type)expression (version C)

Mais cette approche n'est pas cohrente avec le formalisme fonctionnel C'est rpar dans le C++ et la mme conversion s'crit dsormais de la manire suivante :
type(expression) (version C++)

noter qu'on peut aussi se scuriser en faisant un mixage des deux approches :
(type)(expression) (version mixte) 8

au C++

Dlocalisation des dclarations


C
int i=5, itmp; int j=2; ... for (itmp=0; itmp<10; itmp++) { j+=itmp; C++ } int i=5; ... int j=2; for (int i=0; i<10; i++) { j+=i; // on est sur le i local } // i vaut 5 ! // j vaut 47 !

i variable de parcours temporaire


9

au C++

Les constantes
Le mot-cl const remplace la directive du prprocesseur #define constante type mme les pointeurs !
/* quelques constantes classiques */ const int PI=12; const char MOI[]="Etudiant II2"; const int MAX=100; ....
/* constantes classiques en C */ #define PI 12 #define MOI "Etudiant II2" #define MAX 100

int tab[MAX]; /* tableau statique de 100 entiers */ char c; 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 */ ....

10

au C++

La rfrence (alias)
On peut dsormais dfinir des variables rfrence, c'est--dire des variables que l'on peut identifier d'autres variables.

int n,m ; int& i=n ; i=m;

// i variable rfrence sur n

// Signifie n=m et // non que i devient une rfrence sur m !

11

au C++

Le passage par rfrence


L'un des dfauts les plus irritants en C rside dans l'impossibilit de raliser un passage de paramtres par rfrence. Le C++ palie cette lacune en introduisant (enfin !) le passage de paramtre par rfrence. version C
void Swap (int * a, int * b) { int tmp=*a; *a=*b; *b=tmp; } .... int i=2, j=4; Swap (&i, &j); /* i vaut 4 et j vaut 2 */ ....

version C++
void Swap (int & a, int & b) { int tmp=a; a=b; b=tmp; } .... int i=2, j=4; Swap (i, j); // i vaut 4 et j vaut 2 ....

12

au C++

Typage et prototypage obligatoire des fonctions


La dclaration des arguments se fait toujours lintrieur des parenthses. Le typage des fonctions est obligatoires, et possde un sens fort : on ne peut pas retourner une valeur si la fonction a t dclare void, et rciproquement, on doit retourner une valeur dans le cas contraire. Exemple : void f(int, char*) ; void f(int i, char* c) ; int f(int i) { return une valeur entire }; . f(); // f ne peut pas tre appele avec des arguments. . f() ; // f peut tre appele avec un nombre quelconque darguments.

13

au C++

La surcharge des fonctions


Elle permet de dclarer puis dfinir des fonctions ayant un nom identique mais une signature diffrente (reprise de la capacit dALGOL). Attention toutefois : le type de retour ne fait pas partie de la signature. La surcharge doit par consquent prserver le type de retour, elle ne touche qu'aux paramtres. Exemple :
int f(int gros_entier); int f(double gros_reel); int f(const char gros_nom[], bool gros_flag);

Remarques : La surcharge est une forme faible de polymorphisme. elle est surtout utilise dans les classes, pour dfinir plusieurs variantes du constructeur la surcharge peut se rvler particulirement intressante lorsqu'on souhaite viter des conversions de types indsirables lors du passage des paramtres.

14

au C++

Les paramtres avec valeur par dfaut


C++ procure cette facilit en nous autorisant fournir une valeur par dfaut aux paramtres. Il existe cependant une restriction importante dans la mise en uvre des paramtres par dfaut:
partir du moment o un paramtre possde une valeur par dfaut, tous les paramtre suivant doivent galement en possder une. En effet, dans le cas contraire, cela pourrait poser des problmes pour le compilateur :
int f(int a=0, int b, int c=0); .... En revanche, l'exemple suivant est valide : i=f(1, 2, 3); // OK void f(double x, double y=0.0, double z=0.0); j=f(4); // toujours OK ~ f(0, 4, 0) .... k=f(5, 6); f(a); // OK ~ f(a, 0.0, 0.0) // argh ! ~ f(5, 6, 0) f(a, b); // OK ~ f(a, b, 0.0) f(a, b, c); // OK ~ f(a, b, c) // ou f(0, 5, 6) ? // respect de la contigut // non respect de la contigit

15

au C++

Les paramtres anonymes


C++ permet de dclarer des paramtres anonymes, c'est--dire des paramtres dont seul le type est spcifi dans la signature.
Exemple:
int main (int argc, char *argv[ ]) { .... } int main (int, char **) { .... }

version C (nommage obligatoire)

version C++ (paramtres anonymes)

16

au C++

Les fonction inline


En C, lorsqu'on souhaite factoriser un morceau de code sans pour autant crer une fonction, on a la possibilit de dfinir une macro. macro fonction (excutables plus volumineux !) Les macros peuvent entraner des effets de bords dsastreux lorsqu'elles sont mal dfinies. D'autre part, il n'y a aucun contrle sur le type des arguments. En C++, l'introduction du mot-cl inline va nous permettre d'viter le recours aux macros. le compilateur se charge de la convertir en macro On a la scurit d'une fonction et la rapidit d'une macro.
#define MAX(a,b) (((a)>=(b))? (a) : (b)) inline int Max (int a, int b) {return (a>=b) ? a : b);}

17

au C++

Structuration dun programme C++


Un programme C++ est constitu :
une fonction main (point dentre) de classes rparties dans plusieurs fichiers (.cpp/.h) ( la Java) (ventuellement) de fonctions et variables globales (.c/.h)( la C)

Chaque fichier peut comprendre :


un nombre arbitraire de classes (si a a un sens ...)

Pas de packages, mais des namespaces

18

au C++

Les inclusions des bibliothques


La manire classique d'inclure les fichiers d'en-tte des bibliothques du C tait la suivante :
#include <stdio.h> #include <math.h> #include <string.h>

En C++, il n'est plus ncessaire de spcifier l'extension sur les fichiers d'en-tte standards du C, mais il faut spcifier que c'est un fichier de la librairie C en ajoutant le caractre 'c' devant
#include <cstdio> #include <cmath>

Lorsquil sagit dune bibliothque C++, pas dextension


#include <iostream>

19

Dfinition des mthodes


Un fichier source constituant la dclaration de la classe (interface);
#ifndef ID_classe #define ID_classe class A { ... // dclaration }; #endif

Un fichier source correspondant sa dfinition (implmentation).


#include "nomclasse.h" [type] nomclasse::methode1([type]*) { ...}

Ch. 4 - Du C au C++

20

au C++

Les espaces de nommage


En C, il tait difficile de faire cohabiter plusieurs versions d'une mme structure de donnes.
Pour viter le conflit de noms, on tait oblig de modifier les noms de chaque structure

C++ propose un moyen simple de rsoudre ce problme : les espaces de nommage.


Les espaces de nommage permettent de dfinir une unit cohrente dans laquelle regrouper les dclarations des diffrents objets (types, constantes, variables, fonctions). Les identificateurs prsents dans l'espace de nommage possdent alors une porte qui leur est spcifique.

21

au C++

Exemple : espaces de nommage


dfinition/utilisation du namespace namespace A { typedef unsigned int B; .... } .... A::B i; // une variable de type B diffrenciation par les namespaces
namespace Version1 { class Pile { ... }; } namespace Version2 { class Pile { ... }; } .... void main () { Version1::Pile p1; Version2::Pile p2; .... }

spcifier l'espace de nommage par dfaut l'aide du mot-cl using. using namespace A; B i;
22

23

Questions/Rponses