Initialisation des membres par défaut [RESOLU] - C++ - Programmation
Marsh Posté le 06-01-2006 à 21:47:05
ReplyMarsh 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 !!!
Marsh Posté le 10-01-2006 à 20:34:31
Sve@r a écrit : Non, j'ai trouvé. |
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".
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.
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. |
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)...
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.
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)
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.