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 :

Demande explication sur les constructeurs de copies


Sujet :

C++

  1. #1
    IDE
    IDE est déconnecté
    Membre régulier Avatar de IDE
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 238
    Points : 89
    Points
    89
    Par défaut Demande explication sur les constructeurs de copies
    Bonjour, quelqu'un pourrait m'expliquer les constructeurs de copies, je sais vous allez me dire d'aller voir un tuto ou de lire un bouquain, je l'ai déjà fait cela et je n'arrive pas bien à comprendre, merci pour votre aide.

    Michael

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Que n'arrives-tu pas à comprendre ?
    Leur utilité ? Comment ils marchent ? À quel moment ils sont appelés ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    En bref, le constructeur de copie d'une classe est appelé à tout moment que le programme nécessite de copier un objet, comme dans une affectation par exemple. Il faut l'implanter si tu veux controller la façon dont les objets sont copiés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MaClasse objet1;
    MaClasse objet2;
     
    // ...
     
    objet1 = objet2; // appeler constructeur de copie

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par vdumont Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MaClasse objet1;
    MaClasse objet2;
     
    // ...
     
    objet1 = objet2; // appeler constructeur de copie
    Moult te goures. Dans le cas présent, c'est l'opérateur d'affectation qui sera appelé, pas le constructeur de copie.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je ne pense pas qu'on puisse faire mieux qu'un livre, sauf si tu nous aides en disant où tu bloques.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    IDE
    IDE est déconnecté
    Membre régulier Avatar de IDE
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 238
    Points : 89
    Points
    89
    Par défaut Suite
    Merci pour toutes ces réponses, en fait je me demande quel interet de faire des constructeurs de copies, par hasard vous n'avez un petit tuto sur tous les types de constructeurs ( je débute en C++ ), merci bien.

    Michael

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    L'intéret des constructeurs de copie est de permettre la copie de classes pour lesquelles une simple copie membre-à-membre serait un bug.

    Typiquement, des classes contenant des pointeurs:
    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
    class UneClasse
    {
    public:
    	//Constructeur
    	UneClasse();
    	//Destructeur
    	~UneClasse();
    private:
    	int *m_pData;
    };
     
    UneClasse::UneClasse()
    {
    	m_pData = new int[16];
    	m_pData[0] = 42;
    	//etc.
    }
     
    UneClasse::~UneClasse()
    {
    	delete[] m_pData;
    }
    Avec cette classe, à priori aucun problème. Sauf que si l'on fait une bête copie membre-à-membre, les deux objets pointeront sur la même zone mémoire, donc il y aura deux delete[] sur la même zone mémoire, et BOUM!

    Alors, on corrige:
    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
    class UneClasse
    {
    public:
    	//Constructeur
    	UneClasse();
    	//Constructeur de copie
    	UneClasse(const UneClasse &);
    	//Destructeur
    	~UneClasse();
    private:
    	int *m_pData;
    };
    
    UneClasse::UneClasse()
    {
    	m_pData = new int[16];
    	m_pData[0] = 42;
    	//etc.
    }
    
    UneClasse::UneClasse(const UneClasse &src)
    {
    	m_pData = new int[16];
    	for(size_t i=0 ; i<16 ; i++)
    		m_pData[i] = src.m_pData[i];
    }
    
    UneClasse::~UneClasse()
    {
    	delete[] m_pData;
    }
    Ainsi, chaque objet pointe sur sa propre zone de données.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    IDE
    IDE est déconnecté
    Membre régulier Avatar de IDE
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 238
    Points : 89
    Points
    89
    Par défaut
    Merci bien Medinoc pour ces infos, à bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Demande d'explication sur les LOG BINAIRE
    Par ahd261 dans le forum Administration
    Réponses: 1
    Dernier message: 02/01/2013, 11h55
  2. Demande explication sur un composant ADO
    Par Golork dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/07/2005, 20h22
  3. [résolu]les constructeurs de copie
    Par pouss dans le forum Langage
    Réponses: 9
    Dernier message: 28/06/2005, 10h57
  4. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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