53
C++ Master 1 III Julien Hochart – [email protected] 2 – Basics + objet avancé

C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

  • Upload
    others

  • View
    8

  • Download
    1

Embed Size (px)

Citation preview

Page 1: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

C++

Master 1 IIIJulien Hochart – [email protected]

2 – Basics + objet avancé

Page 2: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

C++ 2019-20

PLANNING6 x 4h

REFERENCECours en PDF sur www.hochart.fr/CPP

2

CHARGEModule de 24h.

SOURCESC++, The complete reference - 4th edition

Page 3: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Concepts

▫ Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

▫ Polymorphisme: Une interface, plusieurs méthodes▫Exemple: un thermostat▫Fonctions push(), pop()

▫ Héritage: Acquérir les propriétés d’autres objets

3

Page 4: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Hello world

#include <iostream>using namespace std;

int main(int argc, char * argv[]) {int i; cout << "This is output.\n"; // this is a single line comment /* you can still use C style comments */ // input a number using >> cout << "Enter a number: "; cin >> i; // now, output a number using << cout << i << " squared is " << i*i << "\n";return 0; }4

Page 5: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Nouveautés

▫ header iostream▫ namespace std▫ main() sans paramètres▫ opérateurs input et output▫ type bool▫ nouveaux keywords

5

Page 6: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Classes - Exemple élémentaire

#define SIZE 100

// This creates the class stack. class stack { int stck[SIZE]; int tos;

public: void init(); void push(int i); int pop();};

6

Page 7: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Classes

▫ Private par défaut = on ne peut pas y accéder par une fonction qui n’est pas membre de la classe

▫ Similaire à la notion de struct en C▫ +Attributs, méthodes, contrôle d’accès

7

Page 8: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Classes - Exemple de méthode

void stack::push(int i) { if(tos==SIZE)

{ cout << "Stack is full.\n"; return; } stck[tos] = i; tos++;}

8

Page 9: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Classes

▫ :: Scope resolution operator

Invocation:stack stack1, stack2; stack1.init();

9

Page 10: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Classes - Accès

▫ public▫ private▫ protected

10

Changement de spec à la déclaration

Page 11: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Accessors

▫ Tout ce qui a connaissance de la classe peut accéder à ses attributs publiques

▫ Seuls les descendants de la classe peuvent accéder aux attributs protégés

▫ Rien sauf la classe elle-même ne peut accéder aux attributs privés

11

Page 12: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Fonctions amies

▫ Peut être une méthode d’une autre classe

▫ Autorise l’accès aux attributs private

12

Page 13: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Classes amies

13

Page 14: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Fonctions inline

14

▫ Optimisation C99 (overhead d’appel, stack)

▫ Inconvénients: recompilation si changement

Page 15: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Surcharge des fonctions

▫ Permet de faire du polymorphisme▫ Plusieurs fonctions peuvent partager le même nom

à condition que leur signature soit différente▫ La signature ici concerne les arguments, un

type de retour différent ne suffit pas

15

Page 16: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Pointeurs sur fonction surchargées

▫ Si plusieurs fonctions surchargent, nécessité de prototyper le pointeur:

16

Page 17: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Paramètres par défaut

17

Page 18: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Ambiguïté

▫ Lorsque le compilateur doit faire un choix et n’y arrive pas

▫ Fonctions surchargées▫ Conversions automatiques de types

18

Page 19: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Surcharge des fonctions

#include <iostream> using namespace std; // abs is overloaded three ways int abs(int i); double abs(double d); long abs(long l);

int main() { cout << abs(-10) << "\n"; cout << abs(-11.0) << "\n"; cout << abs(-9L) << "\n"; return 0;}

19

int abs(int i) { cout << "Using integer abs()\n"; return i<0 ? -i : i; } double abs(double d) { cout << "Using double abs()\n"; return d<0.0 ? -d : d; } long abs(long l) { cout << "Using long abs()\n"; return l<0 ? -l : l; }

Page 20: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Surcharge des opérateurs

▫ Définir des opérateurs (+, *, …) pour une classe

▫ Ici, c’est l’objet de gauche qui génère l’appel à la fonction

20

Page 21: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Surcharge des opérateurs

21

Page 22: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Surcharge des opérateurs

▫ Opérateur d’incrément postfixé▫ operator++( )

▫ Opérateur d’incrément préfixé▫ operator++(int x) (avec x=0)

. : : .* ? ne peuvent pas être surchargés

22

Page 23: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Héritage

class building { int rooms; int floors; int area;

public: void set_rooms(int num); int get_rooms(); void set_floors(int num); int get_floors(); void set_area(int num); int get_area();};

23

// house is derived from building class house : public building { int bedrooms; int baths;

public: void set_bedrooms(int num); int get_bedrooms(); void set_baths(int num); int get_baths();};

Page 24: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Héritage

24

Page 25: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Héritage multiple

▫ Un objet qui dérive de plusieurs base classes▫ Les constructeurs sont appelés dans l’ordre de la déclaration d’héritage

▫ Les destructeurs sont appelés dans l’ordre inverse

25

Page 26: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Héritage multiple

▫ Le problème du diamant▫ Le constructeur de la classe mère sera

appelé 2 fois▫ La classe TA héritera de 2 copies des

attributs de la classe Person▫ Si une méthode appelée est surchargée par

les 2 classes intermédiaires, ca ne compilera pas

▫ → Virtual inheritance: La partie Person héritée chez Student et Faculty sera la même instance

▫ → Mécanique de pointers et offsets masquée26

struct Mammal : virtual Animal { virtual void breathe(){};};

Page 27: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Constructeurs / destructeurs

▫ Un constructeur est une fonction spéciale qui a le même nom que la classe

▫ Appelée à l’instanciation pour effectuer des initialisation diverses▫ Appelé qu’une seule fois pour les variables statiques ou globales▫ Un destructeur est une fonction spéciale qui a le même nom que la

classe précédé d’une tilda. Le destructeur est appelé quand:▫ Un objet sur la stack arrive en fin de vie▫ Un objet sur le heap est delete() explicitement (pas de garbage collection en C++)

▫ Pas besoin d’appeler new() pour appeler le constructeur▫ “Ne jamais throw() d’exception dans un destructeur”: dangereux pour

plusieurs raisons27

Page 28: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Ordre d’appel des constructeurs / destructeurs

28

Page 29: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Ordre d’appel des constructeurs / destructeurs

29

Page 30: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Constructeurs / destructeurs

▫ Un constructeur peut avoir des paramètres

30

Page 31: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Pointeurs sur objets

▫ Comme en C

31

Page 32: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Pointeur this

▫ Chaque fonction membre à accès à sa classe (son objet) avec un pointeur this

32

Page 33: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Références

▫ Comme en C▫ Passage d’une adresse

mémoire au lieu d’un objet à une fonction (pas de copie)

▫ Une référence peut être vue comme un pointeur const, sans arithmétique

33

Page 34: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Variables globales

▫ Scope: partout dans le module (.o)

▫ Keyword extern pour qu’elle soit accessible par les autres modules (fichiers)

▫ Init a 0 par défaut

34

Page 35: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Variables statiques

▫ Une copie en mémoire, partagée, qui va garder sa valeur au travers de différentes invocations

▫ Pas forcément globale▫ Pas allouée sur la pile, mais dans le segment bss▫ Init a 0 par défaut

35

Page 36: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Variables statiques

L’initialisation a ici un sens “A la compilation” (Inhabituel)

36

Page 37: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Méthodes statiques

▫ Méthode indépendante d’un objet en particulier▫ Peut être appelée même si aucun objet n’existe▫ Ne peuvent pas appeler d’autres méthodes non

statiques▫ Pas d’accès à this▫ Ne peuvent pas accéder aux attributs non statiques▫ → Galère si mal utilisé

37

Page 38: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Fonctions retournant un objet

▫ Une fonction peut retourner un objet▫ Dans ce cas, une copie de l’objet est créee▫ Cette copie est détruite après le return de la

fonction appelante. Attention aux effets de bord

38

Page 39: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Assignation d’objets

▫ Si les objets sont du même type:▫ o1=o2

▫ Copie les données (memberwise copy)▫ Peut être surchargée pour utiliser un autre type

de copie (bit a bit)

39

Page 40: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Tableaux d’objets

40

Page 41: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Allocation dynamique

▫ New alloue la mémoire nécessaire et retourne un pointeur au début de l’objet

▫ New() peut échouer, à tester (try catch)▫ Delete libère la mémoire allouée par new▫ Toujours possible d’utiliser malloc et free mais non

conseillé

41

Page 42: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Variante nothrow

▫ Renvoyer null plutôt qu’une exception

p = new(nothrow) int[32]; // use nothrow option if(!p) { cout << "Allocation failure.\n";

42

Page 43: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Surcharger new et delete

Pour utiliser une méthode d’allocation spéciale

43

Page 44: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Surcharger new et delete

Possible également de surcharger [], (), ->, ,

44

Page 45: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Fonctions virtuelles

▫ Une fonction virtuelle est une fonction membre déclarée dans la base classe et redéfinie dans une classe dérivée

▫ “One interface, multiple methods”▫ Pointeur sur fonction spécifique résolu au runtime▫ Différent de la surcharge: la signature doit être la

même▫ On peut appeler une fonction virtuelle45

Page 46: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Fonctions virtuelles

46

Page 47: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Fonctions virtuelles pures

▫ Fonction virtuelle qui est déclarée mais non définie dans la base class

▫ = 0▫ Toutes les classes dérivées doivent surcharger

cette fonction▫ Sinon, erreur à la compilation

47

Page 48: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Fonctions virtuelles pures

48

Page 49: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Classes abstraites

▫ Classe qui contient au moins une fonction virtuelle pure

▫ Il n’est pas possible de créer un objet à partir d’une classe abstraite

49

Page 50: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Quizz

▫ A quoi servent les fonctions virtuelles puisqu’on peut surcharger les fonctions de la classe mère dans les classes filles?

50

Page 51: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Stackoverflow

51

Page 52: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Stackoverflow

52

Page 53: C++ 2 - C++ basics et objet avancé.pdf · C++, The complete reference - 4th edition. Concepts Encapsulation: Le code est une boîte noire interne accessible par les interfaces (public/private)

Stackoverflow

53