C++ Constructeur de copie
Classes et objets C++
Constructeur de copieIl s'agit d'un constructeur spécial qui, lors de la création d'un objet, utilise un objet précédemment créé de la même classe pour initialiser l'objet nouvellement créé. Le constructeur de copie est généralement utilisé pour :
En utilisant un autre objet du même type pour initialiser l'objet nouvellement créé.
Copier l'objet et le passer comme paramètre à la fonction.
Copier l'objet et retourner l'objet depuis la fonction.
Si un constructeur de copie n'est pas défini dans la classe, le compilateur en définira un lui-même. Si la classe possède des variables pointeurs et une allocation dynamique de mémoire, alors elle doit avoir un constructeur de copie. La forme la plus courante du constructeur de copie est la suivante :
classname (const classname &obj) {
}
Ici,objIl s'agit d'une référence à un objet, et cet objet est utilisé pour initialiser un autre objet.
Exemple
#include <iostream>
using namespace std;
class Line
{
public:
int getLength( void );
Line( int len );
Line( const Line &obj);
~Line();
private:
int *ptr;
};
Line::Line(int len)
{
cout << "Appel du constructeur" << endl;
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "Appeler le constructeur de copie et allouer de la mémoire pour le pointeur ptr" << endl;
ptr = new int;
*ptr = *obj.ptr;
}
Line::~Line(void)
{
cout << "Libérer la mémoire" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "taille de la ligne :" << obj.getLength() <<endl;
}
int main( )
{
Line line(10);
display(line);
return 0;
}
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
调用构造函数
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
释放内存
L'exemple suivant modifie légèrement l'exemple ci-dessus en utilisant un objet existant du même type pour initialiser un objet nouvellement créé :
Exemple
#include <iostream>
using namespace std;
class Line
{
public:
int getLength( void );
Line( int len );
Line( const Line &obj);
~Line();
private:
int *ptr;
};
Line::Line(int len)
{
cout << "Appel du constructeur" << endl;
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "Appeler le constructeur de copie et allouer de la mémoire pour le pointeur ptr" << endl;
ptr = new int;
*ptr = *obj.ptr;
}
Line::~Line(void)
{
cout << "Libérer la mémoire" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "taille de la ligne :" << obj.getLength() <<endl;
}
int main( )
{
Line line1(10);
Line line2 = line1;
display(line1);
display(line2);
return 0;
}
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
调用构造函数
调用拷贝构造函数并为指针 ptr 分配内存
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
释放内存
释放内存
Classes et objets C++
autres extensions