Upload
others
View
8
Download
1
Embed Size (px)
Citation preview
C++ 2019-20
PLANNING6 x 4h
REFERENCECours en PDF sur www.hochart.fr/CPP
2
CHARGEModule de 24h.
SOURCESC++, The complete reference - 4th edition
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
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
Nouveautés
▫ header iostream▫ namespace std▫ main() sans paramètres▫ opérateurs input et output▫ type bool▫ nouveaux keywords
5
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
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
Classes - Exemple de méthode
void stack::push(int i) { if(tos==SIZE)
{ cout << "Stack is full.\n"; return; } stck[tos] = i; tos++;}
8
Classes
▫ :: Scope resolution operator
Invocation:stack stack1, stack2; stack1.init();
9
Classes - Accès
▫ public▫ private▫ protected
10
Changement de spec à la déclaration
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
Fonctions amies
▫ Peut être une méthode d’une autre classe
▫ Autorise l’accès aux attributs private
12
Classes amies
13
Fonctions inline
14
▫ Optimisation C99 (overhead d’appel, stack)
▫ Inconvénients: recompilation si changement
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
Pointeurs sur fonction surchargées
▫ Si plusieurs fonctions surchargent, nécessité de prototyper le pointeur:
16
Paramètres par défaut
17
Ambiguïté
▫ Lorsque le compilateur doit faire un choix et n’y arrive pas
▫ Fonctions surchargées▫ Conversions automatiques de types
18
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; }
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
Surcharge des opérateurs
21
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
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();};
Héritage
24
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
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(){};};
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
Ordre d’appel des constructeurs / destructeurs
28
Ordre d’appel des constructeurs / destructeurs
29
Constructeurs / destructeurs
▫ Un constructeur peut avoir des paramètres
30
Pointeurs sur objets
▫ Comme en C
31
Pointeur this
▫ Chaque fonction membre à accès à sa classe (son objet) avec un pointeur this
32
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
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
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
Variables statiques
L’initialisation a ici un sens “A la compilation” (Inhabituel)
36
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
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
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
Tableaux d’objets
40
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
Variante nothrow
▫ Renvoyer null plutôt qu’une exception
p = new(nothrow) int[32]; // use nothrow option if(!p) { cout << "Allocation failure.\n";
42
Surcharger new et delete
Pour utiliser une méthode d’allocation spéciale
43
Surcharger new et delete
Possible également de surcharger [], (), ->, ,
44
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
Fonctions virtuelles
46
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
Fonctions virtuelles pures
48
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
Quizz
▫ A quoi servent les fonctions virtuelles puisqu’on peut surcharger les fonctions de la classe mère dans les classes filles?
50
Stackoverflow
51
Stackoverflow
52
Stackoverflow
53