Directory
Rappel: types d’initialisation:
class Fraction {
private:
int m_num; int m_den;
public:
Fraction(int num = 0, int den = 1) {
m_num = num; m_den = den;
}
friend ostream& operator <<
(ostream& out, const Fraction& f) {
return out << f.m_num << "/" << f.m_den;
}
};
Initialisation $directe$
int x(5);
initialisation directe d’un objet de typeint
Fraction f1(5,4);
initiasation directe d’un objet de typeFraction
- $ \Rightarrow $ appelle le cstr de
Fraction(int,int)
- $ \Rightarrow $ appelle le cstr de
Initialisation $uniforme$
int y{5};
initialisation uniforme d’un objet de typeint
Fraction f2{5,3};
initialisation uniforme d’un objet de type ‘Fraction`- $ \Rightarrow $ appelle le cstr de
Fraction(int,int)
- $ \Rightarrow $ appelle le cstr de
Initialisation par $copie$
int z = 6;
initialisation par copie d’un objet de typeint
Fraction f3 = Fraction(6);
initialisation par copie d’un objet de typeFraction
- $\Rightarrow$ appelle le constructeur
Fraction(6,1)
ou le cstr de copie. Ce dernier n’est généralement pas le premier choix du compilateur pour raison de performance. - Cette façon de faire est évaluée de la même façon que le serait
Fractionf3(fraction(6));
- $\Rightarrow$ appelle le constructeur
Fraction f4 = 7;
initialisation par copie d’un objet de typeFraction
.- $\Rightarrow$ le compilateur va tenter de trouver une façon de convertir 7 en un objet de type
Fraction
ce qui va invoquer le cstrFraction(7,1)
- $\Rightarrow$ le compilateur va tenter de trouver une façon de convertir 7 en un objet de type
Autre cas d’initialisation par copie:
- Passage d’une classe (objet de type…) comme argument
- Retour d’une classe (objet de type…)
Règle
Éviter l’initialisation par copie au profit de de l’initialisation uniforme
Rappel: Opérateur d’affectation et cstr de copie
Le constructeur de copie et l’opérateur d’assignation sont presque équivalents, les deux copient un objet dans un autre.
Opérateur d’affectation
Remplace le contenu d’objets préexistants (comme c’est une affectation, il assigne une valeur à un objet qui existe déja).
int b; // initialisation (contient du garbage)
b = 5; // affectation à un objet préexistant
Il est évident qu’on ne peut pas faire b = 5;
sans avoir fait au préalable l’initialisation int b;
. Dans la même logique: f1 = (5,2);
doit être précédé de Fraction f1;
Constructeur de copies
Initialise de nouveaux objets.
Règle
-
si un nouvel objet doit être créé avant qu’une copie puisse se faire le cstr de copies est utilisé (inclut le passage d’objet en argument (par valeur) et le retour d’objets par valeur).
-
si un nouvel objet ne doit pas forcément être créé avant qu’une copie puisse se passer, on utilise l’opérateur d’affectation.