17
1 Département Informatique Département Informatique Programmation objet Cours n°1 Rappels de première année Conseils d'implémentation C++ Espaces de noms Allocation dynamique

Département Informatique Programmation objet

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Département Informatique Programmation objet

1

Département InformatiqueDépartement Informatique Programmation objetCours n°1

Rappels de première annéeConseils d'implémentation C++Espaces de nomsAllocation dynamique

Page 2: Département Informatique Programmation objet

2

Département InformatiqueDépartement InformatiqueRappels de première année

Principes de la programmation objet

➢Notion d'encapsulation, protection des données➢Données, attributs, fonctions membres➢Exemple d'implémentation en C++

Construction et destruction d'un objet

➢Besoin d'assurer la cohérence de l'objet➢Exemple avec prise de ressources➢Exemple d'implémentation en C++

Page 3: Département Informatique Programmation objet

3

Département InformatiqueDépartement Informatique

Allocation dynamique de mémoire➢Différence entre allocation statique et dynamique➢Rappels sur la notion de pointeur, valeur, référence➢Sémantiques➢Risques de fuites mémoire➢Exemple d'implémentation en C++➢Existence de "ramasse-miettes" (java, C#...)

Page 4: Département Informatique Programmation objet

4

Département InformatiqueDépartement InformatiqueConseils d'implémentation en C++

Structure d'un code source C++

Plusieurs unités de compilation (fichiers .cpp)

De nombreux fichiers d'en-tête (fichiers .h)

Bibliothèques statiques (.obj, .lib) et dynamiques

Rôle de l'éditeur de liens

Page 5: Département Informatique Programmation objet

5

Département InformatiqueDépartement Informatique

Un programme écrit en C++ =

plusieurs unités de compilationune unité contenant la fonction mainun certain nombre de bibliothèques

Un programme écrit en C++ peut utiliser le paradigme objet ou non

Il peut contenir des classes, mais aussi des fonctions globales.

Par souci de lisibilité, de simplicité, de facilité de maintenance,

On choisira plutôt de multiplier de petites unités de compilation, avec une répartition logique des classes et/ou fonctions.

Page 6: Département Informatique Programmation objet

6

Département InformatiqueDépartement InformatiqueConseils sur l'écriture d'une classe C++

Pour chaque classe du programme, même minime :une seule unité de compilation, portant le nom de la classe.

La déclaration de la classe sera écrite dans un fichier d'en-tête (.h), contenant éventuellement quelques petites fonctions en ligne.

Le corps des fonctions membres de cette classe, ainsi qu' éventuellement les fonctions globales associées se trouveradans un fichier source .cpp .

Page 7: Département Informatique Programmation objet

7

Département InformatiqueDépartement Informatique Exemple : écriture d'une classe complexe

Nom de la classe : complexeNom de l'unité : complexe (fichiers complexe.h et complexe.cpp)Placement dans un espace de nom "iut"

Données : parties réelle et imaginaire, type double, privéesFonctions : calcul du module, de l'argument, addition de 2 complexes

Page 8: Département Informatique Programmation objet

8

Département InformatiqueDépartement Informatique Fichier d'en-tête (complexe.h) :

#ifndef complexe_h#define complexe_h // protection contre inclusions multiplesnamespace iut {class complexe{

double reel, imag;public:

complexe(double r=0, double i=0):reel(r),imag(i){}double Module() const;double Arg() const;complexe& operator+=(const complexe&);

};

extern complexe operator+(const complexe&, const complexe&);} // fin de l'espace de nommage#endif

Page 9: Département Informatique Programmation objet

9

Département InformatiqueDépartement Informatique Fichier source (complexe.cpp)

#include <cmath> // pour sqrt et atan#include "complexe.h"

namespace iut {

double complexe::Module() const{

return std::sqrt(reel*reel+imag*imag);}

double complexe::Arg() const{

return std::atan(reel/imag);}

Page 10: Département Informatique Programmation objet

10

Département InformatiqueDépartement Informatique

complexe& complexe::operator+=(const complexe& z){

reel += z.reel;imag += z.imag;return *this;

}

complexe operator+(const complexe& z1, const complexe& z2){

complexe z(z1);z+=z2;return z;

}

}// fin de l'espace de noms

Page 11: Département Informatique Programmation objet

11

Département InformatiqueDépartement Informatique Conseils généraux sur écriture programme C++

Une unité de compilation par classeUne unité pour la fonction main et elle seuleUne unité pour les éventuelles variables et fonctions globalesUne unité au moins pour la gestion des erreursUtiliser les espaces de nomsEviter l'utilisation abusive des directives usingPréférer le paradigme objet au paradigme procéduralPassage de paramètres par référence plutôt que par valeurUtiliser le mot-clé const si besoinEviter les macros (#define...)Ne pas inclure de fichier d'en-tête inutileProtéger les en-têtes contre les inclusions multiplesPréférer la clarté à la concision

Page 12: Département Informatique Programmation objet

12

Département InformatiqueDépartement Informatique Espaces de noms

Concept plus général que celui d'une classe

Permet de rassembler plusieurs objets, fonctions ou variables ayantun lien logique ou fonctionnel entre elles.

Mot clé C++ : namespace.

namespace X { int i;}La variable i n'est visible qu'à l'intérieur de l'espace X,à moins d'être qualifié par le nom de celui-ci :

i = 3; // erreur à la compilation, i inconnuX::i = 3; // ok, i étant défini dans X

Page 13: Département Informatique Programmation objet

13

Département InformatiqueDépartement Informatique

Un espace de nom est ouvert.

namespace A { int i; }int k;namespace A {int k;}

L'espace A contient les variablesi et k.

Ici, l'espace global contient la variable k.

Attention : k et A::k sont deux variables différentes !!

Les espaces de noms permettent une structure plus propre des programmes,évitent les conflits de noms.

L'écriture et la lecture du programme sont par contre moins aisés.

Page 14: Département Informatique Programmation objet

14

Département InformatiqueDépartement Informatique La directive using

On peut rendre visible tout le contenu d'un espace de nom grâce àla directive C++ using.

namespace A {int i;}i=3; // erreur, i non visibleA::i = 3; // okusing namespace A; // rend visible tout l'espace Ai = 3; // ok, utilise A::i

Attention : l'emploi de cette directive peut conduire à des conflits.int i; namespace X {int i;}i=3; // ok, le i globalX::i = 5; // ok, le i dans Xusing namespace X;i=10; // erreur : i global ou X::i ?

Page 15: Département Informatique Programmation objet

15

Département InformatiqueDépartement Informatique

Il est fortement déconseillé d'utiliser la directive using dans unfichier d'en-tête (.h)

Malgré la simplification d'écriture qui en résulte, l'utilisation de usingest risquée et doit être limitée.

On peut rendre une partie seulement d'un espace à l'aide de using :

#include <iostream>using std::cout; // ne rend visible que coutint x;cout<<"Et ca marche !";cin>>x; // erreur, cin non visiblestd::cin>>x; // ok

Page 16: Département Informatique Programmation objet

16

Département InformatiqueDépartement Informatique

Les espaces de nommage peuvent être imbriqués :

namespace A{

namespace B{

namespace C{

int i;}int i;

}int i;

}int i;

Définition de 4 variables i :::i (ou i)A::iA::B::iA::B::C::i

Page 17: Département Informatique Programmation objet

17

Département InformatiqueDépartement Informatique

Prochain cours :

LES EXCEPTIONS

A la semaine prochaine !