This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:tds:sujets:td1:part2 [2019/09/23 15:40] bmonsuez [Question n° 1] |
in204:tds:sujets:td1:part2 [2022/11/18 10:50] (current) |
||
---|---|---|---|
Line 28: | Line 28: | ||
Exécuter les deux fonctions et expliquer pourquoi la valeur des champs est différente dans le cas où les objets sont alloués sur la pile ou dans le cas où sont alloués sur le tas. | Exécuter les deux fonctions et expliquer pourquoi la valeur des champs est différente dans le cas où les objets sont alloués sur la pile ou dans le cas où sont alloués sur le tas. | ||
+ | |||
+ | <hidden Correction> | ||
Dans la fonction ''myfunctionA()'' l'objet est alloué sur la pile. Dans le cas d'une allocation sur la pile, la mémoire est obtenue en simplement retournant l'addresse mémoire courante du pointeur de pile et en incrémentant ensuite ce pointeur de la taille de l'objet. | Dans la fonction ''myfunctionA()'' l'objet est alloué sur la pile. Dans le cas d'une allocation sur la pile, la mémoire est obtenue en simplement retournant l'addresse mémoire courante du pointeur de pile et en incrémentant ensuite ce pointeur de la taille de l'objet. | ||
Line 59: | Line 61: | ||
Que faut-il ajouter à la classe pour garantir que le comportement soit toujours correct ? | Que faut-il ajouter à la classe pour garantir que le comportement soit toujours correct ? | ||
+ | <hidden Correction> | ||
+ | Il est nécessaire d'ajouter un constructeur par défaut qui initialise les champs de l'objet avec la valeur par défaut, soit ''0'' dans notre cas. | ||
+ | |||
+ | <code cpp> | ||
+ | |||
+ | struct MyCounter | ||
+ | { | ||
+ | public: | ||
+ | MyCounter(): counter(0), max(0) | ||
+ | {} | ||
+ | }; | ||
+ | </code> | ||
+ | | ||
+ | </hidden> | ||
==== Question n° 3 ==== | ==== Question n° 3 ==== | ||
Line 71: | Line 87: | ||
proposé ces solutions. | proposé ces solutions. | ||
+ | <hidden Correction> | ||
+ | |||
+ | Il est possible d'ajouter des constructeurs spécialisés à la classe ''MyCounter'', nous proposons les deux constructeurs suivants : | ||
+ | |||
+ | <code cpp> | ||
+ | struct MyCounter | ||
+ | { | ||
+ | ... | ||
+ | explicit MyCounter(uint theMaxValue): | ||
+ | counter(0), max(theMaxValue) | ||
+ | {} | ||
+ | MyCounter(uint theCounter, uint theMaxValue): | ||
+ | counter(theCounter), max(theMaxValue) | ||
+ | {} | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | Depuis la version C++11, il est possible de faire appel à un constructeur déjà défini. Ainsi, le code peut se simplifier comme suit : | ||
+ | |||
+ | <code cpp> | ||
+ | struct MyCounter | ||
+ | { | ||
+ | ... | ||
+ | explicit MyCounter(uint theMaxValue): | ||
+ | MyCounter((uint)0, theMaxValue) | ||
+ | // Effectue un appel au constructeur MyCounter(uint, uint) | ||
+ | {} | ||
+ | MyCounter(uint theCounter, uint theMaxValue): | ||
+ | counter(theCounter), max(theMaxValue) | ||
+ | {} | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | La fonction ''useObjectA()'' peut désormais s'écrire comme suit: | ||
+ | |||
+ | <code cpp> | ||
+ | void useObjectA() { | ||
+ | MyCounter Counter1(2); | ||
+ | MyCounter Counter2(4) | ||
+ | for(unsigned i = 0; i <= 5; i++) { | ||
+ | std::cout | ||
+ | << "Valeur des compteurs (" << Counter1.counter | ||
+ | << ", " << Counter2.counter << ")" << std::endl; | ||
+ | Counter1.increment(); | ||
+ | Counter2.increment(); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | </hidden> | ||
==== Question n° 4 ==== | ==== Question n° 4 ==== | ||
Proposer enfin un constructeur de recopie qui permet de créer un nouveau compteur étant la copie d’un compteur passé en paramètre. | Proposer enfin un constructeur de recopie qui permet de créer un nouveau compteur étant la copie d’un compteur passé en paramètre. | ||
- | + | ||
+ | <hidden Correction> | ||
+ | |||
+ | Le constructeur de recopie se définit simplement comme suit : | ||
+ | |||
+ | <code cpp> | ||
+ | struct MyCounter | ||
+ | { | ||
+ | MyCounter(const MyCounter& anotherCounter): | ||
+ | counter(anotherCounter.counter), | ||
+ | max(anotherCounter.max) | ||
+ | {} | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | </hidden> | ||