Infoal Compressed
Infoal Compressed
Infoal Compressed
Séance 4
3
INFO 9-10
Séance 4
LES CLASSES
Points abordés :
●
Déclaration d’une classe.
●
Encapsulation et indicateurs
de visibilité.
●
Surcharge de méthodes.
●
Fichier d’entête.
●
Implantation de la classe.
●
Fichier de corps.
●
Instanciation d’une classe.
●
Accès aux membres d’une
classes.
●
Exemple : la classe Position.
Les classes Séance 4
Une classe est déclarée grâce au mot clé class. Elle peut
s’effectuer de deux manières :
Simplement marquer
class NomDeLaClasse;
On déclare simplement l’existence d’une classe et la
description de ses membres sera faite un peu plus loin.
Ecrire
class NomDeLaClasse { … };
On déclare l’existence de la classe et on décrit (entre les
accolades) les membres qui la composent.
Les classes Séance 4
Attributs
class HeroDuJeu
{
int nombreDePointsDeVie;
bool invincible;
void seDeplacer (int direction);
Position getPosition ();
};
Méthodes
Les classes Séance 4
Par défaut, dans une classe les membres sont privés, alors que
dans une struct les membres sont publics (c'est une des principales
différences entre struct et class).
Les classes Séance 4
class nomDeLaClasse
{
private :
// Déclaration des membres privés
public :
// Déclaration des membres publics
};
Les classes Séance 4
Surcharge de méthodes
Principe
Surcharge de méthodes
Exemple de méthodes avec des arguments par défaut
class C
{
private :
public :
Le fichier d’entête
La forme du fichier
class NomDeLaClasse
{
private :
type attribut1;
type attribut2;
public :
Le fichier d’entête
La forme du fichier
Le fichier d’entête
La forme du fichier
Le fichier d’entête
La forme du fichier d’entête
#ifndef _NomDeLaClasse
#define _NomDeLaClasse
class NomDeLaClasse
{
private :
type attribut1;
type attribut2;
public :
Implantation de la classe
Le lien entre la déclaration et l’implantation d’une méthode
Implantation de la classe
L’opérateur de portée
Implantation de la classe
L’opérateur de portée
Le fichier de corps
L’opérateur de portée
#include "nomDeLaClasse.h"
NomDeLaClasse nomDeLaVariable;
On dispose alors d’un objet appelé nomDeLaVariable où tous ses
attributs ont été initialisés à leur valeur par défaut :
0 pour les attributs de type entier ;
0.0 pour les attributs de type flottant ;
false pour les attributs de type bool.
NomDeLaClasse* nomDuPointeurSurLaVariable;
Les objets créés de façon statique n'ont pas besoin d'être détruits, ils
sont automatiquement supprimés lorsque le programme ne fonctionne plus
dans la portée dans laquelle ils ont été définis
NomDeLaClasse nomDeLaVariable;
nomDeLaVariable.attributPublic = valeurs;
nomDeLaVariable.méthode (argument);
Si ce membre est privé, cela provoque une erreur de compilation.
Il est possible d’accéder aux membres publics d’un objet en
utilisant l’opérateur «flêche» pour les objets dynamiques.
NomDeLaClasse* nomDuPointeurSurLaVariable;
nomDuPointeurSurLaVariable->attributPublic = valeurs;
nomDuPointeurSurLaVariable->méthode (argument);
Les classes Séance 4
#include <string>
using namespace std;
#define ABSCISSE 0
#define ORDONNEE 1
class Position
{
private :
int coordonnees [2];
public :
int getCoordonnee (int _type);
void setCoordonnee (int _type, int _valeur);
void incrementerCoordonnee (int _type);
void incrementerCoordonnee (int _type, int _valeur);
void decrementerCoordonnee (int _type);
void decrementerCoordonnee (int _type, int _valeur);
string toString ();
};
#endif
Les classes Séance 4
string Position::toString ()
{
char chaine [50];
sprintf (chaine, "Position (%d,%d)", abscisse, ordonnee);
return *(new string (chaine));
}
Les classes Séance 4
#include <iostream>
using namespace std;
Séance 4
●
Les attributs de type
pointeur.
●
La classe Personne
●
Le constructeur.
●
Le constructeur par
recopie.
●
Le destructeur.
●
L ’opérateur
d’affectation.
La forme canonique de Coplien Séance 4
p=adresse
Objet a
La forme canonique de Coplien Séance 4
p=adresse p=adresse
Objet a Objet b
p=adresse p=adresse
Objet a Objet b
La forme canonique de Coplien Séance 4
Celui-ci est appelé lorsque les objets a et b existent déjà mais que
nous effectuons en cours d’exécution a = b.
La classe Personne
Description du cas d’étude
class Personne
{
private :
char* nom;
public :
Personne ();
Personne (char*);
Personne (const Personne&);
~Personne ();
Personne& operator= (const Personne&);
};
Le constructeur
Le principe
Le constructeur
Le code
Personne::Personne ()
{
nom = (char*) malloc (strlen ("inconnu")+1);
if (nom != NULL)
strcpy (nom, "inconnu");
}
Le destructeur
Le principe et le code
Personne::~Personne ()
{
if (nom != NULL)
free (nom);
}
L’opérateur d’affectation
Le principe et le code
Autres caractéristiques
Points abordés :
●
Le pointeur courant this
●
Opérateur new et delete
●
Les attributs statiques.
●
Les méthodes statiques.
L'objet courant this est en réalité une variable système qui permet
de désigner l'objet courant. Cette variable est passée en tant que
paramètre caché de chaque fonction membre.
Exemple :
class Toto{
private :
int age;
char sexe[16];
public :
void DefineTotoAge(int);
};
L’opérateur new
L’instanciation dynamique d’objet
L’opérateur new
Le passage de paramètre
L’opérateur new
L’utilisation de l’opérateur new avec des types simples
L’opérateur delete
La destruction explicite d’objets
L’opérateur new [ ]
La création de tableaux dynamiques
class A
{
static int compteur;
};
Autres caractéristiques Séance 4
Cet attribut peut être manipulé sans avoir à créer un objet, on peut
donc y accéder de deux manières :
par l’intermédiaire de la classe :
A::compteur = 10;
par l’intermédiaire d’un objet :
A a;
a.compteur=10;
A a;
A b;
a.compteur=10;
b.compteur=20;
// a voit compteur=20
Autres caractéristiques Séance 4
A::A () A::~A ()
{ {
… …
compteur++ compteur--;
} }
class A {
static int compteur;
public :
static int getCompteur();
static void setCompteur(int _compteur);
};
EXERCICE 1 Séance 4
Modificateurs d’accès
EXERCICE 2 Séance 4
Date
Date (suite)
67
INFO 9-10
EXERCICE 3 Séance 4
Date (suite)
Un header possible et le main
Séance 4
EXERCICE 4
votre classe String :
constructeur, destructeur etc ...
En absence d’une classe représentant les chaînes de caractères en C++, vous allez
développer la votre. Enfin, vous allez développer une classe, appelée String (souvenez-
vous que C++ est sensible à la casse), qui, au fur et à mesure des solutions implantées,
ressemblera à une vraie classe, quoique un peu limitée, pour gérer les chaînes.
Commencez par déclarer une classe appelée String qui aura un unique attribut privé : un
tableau de caractères. Implantez les méthodes nécessaires pour avoir cela :
69
INFO 9-10
Séance 4
EXERCICE 4
votre classe String :
constructeur, destructeur etc ...
Implémentez également les méthodes suivantes :
Exemple :
70
INFO 9-10
Séance 4
Séance 4
●
Les classes : déclaration , instanciation
●
La forme canonique de Coplien : constructeur,
destructeur …
●
Autres caractéristiques : this, new, delete, static ...
INFO 9-10 :
Langage C++
Séance 8
Surcharge d'opérateurs,
Template,
exceptions
3
INFO 9-10
●
Les règles de surcharge.
●
L’opérateur d’indexation.
●
Les opérateurs arithmétiques.
●
Les opérateurs relationnels.
●
Les opérateurs de
transtypage.
●
Les opérateurs de redirection.
La surcharge des opérateurs
La surcharge interne :
L’opérateur est une méthode de la classe.
La surcharge externe :
L’opérateur est une fonction amie de la classe.
class Vect
{
double x, y, z;
public :
Vect (double _x=0,
double _y=0,
double _z=0) : x(_x), y(_y), z(_z) {}
void afficher ();
Vect operator+ (const Vect&);
Vect operator* (const Vect&);
friend Vect operator* (const double&, const Vect&);
};
La surcharge des opérateurs
void Vect::afficher ()
{
cout << "(" << x << "," << y;
cout << "," << z << ")" << endl;
}
somme.x = x + arg.x;
somme.y = y + arg.y;
somme.z = z + arg.z;
return somme;
}
La surcharge des opérateurs
return produitVectoriel;
}
return produitParUnScalaire;
}
La surcharge des opérateurs
Ces opérateurs sont déjà implantés pour les types simples mais
on peut naturellement les surcharger pour effectuer des
opérations entre des instances d’une même classe par exemple.
class Vect
{
/* les autres membres de la classes */
return *this;
}
La surcharge des opérateurs
return arg1;
}
La surcharge des opérateurs
Ces opérateurs sont déjà implantés pour les types simples mais
on peut naturellement les surcharger pour effectuer des
comparaisons entre des instances d’une même classe par
exemple.
class Vect
{
/* les autres membres de la classes */
double getNorme ();
friend bool operator== (Vect, Vect);
friend bool operator!= (Vect, Vect);
friend bool operator< (Vect, Vect);
friend bool operator<= (Vect, Vect);
friend bool operator> (Vect, Vect);
friend bool operator>= (Vect, Vect);
};
La surcharge des opérateurs
double Vect::getNorme ()
{
double normeAuCarre = pow (x, 2);
normeAuCarre += pow (y, 2);
normeAuCarre += pow (z, 2);
C++ fournit les opérateurs de redirection << et >> pour écrire vers
les flux de sortie ou lire depuis les flux d’entrée des variables de
type simple comme char, int , double …
int a;
cin >> a;
double b = 20;
cout << "La valeur de b est " << b << endl;
La surcharge des opérateurs
ostream& operator<<(ostream&);
istream& operator>>(istream&);
class Vect
{
/* les autres membres de la classes */
ostream& operator<< (ostream&);
};
La surcharge des opérateurs
return EXIT_SUCCESS;
}
La surcharge des opérateurs
class Droite
{
/* les autres membres de la classes */
friend ostream& operator<< (ostream&, Droite&);
};
La surcharge des opérateurs
return flux;
}
return EXIT_SUCCESS;
… pour constater que l’inversion n’est plus nécessaire.
}
Les templates
Les templates
(ou « patrons » en fançais)
Points abordés :
●
Le principe.
●
La déclaration des
templates
●
Les templates de
fonctions.
●
Les templates de
classes.
●
Instanciation des
templates.
●
Exercice.
Les templates
Le principe
La factorisation des traitements semblables
Le principe
La méta-programmation
Les templates
Les templates
Les templates
Les templates
Les templates
Les templates
Les templates
Les templates
Les templates
●
Le principe.
●
La levée d’une
exception.
●
Le bloc try …
catch.
La gestion des erreurs
Le principe
La gestion des erreurs en langage C
Le principe
Le principe de gestion des erreurs en langage C++
try
{
// Instructions susceptibles de lever des
exceptions
}
catch (int e)
{
// Traitement de l’exception de type int
}
Une section catch se définit grâce au mot clé catch, suivi d’un
argument placé entre parenthèses et correspondant au type
d’objet lancé.
Cet argument est une variable locale à la section catch et il peut
être utilisé par les instructions de cette section.
try
{
// Instructions susceptibles de lever des
exceptions
}
catch (int e)
{
cout << "on a lancé l’erreur numéro" << e << endl;
}
La gestion des erreurs
try
{}
catch (char c)
{}
catch (int i)
{}
catch (E objE)
{}
Séance 8
EXERCICES
(sous code::blocks)
76
INFO 9-10
EXERCICE 1 Séance 8
77
INFO 9-10
Séance 8
EXERCICE 2
Fonction template avec une classe utilisateur
+ surcharge externes d’opérateurs
Réaliser une classe Voiture et une fonction template max
permettant d’obtenir le comportement suivant :
int main()
{
Voiture v1 ("Dacia","Sandero", "7000");
Voiture v2 ("Lamborghini","Veneno",
"3530000");
cout << "Voiture la plus chere :"
<<max(v1,v2)<< endl;
Voiture v3 ("Citroen","Deudeuche", "1000");
v2=v3;
cout << "Voiture la plus chere :"
<<max(v1,v2)<< endl;
return 0;
}
78
INFO 9-10
EXERCICE 3 Séance 8
Classe template
Réaliser une classe template nommée Tableau :
• Utilisant le type paramétré T pour définir un attribut de type
tableau (10 éléments) et pour déclarer 2 fonctions membres
ajouter et renvoyer.
•Une autre méthode NombreElement permettra d’avoir le nombre
élément.
Test :
79
INFO 9-10
EXERCICE 3 Séance 8
Classe template
Modifier votre code pour augmenter la liste d argument du
template en mettant par défaut le nombre d’élément souhaité à
n=10.
80
INFO 9-10
EXERCICE 4 Séance 8
Exception
Modifier le code de l’exercice 5 du premier cours (deboggage de
l’erreur de division) pour que se lance une exception de type string
"Division par zero !" et qu’elle s’affiche dans le catch
81
INFO 9-10