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
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
Que n'arrives-tu pas à comprendre ?
Leur utilité ? Comment ils marchent ? À quel moment ils sont appelés ?
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
Je ne pense pas qu'on puisse faire mieux qu'un livre, sauf si tu nous aides en disant où tu bloques.
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
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:
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!
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; }
Alors, on corrige:
Ainsi, chaque objet pointe sur sa propre zone de données.
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; }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager