Initialisation donnée membre

Le
Marc G
bonjour,
j'ai une struct X quelconque qui contient un objet pour lequel j'ai inhibé
le constructeur de copie

struct objet {
objet() {}
private :
objet(objet const&);
};

struct X
{
X() : obj(objet()) {}
objet obj;
private :
X(X const&);
};

j'ai pris l'habitude de toujours initialiser explicitement les données
membres des classes
Mon compilateur refuse de compiler le code ci-dessus car dans
l'initialisation de obj, il appelle le constructeur de copie !!!
C'est normal et si oui, quelle est la bonne syntaxe !
Merci aux experts
Marc
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Serge Paccalin
Le #305415
Le 30.03.2007 10:30, Marc G a ecrit:

struct X
{
X() : obj(objet()) {}
objet obj;
private :
X(X const&);
};

j'ai pris l'habitude de toujours initialiser explicitement les donnée s
membres des classes
Mon compilateur refuse de compiler le code ci-dessus car dans
l'initialisation de obj, il appelle le constructeur de copie !!!
C'est normal et si oui, quelle est la bonne syntaxe !


Tout à fait normal. Tu crées un objet temporaire, initialisé avec l e
constructeur par défaut, puis tu construis le membre obj avec le
constructeur par copie (et l'objet temporaire comme source de la copie).

Essaie :

struct X
{
X() : obj() {}

...


--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options).

Marc G
Le #305414
Tout à fait normal. Tu crées un objet temporaire, initialisé avec le
constructeur par défaut, puis tu construis le membre obj avec le
constructeur par copie (et l'objet temporaire comme source de la copie).


Merci à toi
Je ne savais pas la syntaxe exacte.
Il a fallu que je bloque le constructeur de copie pour m'en aperçevoir !
Marc

Sylvain
Le #305376
Marc G wrote on 30/03/2007 10:30:

struct objet {
objet() {}
private :
objet(objet const&);
};

struct X {
X() : obj(objet()) {}
objet obj;
private :
X(X const&);
};


le constructeur /par défaut/ de X est inutilement compliqué (en plus de
violer la protection du cst de copie de objet).

pour initialiser la donnée membre 'obj':
- tu créés une instance temporaire via le cst par défaut de objet (code
"objet()"
- tu invoques le cst de copie de objet pour recopier ces /valeurs par
défaut/

le recours au temporaire est nécessairement inutile ici.

X() : obj() {}

donnera fonctionnellement le même résultat; et puisque /par défaut/
s'applique /par défaut/ :

X() {}

redonne aussi le même résultat.

Sylvain.

Marc G
Le #305372
le recours au temporaire est nécessairement inutile ici.

X() : obj() {}

donnera fonctionnellement le même résultat; et puisque /par défaut/
s'applique /par défaut/ :

X() {}

redonne aussi le même résultat.


c'est la même chose, mais je préfère la 1ère syntaxe, qui montre clairement
que c'est bien une initialisation avec le constructeur par défaut qui est
souhaitée alors que dans le second cas, on ne peut pas distinguer entre
oubli d'initialisation et initialisation souhaitée avec le constructeur par
défaut.
Marc

Sylvain
Le #305371
Marc G wrote on 01/04/2007 15:48:
le recours au temporaire est nécessairement inutile ici.

X() : obj() {}

donnera fonctionnellement le même résultat; et puisque /par défaut/
s'applique /par défaut/ :

X() {}

redonne aussi le même résultat.


c'est la même chose, mais je préfère la 1ère syntaxe, qui montre clairement
que c'est bien une initialisation avec le constructeur par défaut qui est
souhaitée alors que dans le second cas, on ne peut pas distinguer entre
oubli d'initialisation et initialisation souhaitée avec le constructeur par
défaut.


une "initialisation souhaitée avec le constructeur par défaut" n'est pas
opposable à un oubli; elle a toujours lieu si on n'invoque pas
explicitement un constructeur paramétré.
l'oubli que tu évoques ne serait pas dans le code mais plutôt chez le
codeur qui oublie que toute instance est nécessaire construite.

Sylvain.


Publicité
Poster une réponse
Anonyme