/* IFT1166 - démonstration #9 - exercice 02 18-novembre -2005 v1.01 M.Lokbani - MàJ pour A05 21-avril -2001 v1.00 M.Lokbani - énoncé examen final Hiver 2001. contact: lokbani@iro.umontreal.ca Copyright (C) 2003-2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Description: ------------ Répondre aux différentes questions. */ #include #include using namespace std; class Test { int zz; string mm; Test(const Test& x) {} public: Test(int yy, string hh):zz(yy),mm(hh){} ~Test() {} Test& operator=(const Test& x) { if (this!=&x){ zz = x.zz; mm = x.mm; return *this; } } }; /* Question 1) La classe Test doit-elle redéfinir le constructeur de recopie et l’opérateur d’affectation, où bien ceux par défaut, fournis par le langage, sont suffisants? OUI/NON et Pourquoi? Réponse ------- La classe ne contient pas de pointeurs, donc il n'est pas nécessaire de définir le constructeur de recopie et l'opérateur d'affectation. Question 2) Quelles sont les fonctions membres de la classe Test, qui seront appelées dans la méthode "main" suivante : ------------------------------- int main() { Test dd(5,"essai"),XX(8,"unautre"); XX = dd; return 0; } ------------------------------- Nommer les fonctions (méthodes) et expliquer pourquoi? Réponse ------- Test dd(5,"essai"): correspond à la signature du constructeur Test(int,string). Il y aura conversion du 2nd argument de char* vers string. Il est de même pour l'appel [XX(8,"unautre");] XX = dd: affectation d'un objet à un autre, les deux instances de Test. Donc, il y aura appel de l'opérateur d'affectation. Question 3) En vous basant sur la définition de la classe Test, la méthode "main" suivante est -elle syntaxiquement correcte? OUI/NON et Pourquoi? ------------------------------- int main() { Test dd(45,"encore"); Test qsx(dd); return 0; } ------------------------------- Réponse ------- L'appel [est qsx(dd);] correspond à un appel du constructeur de recopie de la classe Test. Or le constructeur de recopie a été défini comme "private", de ce fait il n'est pas accessible de l'extérieur, d'où l'erreur. Question 4) La définition de l'opérateur d'affectation de la classe Test est-elle correcte? OUI/NON et Pourquoi? Dans le cas où vous répondez par NON (écriture incorrecte), réécrivez l'opérateur d'affectation de la classe Test. Réponse ------- La définition de l'opérateur d'affectation est correcte de point de vue syntaxique. Cependant, il n'est pas "optimal" en plus il y a une erreur conceptuelle. -1- Il aura fallu passer x comme étant une variable constante -2- Tester si l'affectation a lieu sur l'objet lui même pour éviter une affectation inutile. -3- Retourner l'objet lui-même (this) et non pas l'objet passé par référence. Test& operator=(const Test& x) { if (this!=&x){ zz = x.zz; mm = x.mm; return *this; } } */