C++ Kopierkonstruktor
C++ Klassen und Objekte
KopierkonstruktorEr ist ein spezieller Konstruktor, der beim Erstellen eines Objekts ein zuvor erstelltes Objekt derselben Klasse verwendet, um das neu erstellte Objekt zu initialisieren. Der Kopierkonstruktor wird üblicherweise verwendet für:
Indem ein anderes Objekt desselben Typs verwendet wird, um das neu erstellte Objekt zu initialisieren.
Das Objekt kopieren und es als Parameter an die Funktion übergeben.
Das Objekt kopieren und das Objekt aus der Funktion zurückgeben.
Wenn in der Klasse kein Kopierkonstruktor definiert ist, definiert der Compiler selbst einen. Wenn die Klasse Zeigervariablen und dynamische Speicherzuweisung hat, muss sie einen Kopierkonstruktor haben. Die gebräuchlichste Form des Kopierkonstruktors ist wie folgt:
classname (const classname &obj) {
}
Hier,objEs ist eine Objektreferenz, und dieses Objekt wird verwendet, um ein anderes Objekt zu initialisieren.
Beispiel
#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 << "Aufruf des Konstruktors" << endl;
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "Rufe den Kopierkonstruktor auf und weise Speicher für den Zeiger ptr zu" << endl;
ptr = new int;
*ptr = *obj.ptr;
}
Line::~Line(void)
{
cout << "Speicher freigeben" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "Zeilengröße :" << obj.getLength() <<endl;
}
int main( )
{
Line line(10);
display(line);
return 0;
}
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
调用构造函数
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
释放内存
Das folgende Beispiel modifiziert das obige Beispiel leicht, indem es ein vorhandenes Objekt desselben Typs verwendet, um ein neu erstelltes Objekt zu initialisieren:
Beispiel
#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 << "Aufruf des Konstruktors" << endl;
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "Rufe den Kopierkonstruktor auf und weise Speicher für den Zeiger ptr zu" << endl;
ptr = new int;
*ptr = *obj.ptr;
}
Line::~Line(void)
{
cout << "Speicher freigeben" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "Zeilengröße :" << obj.getLength() <<endl;
}
int main( )
{
Line line1(10);
Line line2 = line1;
display(line1);
display(line2);
return 0;
}
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
调用构造函数
调用拷贝构造函数并为指针 ptr 分配内存
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
释放内存
释放内存
C++ Klassen und Objekte
Weitere Erweiterungen