Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1148 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [RESOLU] Initialisation des membres par défaut

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Initialisation des membres par défaut

n°1278435
Sve@r
Posté le 06-01-2006 à 21:26:42  profilanswer
 

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.
mood
Publicité
Posté le 06-01-2006 à 21:26:42  profilanswer
 

n°1278450
Mackila
Posté le 06-01-2006 à 21:47:05  profilanswer
 

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

n°1279407
Sve@r
Posté le 09-01-2006 à 03:09:14  profilanswer
 

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.
n°1280900
++fab
victime du syndrome IH
Posté le 10-01-2006 à 20:34:31  profilanswer
 

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".

n°1284239
++fab
victime du syndrome IH
Posté le 15-01-2006 à 23:17:19  profilanswer
 

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.

n°1285146
Sve@r
Posté le 16-01-2006 à 23:02:20  profilanswer
 

++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.
n°1286219
++fab
victime du syndrome IH
Posté le 18-01-2006 à 00:39:23  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [RESOLU] Initialisation des membres par défaut

 

Sujets relatifs
[resolu] comment surcharger del ?[RESOLU]Compter le nombre de ligne d'un fichier
[Résolu] GET ok sous Firefox mais pas sous IEActiveX/ Visual Basic [Résolu]
[résolu] Image de fond sur lien d'un menu "en ligne" ???[RESOLU]Passer un paramètre avec des espaces
[RESOLU]Fin de fichier[resolu]declenche macro par touche clavier
[résolu] Un menu sémantiquement correct ???[Résolu][Batch] Renommer des fichiers
Plus de sujets relatifs à : [RESOLU] Initialisation des membres par défaut


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR