Programmation C++ BTS CIEL Informatique et Réseaux Lycée Louis Rascol, Albi
Release : v1.0 (23.09.23) joris.serrand@rascol.net Site Web : ciel-ir-rascol.github.io GitHub : ciel-ir-rascol
Release : v1.0 (23.09.23)
▶︎ Gestion de compte en banque
// Fonction permettant de retirer de l'argent bool retirer(float* solde, float montant){ if(*solde >= montant){ *solde -= montant; return true; } else return false; } // Fonction permettant de créditer de l'argent bool crediter(float* solde, float montant){ *solde += montant; return true; }
// Programme principal int main(){ string nomCompte {"SquirrelBank"}; float solde{1679.22}, somme{0}; cout << "Saisissez la somme à retirer : "; cin >> somme; if (retirer(&solde, somme)) cout << "Somme retirée !"; else cout << "Solde insuffisant !"; } return 0;
Trop de choses à modifier quand on modifie les données !
class Compte{ private: string nom; int solde; public: bool retirer(float montant){ if(solde >= montant){ solde -= montant; return true; } else return false; } bool crediter(float montant){ solde += montant; return true; } };
Compte
Client
numeroCompte
nbMouvements
cloturer()
ajouterCB()
▶︎ En OOP il suffit de modifier la classe et tout s'adapte
Depuis le début on parle que de classes, mais ils sont où les objets ??!!
▶︎ Un objet est l'instance d'un classe
int main(){ // J’instancie la classe Compte Compte squirrelBank; return 0; }
Ici, je viens de créer un objet squirrelBank de la classe Compte implémentée précédemment.
squirrelBank
▶︎ Syntaxe d'une déclaration de classe en C++
class Nom_de_la_classe { // déclarations; };
Par convention, le nom d'une classe doit toujours commencer par une majuscule Ne pas oublier le point-virgule ; à la fin de la déclaration
;
▶︎ Déclaration de la classe Personnage
Personnage
class Personnage{ // Attributs string nom; int vie; int attaque; int defense; // Méthodes // Nous donnons dans cet ex, // juste la déclaration des méthodes void subirDegats(int degats); void attaquer(Personnage& cible); };
▶︎ Instanciation de la classe Personnage
int main(){ Personnage arthur; // Instanciation de Personnage en arthur Personnage merlin; // Instanciation de Personnage en merlin // Pointeur sur un objet dans le Heap Personnage* perceval = new Personnage(); // Supression de l'objet dans le Heap delete perceval; }
▶︎ Pour les objets : Opérateur point : .
.
// Modification du contenu d'un attribut arthur.vie = 100; // Appel de la méthode subirDégats() arthur.subirDegats(10);
Par défaut les attributs d'une classe sont privés, il faut mettre les attributs en public si on veut y acceder, mais ce n'est pas conseillé !
public
▶︎ Pour les pointeurs sur des objets : Opérateur flèche : ->
->
// Déclaration d'un pointeur sur un objet dans le Heap Personnage* lancelot = new Personnage(); // Accès à l'attribut vie (s'il est public) lancelot->vie = 95; // Appel de la méthode attaquer() sur l'objet arthur lancelot->attaquer(arthur);
▶︎ Modificateurs d'accès
private
protected
▶︎ Exemple avec la classe Personnage
class Personnage{ // Attributs en private private: string nom; int vie; int attaque; int defense; // Méthodes en public public: // Nous donnons dans cet ex, juste la déclaration des méthodes void subirDegats(int degats); void attaquer(Personnage& cible); };
Nom_classe::nom_methode
▶︎ Exemple d'implémentation avec la classe Personnage
class Personnage{ private: string nom; int vie; int attaque; int defense; public: // Méthode subirDegats() // Déclaration + Implémentation void subirDegats(int degats) { int degatsInfliges = degats - defense; if (degatsInfliges > 0) { vie -= degatsInfliges; } } };
Ici subirDegats() permet de diminuer la vie du personnage si degats-defense > 0
subirDegats()
vie
degats-defense > 0
subirDegats() a librement accès à vie et à defense
defense
Les méthodes ont accès aux attributs car elles sont membres de la classe.
▶︎ Implémentation, toujours avec la classe Personnage
class Personnage{ private: string nom; int vie; int attaque; int defense; public: // Déclaration Méthode subirDegats() void subirDegats(int degats); };
// Dans le même fichier .cpp // Implémentation en dehors de la classe void Personnage::subirDegats(int degats) { int degatsInfliges = degats - defense; if (degatsInfliges > 0) { vie -= degatsInfliges; } }
On utilise le scope resolution operator :: pour spécifier la classe de la méthode
::
▶︎ Fichier Personnage.h
Personnage.h
#ifndef PERSONNAGE_H // Include Guard #define PERSONNAGE_H class Personnage{ private: string nom; int vie; int attaque; int defense; public: // Déclaration Méthode subirDegats() void subirDegats(int degats); }; #endif // PERSONNAGE_H
Mais à quoi servent les 2 premieres lignes ??!!
▶︎ C'est l'Include Guard, indispensable ! Si ce fichier est inclus dans plus d'un fichier .cpp alors le compilateur verra la déclaration de la classe Personnage plus d'une fois et lèvera une erreur pour des déclarations dupliquées.
▶︎ Fichier Personnage.cpp
Personnage.cpp
#include "Personnage.h" // Inclusion du Header File void Personnage::subirDegats(int degats) { int degatsInfliges = degats - defense; if (degatsInfliges > 0) { vie -= degatsInfliges; } }
Il y a une Différence entre #include <patati> et #include "patati.h", en effet dans le premier cas on cherche à inclure des systems headers files, dans le second on cherche à inclure des headers files du projet.
#include <patati>
#include "patati.h"
▶︎ Fichier programme principal main.cpp
main.cpp
#include "Personnage.h" // Include Header File classe Personnage int main(){ Personnage merlin; // Instanciation de la classe Personnage ... return 0; }
Dans le fichier .cpp du programme principal, il faut toujours inclure les headers files, ici : Personnage.h et jamais les .cpp, Personnage.cpp.