Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Initialisation donnée membre

5 réponses
Avatar
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

5 réponses

Avatar
Serge Paccalin
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).

Avatar
Marc G
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

Avatar
Sylvain
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.

Avatar
Marc G
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

Avatar
Sylvain
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.