Examen 2018, Question 3 - Déroulement du programme

Examen 2018, Question 3 - Déroulement du programme

by Katja Sophia Moos -
Number of replies: 9

Bonjour,

J'ai des question pour la question 3 - déroulement du programme de l'examen 2018:

J'ai des problèmes à comprendre les cout L) jusqu'à S):

In reply to Katja Sophia Moos

Re: Examen 2018, Question 3 - Déroulement du programme

by Katja Sophia Moos -

Désolé, évidament quelque chose n'a pas marché parfaitement quand j'étais en train de décrire mon problème.

Voilà encore une fois ma question:

Bonjour,

J'ai une question pour l'exercice 3 - déroulement du programme de l'examen 2018:

Aprés avoir faire l'exercice, j'ai écrit le code dans un fichier geany pour controller mes résultats.

Maintenant, j'ai des problèmes à comprendre les cout L) jusqu'à S):

Surtout les lignes qui m'affiche que le programme a appelé un déstructeur me font des problèmes.

Pourriez quelqu'un m'expliquer la fonctionnement du programme étape par étap à partir de la ligne L) jusqu'à la fin, s'il vous plaît?

Mercie en avance,

In reply to Katja Sophia Moos

Re: Examen 2018, Question 3 - Déroulement du programme

by Sepand Kashani -

Regarde les commentaires mises à côté du main() ci-dessous.

int main() {
    cout << "A) ";
    Y c;                        // A) X() Y()
    cout << endl << "B) ";
    Z* b = new W;               // B) X() Y() Z() W()
    cout << endl << "C) ";
    b->g();                     // C) W::g
    cout << endl << "D) ";
    b->f();                     // D) Z::f
    cout << endl << "E) ";
    X a = X(0);                 // E) X(double)
    cout << endl << "F) ";
    f1(a);                      // F) ~X()
    cout << endl << "G) ";
    a.print();                  // G) 0
    cout << endl << "H) ";
    g1(a);                      // H)
    cout << endl << "I) ";
    a.print();                  // I) 2.2
    cout << endl << "J) ";
    h1(&amp;a);                     // J)
    cout << endl << "K) ";
    a.print();                  // K) 5.5
    cout << endl << "L) ";
    a = f2(a);                  // L) ~X()~X()              [Appel du destructeur de la variable locale 'X x' dans f2(), puis copie dans la variable 'a', puis destructeur du variable de retour du fonction 'f2(a)'. {Usage avancé, avec output sujet au options de compilation, donc la réponse n'est pas nécessairement unique.}]
    cout << endl << "M) ";
    a.print();                  // M) 9.9  [Valeur 9.9 écrite par 'a = f2(a)']
    cout << endl << "N) ";
    a = g2(a);                  // N) ~X() [Modification de 9.9 à 15.4 dans 'g2(a)', car passage par référence, puis déstruction du copie 'x' en retour de fonction. {Usage avancé, avec output sujet au options de compilation, donc la réponse n'est pas nécessairement unique.}]
    cout << endl << "O) ";
    a.print();                  // O) 15.4
    cout << endl << "P) ";
    a = h2(&amp;a);                 // P) ~X() [Bien que changement de 15.4 à 22 (car passage par référence via pointeur), 'a' reste sur 15.4 car l'output de h2() est 'x1', i.e. la valeur de 'a' avant l'écrasement. Ensuite appel au destructeur de l'objet copié hors de la fonction, comme dans L) et N). {Usage avancé, avec output sujet au options de compilation, donc la réponse n'est pas nécessairement unique.}]
    cout << endl << "Q) ";
    a.print();                  // Q) 15.4
    cout << endl << "R) ";
    delete b;                   // R) ~W() ~Z() ~Y() ~X()  [Appel aux destructeurs de W() dans l'ordre contraire de l'appel des constructeurs. L'ordre des constructeurs était: X(), Y(), Z(), W() {point B)}, donc on affiche la même chose dans le sens contraire.]
    cout << endl << "S) ";      // S) ~X()~Y() ~X()  [Destruction des variable 'X a' et 'Y c', également dans le sens contraire de construction. {Avancé: l'ordre de destruction des variables peux changer.}]
}
 
In reply to Sepand Kashani

Re: Examen 2018, Question 3 - Déroulement du programme

by Katja Sophia Moos -

Merci beaucoup pour les explications détaillées! Maintenant, c'est beaucoup plus clair!

In reply to Sepand Kashani

Re: Examen 2018, Question 3 - Déroulement du programme

by Dominique Ava Candrian -

Bonjour, j'ai toujours une question pour le même problème, partie P) :

X h2(X* x) {

X x1 = *x;

x->set( x->get() + 6.6 );

return x1;}

À mon avis, la deuxième ligne de cette fonction doit donner un X() car un nouveau objet de type X est construit. Donc comme solution X() ~X() (Le destructeur fait du sens pour moi). Pourquoi cela n'est-il pas le cas?



In reply to Dominique Ava Candrian

Re: Examen 2018, Question 3 - Déroulement du programme

by Sepand Kashani -

'X x1 = *x' fait appel au constructeur de copie implicite. Ce dernier n'appelle pas le constructeur par défaut 'X()', raison pour laquelle un 'X() ' n'est pas affiché sur 'stdout'.

In reply to Sepand Kashani

Re: Examen 2018, Question 3 - Déroulement du programme

by Romain Nicolas Pythoud -

Bonjour,

J'aurais encore une question pour le même point P), plus précisément au niveau du nombre de destructions réalisées. En effet, j'ai l'impression qu'on devrait obtenir la même sortie qu'au point L). Je m'explique :

Au point L), le passage par valeur dans la fonction f2() crée une copie X x, qui est détruite à la fin de cette fonction. De plus, la sortie return x ne se fait pas par référence, donc entraine une nouvelle copie pour le retour, qui est détruite une fois la copie dans a effectuée.

Au point P), on crée un objet X x1 = *x; cet objet doit être détruit à la fin de la fonction h2() car le retour se fait par valeur. Comme le retour se fait par valeur, une nouvelle copie est créée pour le retour, celle-ci est détruite une fois la copie dans a effectuée. 

Selon ce raisonnement, l'affichage de P) devrait être ~X() ~X(), ce qui n'est pas le cas.

Merci d'avance pour m'éclairer sur ce point

In reply to Romain Nicolas Pythoud

Re: Examen 2018, Question 3 - Déroulement du programme

by Sepand Kashani -
La valeur exacte de L) et P) n'est pas forcément unique selon comment le programme a été compilé. Si le compilateur utilise l'optimization RVO (i.e. "Return Value Optimization"), alors la deuxième appel au destructeur n'aurait pas lieu.
Dans tous les cas, l'important dans ces sous-questions est de mentionner la destruction des variables internes aux fonctions (i.e. variable passé par valeur, ou créée explicitement dans le corps de la fonction.). Nous ne pénalisons pas l'omission du deuxième destructeur.