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
Version imprimable
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:
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:
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:
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; }
Merci bien Medinoc pour ces infos, à bientôt.