[RESOLU] Initialisation des membres par défaut

Initialisation des membres par défaut [RESOLU] - C++ - Programmation

Marsh Posté le 06-01-2006 à 21:26:42    

Bonjour à tous
Avant de poster ce sujet, j'ai tenté de chercher sur le forum les mots "classe initialisation membres" et j'ai rien trouvé donc j'espère qu'on ne m'accusera pas de poster inutilement ;)
 
Je voudrais savoir si les membres d'une classe sont initialisés par défaut à 0. J'ai fait un petit truc pour tester et dans un cas c'est oui mais pas dans l'autre
 
Voici mon truc (je le tape de mémoire, j'ai pas mon source)
 

Code :
  1. #include <stdio.h>
  2. class cTest
  3. {
  4.     cTest();       // Constructeur
  5.     ~cTest();    // Destructeur
  6.     char c;       // Caractère
  7. };
  8. // Constructeur
  9. cTest::cTest()
  10. {
  11. }
  12. // Destructeur
  13. cTest::~cTest()
  14. {
  15. }
  16. int main(void)
  17. {
  18.     cTest a;
  19.     cTest *b=new cTest();
  20.     printf("a=%x\n", a.c);
  21.     printf("b=%x\n", b->c);
  22.     return (0);
  23. }


 
Pour "b", j'ai bien 0 mais pour "a" j'ai une valeur. Et si je remplace "cTest *b" par "cTest b" alors j'ai aussi une valeur pour "b"...
 
Quelqu'un (Taz, Emmanuel ?) peut m'expliquer la règle SVP ?


Message édité par Sve@r le 09-01-2006 à 03:09:42

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 06-01-2006 à 21:26:42   

Reply

Marsh Posté le 06-01-2006 à 21:47:05    

La regle : si tu veux initialiser, initialise toi même.

Reply

Marsh Posté le 09-01-2006 à 03:09:14    

Mackila a écrit :

La regle : si tu veux initialiser, initialise toi même.


 
Non, j'ai trouvé.
Si je n'avais pas créé de constructeur, alors un constructeur par défaut aurait été appelé. Ce constructeur par défaut aurait mis tous les membres à 0.
Comme j'ai créé un constructeur perso (vide), c'est lui qui est appelé mais il ne fait rien. Et rien d'autre ne se fait !!!


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 10-01-2006 à 20:34:31    

Sve@r a écrit :

Non, j'ai trouvé.
Si je n'avais pas créé de constructeur, alors un constructeur par défaut aurait été appelé. Ce constructeur par défaut aurait mis tous les membres à 0.


 
Pour un être un peu plus précis :
Si tu n'a déclaré *aucun* constructeurs, un constructeur par défaut (public inline) sera implicitement déclaré.
 
Si tu y fais appel, le constructeur par défaut sera défini, définira les éventuels constructeurs par défaut implicitement déclaré de ses membres non statiques et ses bases, et finalement initialisera par défaut ses membres non statiques et ses bases.  
Toutefois, si au moins un membre ou une base ne possède pas de constructeur par défaut, la génération du contructeur rendra le programme "ill-formed".

Reply

Marsh Posté le 15-01-2006 à 23:17:19    

En fait mon poste précédent est largement incomplet. La zéro-initialisation dépend de plusieurs choses : de la classe de stockage, de la présence d'un new-initialiser "()", et de savoir si c'est un POD ou non.
 
- Si la classe de stockage est static, il y a zéro-initialisation.
- Sinon si il y a un new-initialiser, cela conduit à une value-initialisation. En simplifiant un peu, cela conduit ensuite à une zéro-initialisation de l'objet.
 
- Sinon, s'il n'y a pas de new-initialiser (comme c'est le cas pour la construction d'un objet de classe de stockage automatique), ça dépend si la classe est un POD ou non.  
    Si le type est de class type et n'est pas un POD, il y a default-initialization, qui mène immédiatement à une zéro-initialization si on parle de classes sans constructeurs déclarés explicitement.
    Sinon, il n'y a pas d'initialisation, et les valeurs sont indéterminées. (exception faite des aggregates automatiques, ... enfin bref)
 
Voila, j'ai essayé de recombiner pas mal de chapitres de la norme en résumant, j'espère ne pas trop m'etre trompé, à défaut d'avoir été complètement exhaustif.

Reply

Marsh Posté le 16-01-2006 à 23:02:20    

++fab a écrit :

En fait mon poste précédent est largement incomplet. La zéro-initialisation dépend de plusieurs choses : de la classe de stockage, de la présence d'un new-initialiser "()", et de savoir si c'est un POD ou non.
 
- Si la classe de stockage est static, il y a zéro-initialisation.
- Sinon si il y a un new-initialiser, cela conduit à une value-initialisation. En simplifiant un peu, cela conduit ensuite à une zéro-initialisation de l'objet.
 
- Sinon, s'il n'y a pas de new-initialiser (comme c'est le cas pour la construction d'un objet de classe de stockage automatique), ça dépend si la classe est un POD ou non.  
    Si le type est de class type et n'est pas un POD, il y a default-initialization, qui mène immédiatement à une zéro-initialization si on parle de classes sans constructeurs déclarés explicitement.
    Sinon, il n'y a pas d'initialisation, et les valeurs sont indéterminées. (exception faite des aggregates automatiques, ... enfin bref)
 
Voila, j'ai essayé de recombiner pas mal de chapitres de la norme en résumant, j'espère ne pas trop m'etre trompé, à défaut d'avoir été complètement exhaustif.


En fait, c'est comme en C pour une variable statique (initialisée par défaut à 0) ou automatique (non-initialisée par défaut)...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 18-01-2006 à 00:39:23    

Sve@r a écrit :

En fait, c'est comme en C pour une variable statique (initialisée par défaut à 0) ou automatique (non-initialisée par défaut)...


 
C'est à peu près ça. Ce qui est issu du C (POD) fonctionne comme en C. new est spécifique au c++. On peut avoir un comportement C++ien sécurisé par initalisation en mettant un new-initializer vide, ou un comportement à la C en l'omettant.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed