poo_cpp2.pdf

(60 KB) Pobierz
Initialisation des attributs (1)
Initialiser les attributs d’une instance
en leur affectant individuellement une valeur,
après l’instanciation, n’est pas une technique satisfaisante:
a) elle est
fastidieuse,
en particulier lorsque le nombre d’attributs
ou/et d’instances est élevé; par ailleurs, les oublis probables
sont des sources supplémentaires d’erreurs.
b) elle implique que tous les attributs doivent faire partie de l’interface
(i.e. soient
publics),
ce qui est clairement à éviter.
10
Pour respecter le principe d’encapsulation, qui stipule
qu’un objet doit contenir en lui-même tout le matériel nécessaire à
son fonctionnement, il est important de le munir d’un
mécanisme d’initialisation
efficace.
10. Ce défaut peut être atténué par l’utilisation de méthodes spécifiques («accesseurs» (get) et «modificateurs» (set)).
Informatique II
Programmation Orientée Objet (en C++)
– 26 –
Initialisation des attributs (2)
Un moyen simple pour réaliser l’initialisation des attributs
est de définir une méthode dédiée à cette tâche:
class
Rectangle {
public:
unsigned int
hauteur;
unsigned int
largeur;
void
init(const
int h, const int l) {
hauteur
= h;
largeur
= l;
}
... };
Le mécanisme d’initialisation des instances fourni par les langages comme C++
correspond en fait à une systématisation de cette solution,
par le biais de deux types de méthodes particulières:
les
constructeurs:
méthodes responsables de l’initialisation des attributs d’une instance (i.e. réalisant
toutes les opérations requises en «début de vie» de l’instance)
le
destructeur:
méthode responsable des opérations à effectuer «en fin de vie» de l’instance (i.e.
lorsque l’exécution du programme quitte le bloc dans lequel l’instanciation a eu lieu).
Informatique II
Programmation Orientée Objet (en C++)
– 27 –
Les constructeurs (1)
Les
constructeurs
sont des méthodes, invoquées
automatiquement
lors de l’instanciation, qui assurent l’initialisation des instances.
La syntaxe de déclaration d’un constructeur,
pour une classe
NomClasse
, est:
NomClasse
(
<arguments>
)
:
<attribut
1
>
(
<valeur
1
>
),
...
Exemple:
Rectangle(int h, int l)
:
hauteur(h),
largeur(l)
{ }
<attribut
n
>
(
<valeur
n
>
)
{
// autres opérations
}
Un constructeur est donc une méthode
sans indication de type de retour
(pas même
void
), et
de même nom que la classe
pour laquelle la méthode est définie.
11
11. On peut aussi considérer que le constructeur est une méthode sans nom, dont le type de la valeur de retour est la classe.
Informatique II
Programmation Orientée Objet (en C++)
– 28 –
Les constructeurs (2)
Le corps du constructeur est précédé d’une section optionnelle
introduite par «
:
», spécifiquement réservée à l’initialisation des attributs.
Les attributs non initialisés dans cette section prendront une valeur par défaut dans le cas
où une telle valeur existe
12
ou resterons non initialisés dans le cas contraire.
Il est bien sûr possible de changer la valeur d’un attribut initialisé ou
d’affecter une valeur à un attribut non initialisé dans le corps du constructeur
13
.
Exemple:
Rectangle(const int h, const int l)
:
hauteur(h)
initialisation
{
int t(2*l - h % 2);
largeur
= t;
affectation
}
largeur
a une valeur
indéfinie
12. Une valeur par défaut est une valeur donnée par le
constructeur par défaut
(c.f. suite du cours). Il n’y a pas formellement de valeurs par défaut pour
les types autres que les classes, même si dans la pratique, 0 où ses différentes représentations (i.e 0.0, ’\0’, etc), est utilisé.
13. Remarquons cependant que les attributs déclarés constants ne peuvent être valués que dans la section d’initialisation précédant le bloc de la méthode.
Informatique II
Programmation Orientée Objet (en C++)
– 29 –
Les constructeurs (3)
Comme dans le cas des autres méthodes, il est tout à fait possible
de
surcharger les constructeurs;
une classe peut donc admettre
plusieurs
constructeurs,
pour autant que leurs listes d’arguments soient différentes.
Exemple:
class
Rectangle {
public:
int
hauteur, largeur;
Rectangle(const
int c)
:
hauteur(c), largeur(c)
{ }
Rectangle(const
int h, const int l)
:
hauteur(h), largeur(l)
{ }
// autres méthodes ........
unsigned int surface() {...}
void changeHauteur(...) {...}
};
Informatique II
Programmation Orientée Objet (en C++)
– 30 –
Zgłoś jeśli naruszono regulamin