C++ : Copie d'une structure

garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 - 11 août 2005 à 16:34
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 11 août 2005 à 18:21
Bonjour à tous.



J'ai quelques questions existentielles sur le C++....



1)

Si j'ai une structure par exemple:

struct
Structure


{

float tableau[20];

};



et une fonction, par exemple :

Structure MaClasse::create( ) const

{

Structure resultat;



// plein de traitements qui remplissent la structure



return resultat;

}



Que va me renvoyer la fonction create() ? Une copie de resultat, ok... mais resultat.tableau ? Les 20 éléments vont être recopiés ?






2)

D'autre part quelle différence y a-t-il entre


Structure MaClasse::create( ) const

et


Structure&
MaClasse::create( ) const
?



3)

Enfin dans la fonction create() la copie de resultat est créée avec le constructeur de copie ou avec l'opérateur = ?









Merci


On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac

12 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2005 à 16:50
dans ta Create() la struct est déclaré ici donc mise sur pile le temps de la fonction. Tu es bien cetain que tu obtiens une copie ? et placée où dans ce cas ?

ciao...
BruNews, MVP VC++
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
11 août 2005 à 16:55
C'est une copie, pas de doute...

C'est géré exactement comme si c'était un type simple (un int par exemple).



Ce que tu dis pourrait poser problème si la fonction renvoyait un pointeur sur resultat. Car alors le pointeur renvoyé pointerait sur un objet détruit (et donc potentiellement écrasé par une autre allocation).

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
11 août 2005 à 17:00
Ta structure est effacee quand tu quittes la fonction ou elle a ete creee.
Tu peux quand meme la retrouver en utilisant resultat si la pile n`a pas bouge.
Tu aurais plus de chance de retrouver les 20 float en renvoyant l`adresse de la structure.
La RAM a l`endroit de tes 20 float a peu d`etre remplacee aussitot create terminee.

La copie s`effectue sans doute par memcpy.
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
11 août 2005 à 17:12
Les "structures" du C sont remplacées par les "pod" en C++. Je vous invite à lire ceci concernant les POD (Plain Old Data). Il y a un certain nombre de réponses.

http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
11 août 2005 à 17:17
1) copie des éléments
2) Sans &, copie défensive. Avec &, retourne une référence sur la variable resultat... qui est détruite dans ce cas précis. Donc ne pas utiliser dans ce cas !
3) copie par memcpy() bien sur.
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
11 août 2005 à 17:25
Je faisais effectivement référence aux struct C++ c'est-à-dire des
classes dont les méthodes et attributs sont public par défaut.



Pour la question 2), dans quel cas faudrait-il utiliser & alors ? Peux-tu me donner une exemple ?



Pour la question 3), ça m'étonne car alors il est impossible de surcharger la copie... Es-tu certain de ta réponse ?


On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
11 août 2005 à 17:37
Un exemple "à la con" : int & incr( int & n ) { return ++n; };
Cela évite des copies inutiles.

Tu as lu la page dont je t'ai donné le lien ?
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
11 août 2005 à 17:42
Ajoute un constructeur par recopie ou/et un operateur d'affectation à ton POD, et il devient un objet classique.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
11 août 2005 à 18:09
1) oui et oui (l'objet est copié)
3) constructeur par copie
Si tu ne définie pas le constructeur par copie et l'opérateur d'affectation ils seront ggénéré par défaut par le compilateur, dans ton cas tu n'as pas besoin de les définir.

xterminhate > ce n'est pas necessaire dans sont cas.
0
garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
11 août 2005 à 18:11
Ok merci à tous

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
11 août 2005 à 18:15
SC > Ma dernière réponse n'etait pas un conseil, juste pour signifier la différence entre pod et objet.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
11 août 2005 à 18:21
ok
0
Rejoignez-nous