IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Constructeur de copie, et opérateur d'affectation.


Sujet :

C++

  1. #41
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Abdelite Voir le message
    Merci, pour en revenir à la méthode swap, je la définie moi-même, ou j'utilise std::swap ?
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    un swap (cette fonction doit avoir ete implementee a part, il ne faut pas utiliser std::swap qui utilise l'assignation ).
    Dans ce cas, il ne faudrait pas utiliser utiliser un pointeur ou une référence en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Foo& operator=(Foo &f)
    {
       swap(*this, f);
       return *this;
    }
    Ca c'est la maniere d'ecrire une assignation qui realise en fait un swap. Ce serait pas mal pour une version C++ de l'IOCCC, mais ce n'est pas quelque chose a conseiller.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  2. #42
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Alors un exemple parce que la ca part en sucette

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    struct some_class
    {
       some_class() : data(0),sz(0) {}
     
       ~some_class() { if(data) delete[] data; }
     
       some_class( some_class const& src) : sz(src.size())
      {
          data = new double[sz];
          std::copy(data,data+sz,src.begin());
      }
     
      void swap( some_class& src )
      {
         std::swap(sz,src.sz);
         std::swap(data,src.data);
      }
     
      some_class& operator=( some_class src )
      {
          swap(src);
          return *this;
       }
     
      std::size_t size() const { return sz; }
      double* begin() {  return data; }
      double const* begin() const {  return data; }
     
     
      private:
      double* data;
      std::size_t sz;
    };
    Il ne faut bien evidemment PAS utiliser std::swap a l'interieur du = sinon on va passer ça vie à copier infiniment.

    En C++0x, il faut aussi rajouter les constructeur et affectation depuis des rvalue qui se resume à piquer la ressource au temporaire et à mettre cette dernière à 0 (et donc sans swap).

  3. #43
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Joel F Voir le message
    En C++0x, il faut aussi rajouter les constructeur et affectation depuis des rvalue qui se resume à piquer la ressource au temporaire et à mettre cette dernière à 0 (et donc sans swap).
    s/Il faut/On peut/

    Cela a un cout (il faut peut-etre modifier les invariants de la classe pour l'etat sans ressources allouees soit acceptable; on peut forcer le move a etre appliquer sur autre chose que des temporaires, donc le destructeur n'est pas le seul a etre impacte).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #44
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Juste pour répondre à Koala qui me cite.

    Justement, non... Il ne font pas la même chose...

    Le premier se contente de copier l'objet, le second assigne la copie des valeurs d'un objet donné à un autre
    Euh, ils font le même travail, ils ne sont juste pas appelés au même moment. Dans tous les cas, leur rôle est de faire que l'objet à gauche (donc en cours d'affectation ou de construction) soit identique à celui de droite sans qu'il n'y ait de problème.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #45
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Euh, ils font le même travail, ils ne sont juste pas appelés au même moment. Dans tous les cas, leur rôle est de faire que l'objet à gauche (donc en cours d'affectation ou de construction) soit identique à celui de droite sans qu'il n'y ait de problème.
    Le fait est que, pour le constructeur par copie, tu pars d'un seul objet, et tu en obtiens un deuxième qui présente des valeurs similaires, alors que pour l'opérateur d'affectation, tu pars de deux objets ayant des valeurs potentiellement différentes, et tu obtiens deux objets ayant des valeurs similaires.

    Le premier crée donc un objet alors que le second modifie un objet.

    Tu as donc effectivement un résultat final identique, mais tu pars de deux situations (et donc deux comportements) fondamentalement différents

    On ne peut donc absolument pas envisager de dire qu'ils font la même chose: ce sont deux comportements très proches (dans leurs résultats, et de par le fait que si on définit soi-même l'un, il faudra définir également l'autre), mais clairement distincts.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #46
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    s/Il faut/On peut/

    Cela a un cout (il faut peut-etre modifier les invariants de la classe pour l'etat sans ressources allouees soit acceptable; on peut forcer le move a etre appliquer sur autre chose que des temporaires, donc le destructeur n'est pas le seul a etre impacte).
    oui en effet

  7. #47
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Abdelite Voir le message
    Voilà, j'ai pas tester, mais je pense que c'est ça.
    Tu devrais peut être faire le test tout de même, tu pourrais avoir des surprises :
    • MaClasse m3 = m2 appelle le constructeur par copie.
    • Suivant le compilateur et les options de compilations, MaClasse m4 = MaClasse() appelle soit le constructeur par défaut soit le constructeur par défaut puis le constructeur par copie.

  8. #48
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Voila un code d'exemple sur les elisions et les copies de rvalue que Dave avait foruni dans les commentaires sur c++-next.com

    http://codepad.org/aG4BBT8g

  9. #49
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Joel F Voir le message
    Voila un code d'exemple sur les elisions et les copies de rvalue que Dave avait foruni dans les commentaires sur c++-next.com

    http://codepad.org/aG4BBT8g
    C'est quel compilateur qui manque tout? (Ici, gcc et xlC ne manquent qu'une élision au dernier -- si en théorie elle est possible, en pratique il faudrait que le compilo fasse l'élision après avoir inliné pour y arriver -- et SunCC manque le nrvo en plus).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #50
    Invité
    Invité(e)
    Par défaut
    J'y comprend strictement rien...

    En fait, tout dépend de comment on implémente ces opérateurs... Je vais mettre ce sujet en résolu. Merci à vous

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/02/2015, 16h21
  2. Réponses: 7
    Dernier message: 17/08/2014, 16h20
  3. Réponses: 96
    Dernier message: 08/04/2013, 12h54
  4. Constructeur de copie et Template: Transtypage
    Par ikkyu_os dans le forum Langage
    Réponses: 9
    Dernier message: 26/12/2004, 23h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo