C++ Klassenkonstruktor & Destruktor

C++ Klassen und Objekte

Klassenkonstruktor

KlasseKonstruktorEin Konstruktor ist eine spezielle Memberfunktion einer Klasse, die automatisch ausgeführt wird, sobald ein neues Objekt der Klasse erzeugt wird.

Der Name des Konstruktors ist genau derselbe wie der Name der Klasse, und er hat keinen Rückgabetyp (nicht einmalvoidbedeutet, dass b ein Objektarray der Klasse AB ist, das 3 Objekte enthält; daher wird der Konstruktor 3 Mal aufgerufen;

bedeutet, dass p ein Objektzeigerarray der Klasse AB ist, das 4 Klassenobjektzeiger enthält; es wird kein Konstruktor aufgerufen.

Das folgende Beispiel hilft, das Konzept der Konstruktoren besser zu verstehen:

Beispiel

#include <iostream> using namespace std; class Line { public: Line(); // Konstruktordeklaration void setLength(double len); double getLength() const; private: double length; }; // Konstruktordefinition Line::Line() { cout << "Objekt wird erstellt" << endl; length = 0.0; // Membervariablen explizit initialisieren } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // Die Hauptfunktion des Programms int main() { Line line; // Länge festlegen line.setLength(6.0); cout << "Länge der Linie : " << line.getLength() << endl; return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Object is being created
Length of line : 6

Parametrisierte Konstruktoren

Der Standardkonstruktor hat keine Parameter, aber falls erforderlich, können Konstruktoren auch Parameter haben. Auf diese Weise werden dem Objekt bei seiner Erstellung Anfangswerte zugewiesen, ohne dass ein separater Aufruf erforderlich istsetFunktionen, wie im folgenden Beispiel gezeigt:

Beispiel

#include <iostream> using namespace std; class Line { public: Line(double len); // Konstruktordeklaration mit Parametern void setLength(double len); double getLength() const; private: double length; }; // Konstruktordefinition Line::Line(double len) { cout << "Objekt wird erstellt, Länge = " << len << endl; length = len; } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // Die Hauptfunktion des Programms int main() { Line line(10.0); // Anfängliche Länge direkt beim Erstellen eines Objekts übergeben // Anfangslänge abrufen cout << "Länge der Linie : " << line.getLength() << endl; // Länge zurücksetzen line.setLength(6.0); cout << "Länge der Linie : " << line.getLength() << endl; return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Object is being created, length = 10
Length of line : 10
Length of line : 6

Verwenden von Initialisierungslisten zum Initialisieren von Feldern

C++ empfiehlt die Verwendung vonMember-Initialisierungslistezum Initialisieren der Member-Variablen. Ihre Syntax besteht darin, einen Doppelpunkt nach der Parameterliste des Konstruktors anzufügen,:), dann schreibenmember variable name (initial value)。

Im folgenden Beispiel,: length(len)bedeutet: den übergebenen Parameter zu verwendenlenum die Member-Variablen direkt zu initialisierenlength. HinweiscoutAusgegeben wird die Membervariablelength, statt eines Parameterslenwodurch Sie intuitiv überprüfen können, dass die Membervariablen korrekt zugewiesen wurden:

Zeile::Zeile(double len) : length(len) { // An diesem Punkt wurde length über die Initialisierungsliste zugewiesen; geben Sie length aus, um das Ergebnis zu überprüfen cout << "Objekt wird erstellt, length = " << length << endl; }

Die obige Syntax entspricht der folgenden Zuweisung im Funktionskörper; beide erzeugen genau dieselbe Ausgabe:

Zeile::Zeile(double len) { length = len; // Parameter len der Membervariable length zuweisen cout << "Objekt wird erstellt, length = " << length << endl; }

Der Unterschied zwischen den beiden Vorgehensweisen besteht darin, dass die Initialisierungsliste die Initialisierung der Membervariablen abschließt, ehe der Funktionskörper betreten wird,bevorwährend die Zuweisung im Funktionskörper zuerst default-konstruiert und dann zuweist, was ein zusätzlicher Schritt ist. Fürconstconst-Member, Referenz-Member und Objekt-Member ohne Standardkonstruktor ist die Initialisierungsliste dieeinzigeInitialisierungsmethode.

Angenommen, es gibt eine Klasse C mit mehreren Feldern X, Y, Z usw., die initialisiert werden müssen; trennen Sie die verschiedenen Felder einfach durch Kommas, wie unten gezeigt:

C::C(double a, double b, double c) : X(a), Y(b), Z(c) { // Sonstige Initialisierungslogik (falls vorhanden) }

Hinweis:Die Initialisierungsreihenfolge der Mitglieder in der Initialisierungsliste wird durch ihre Reihenfolge in der Klasse bestimmt,Deklarationsreihenfolgenicht durch die Reihenfolge, in der sie geschrieben werden. Es wird empfohlen, sie konsistent zu halten, um Verwirrung zu vermeiden.

Klassendestruktor

KlassendestruktorEin Destruktor ist eine spezielle Memberfunktion einer Klasse. Am Ende der Lebensdauer eines Objekts (wenn es den Gültigkeitsbereich verlässt oderdeletegelöscht wird), wird er automatisch ausgeführt, um die vom Objekt belegten Ressourcen freizugeben (z. B. dynamischer Speicher, Dateihandles usw.).

Der Name des Destruktors ist genau derselbe wie der Name der Klasse, außer dass ihm eine Tilde (~) vorangestellt wird~als Präfix. Er gibt keinen Wert zurück, darf keine Parameter haben, und jede Klasse kann nur einen Destruktor haben.

Das folgende Beispiel hilft, das Konzept der Destruktoren besser zu verstehen:

Beispiel

#include <iostream> using namespace std; class Line { public: Zeile(); // Konstruktor-Deklaration ~Zeile(); // Destruktor-Deklaration void setLength(double len); double getLength() const; private: double length; }; // Konstruktordefinition Line::Line() { cout << "Objekt wird erstellt" << endl; length = 0.0; } // Destruktor-Definition Line::~Line() { cout << "Objekt wird gelöscht" << endl; // Wenn dynamisch zugewiesene Ressourcen vorhanden sind, geben Sie sie hier frei, z. B. delete[] data; } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // Die Hauptfunktion des Programms int main() { Line line; // Wenn das Programm endet, wird der Destruktor automatisch aufgerufen // Länge setzen line.setLength(6.0); cout << "Länge der Zeile : " << line.getLength() << endl; return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Object is being created
Length of line : 6
Object is being deleted

C++ Klassen und Objekte

Weitere Erweiterungen