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
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).
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).
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
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
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
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
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/ :
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/ :
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 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
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
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
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.
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.
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.