C++-Move-Konstruktor

C Move Konstruktor



C++-Programmierung ist die beste Sprache, da sie uns eine breite Palette an Funktionen, Konstruktoren, Header-Dateien, Klassen und vielem mehr bietet und das Codieren interessanter und einfacher macht. Einer der Konstruktoren in der C++-Programmierung ist der „move“-Konstruktor. Der „Move“-Konstruktor ist eine einzigartige Art von Konstruktor, der es ermöglicht, den Besitz eines dynamisch zugewiesenen Speichers oder anderer Ressourcen auf effektive und ressourcenschonende Weise von einem Objekt auf ein anderes zu übertragen.

In der C++-Programmierung wurden „Move“-Konstruktoren eingeführt, um die Duplizierung zu reduzieren und die Effizienz zu steigern. Es spielt eine entscheidende Rolle bei der Verbesserung der Leistung, indem es die Kopiervorgänge minimiert. Dieser Leitfaden befasst sich eingehend mit dem „move“-Konstruktor in der C++-Programmierung.







Beispiel 1:

Um hier mit dem Code zu beginnen, fügen wir die Header-Dateien „iostream“ und „string“ hinzu, die dafür sorgen, dass unser Code perfekt läuft, da viele Funktionen in diesen Header-Dateien deklariert sind. Wenn wir die „cout“-Anweisung verwenden müssen, wird die Header-Datei „iostream“ verwendet, da diese Funktion darin deklariert wird. Wenn wir mit Daten vom Typ String arbeiten müssen, ist die Header-Datei „String“ erforderlich.



Anschließend wird unterhalb dieser Header-Dateien der „Namespace std“ hinzugefügt. Dann erstellen wir hier eine Klasse. Der Klassenname ist „Move“. Darunter wird das Schlüsselwort „private“ hinzugefügt, in dem wir eine private String-Variable mit dem Namen „my_str“ deklarieren. Jetzt platzieren wir das Schlüsselwort „public“ dort, wo wir die Definition des Standardkonstruktors hinzufügen. Wir übergeben „Dies ist hier die Standardzeichenfolge“ als Parameter an „my_str“ und lassen den Standardkonstruktor leer.



Danach kopieren wir die Konstruktordefinition und initialisieren „my_str“ auf „my_obj.my_str“. Darunter drucken wir eine Zeile und platzieren dann die Definition des „move“-Konstruktors. Hier initialisieren wir „my_str“ erneut mit „my_obj.my_str“. Wir fügen darunter keine Aussage hinzu; es ist leer. Danach deklarieren wir eine Funktion mit dem Namen „displayMyObject()“ vom Typ „String“ und verwenden „return str“, damit sie den String zurückgibt.





Wir platzieren die globale Funktion „new_temp“ im Typ „move“. Darunter befindet sich „return temp“, das das Bewegungstypobjekt zurückgibt. Nun platzieren wir den Treibercode „main()“ und „new_obj1“ vom Typ „move“ und erhalten den Konstruktor „move“ aus dem „rvalue“. In der Zeile davor platzieren wir „new_obj1.displayMyObject()“, um den „move“-Konstruktor aus dem „lvalue“ zu erhalten. Danach rufen wir den „move“-Konstruktor mit dem „my_obj1“-Objekt auf. Dann übertragen wir den Besitz von „my_obj1“ auf das andere Objekt, nämlich „my_obj2“.

Code 1:

#include

#include

verwenden Namensraum std ;

Klasse Bewegen

{

Privat :
string my_str ;
öffentlich :
Bewegen ( ) : meine_str ( „Dies ist hier die Standardzeichenfolge“ )
{
}
Bewegen ( const Bewegen & mein_obj ) : meine_str ( mein_obj. meine_str )
{


cout << „Kopierkonstruktor aufgerufen, Verschiebung fehlgeschlagen! \N ' ;

}
Bewegen ( Bewegen && mein_obj ) : meine_str ( bewegen ( mein_obj. meine_str ) )
{
}
Zeichenfolge displayMyObject ( )
{
zurückkehren meine_str ;
}
} ;
Verschieben Sie new_temp ( Temp. verschieben )
{
zurückkehren tmp ;
}
int hauptsächlich ( )
{
Verschiebe new_obj1 = new_temp ( Bewegen ( ) ) ;


cout << „vor dem Aufruf von move(): new_obj1 =“ << new_obj1. displayMyObject ( ) << endl ;

Verschiebe new_obj2 = bewegen ( new_obj1 ) ;

cout << „nach move()-Konstruktoraufruf: new_obj1 =“ << new_obj1. displayMyObject ( ) << endl ;

cout << „nach move()-Konstruktoraufruf: new_obj2 =“ << new_obj2. displayMyObject ( ) << endl ;

zurückkehren 0 ;

}

Ausgabe:

Die Ausgabe zeigt, dass vor dem Aufruf der Methode „move()“ „new_obj1“ die Standardzeichenfolge enthält. Aber nach dem Aufruf der Methode move() der Klasse „Move“ enthält „my_obj1“ eine leere Zeichenfolge und „my_obj2“ die Standardzeichenfolge.



Beispiel 2:

Hier fügen wir eine weitere Header-Datei hinzu, nämlich die „Vektor“-Header-Datei. Wir schließen dies immer dann ein, wenn wir die Operationen an den Vektoren manipulieren müssen. Die Klasse, die wir hier erstellen, ist die Klasse „Move“. Wir erstellen hier auch einen „öffentlichen“ Konstruktor, in dem wir den Rohzeiger „int* value“ als Daten eines Klassenmitglieds deklarieren. Darunter befindet sich das „public“, in dem wir den Konstruktor „Move“ platzieren und als Parameter „int v1“ übergeben.

Danach deklarieren wir die Objekte in einem Heap. Den „value“ initialisieren wir mit „new int“ und den „*value“ mit „v1“. Platzieren Sie dann „cout“ dort, wo wir eine Zeile hinzufügen, die gedruckt wird, wenn wir den Code ausführen. Darunter verwenden wir den „Copy“-Konstruktor. Dieser „Kopier“-Konstruktor kopiert die Daten, indem er eine tiefe Kopie erstellt. Wir platzieren den Konstruktor „Move“ und übergeben als Parameter „Move&& new_source“. Darunter platzieren wir das „cout“, das bei der Anzeige der erforderlichen Anweisung hilft.

Wir fügen das Schlüsselwort „nullptr“ ein, um festzustellen, ob ein Zeiger leer ist, bevor die Referenz verwendet wird. Jetzt platzieren wir auch den Destruktor „~Move()“, in dem wir die „if“-Bedingung platzieren, die überprüft, ob der „value“ nicht gleich „nullptr“ ist. Wenn diese Bedingung erfüllt ist, wird die folgende Anweisung ausgeführt. Wenn diese Bedingung nicht überprüft wird, wird die „cout“-Anweisung, die nach der „if“-Bedingung steht, übersprungen und zum „else“-Teil übergegangen.

Danach verwenden wir das Schlüsselwort „delete“, das bei der Freigabe eines Objekts hilft, oder wir können sagen, dass es den Speicher freigibt, der der Datenkomponente des Objekts zugewiesen ist. Nun rufen wir hier die Methode „main()“ auf und erstellen den Vektor unserer Klasse „Move“ mit dem Namen „my_vec“. Danach verwenden wir die Funktion „push_back()“, die dabei hilft, einen Wert am Endpunkt eines Vektors einzufügen. Die Header-Datei „vector“ enthält diese Funktion. Zuerst fügen wir „39“ in den Vektor ein. Dann wird „57“ eingefügt und „91“ wird ebenfalls eingefügt, indem die Methode „push_back()“ verwendet wird.

Code 2:

#include

#include

verwenden Namensraum std ;

Klasse Bewegen {

Privat :
int * Wert ;
öffentlich :
Bewegen ( int v1 )
{
Wert = neu int ;
* Wert = v1 ;

cout << „Der Konstrukteur ist gefragt“

<< v1 << endl ;

} ;
Bewegen ( const Bewegen & neue Quelle )
: Bewegen { * neue Quelle. Wert }
{


cout << „Der Kopierkonstruktor heißt –“

<< „Tiefe Kopie für“

<< * neue Quelle. Wert

<< endl ;

}
Bewegen ( Bewegen && neue Quelle )
: Wert { neue Quelle. Wert }
{


cout << „Verschiebekonstruktor für“

<< * neue Quelle. Wert << endl ;

neue Quelle. Wert = nullptr ;

}
~Bewegen ( )
{
Wenn ( Wert ! = nullptr )


cout << „Destruktor ist gefragt“

<< * Wert << endl ;

anders

cout << „Destruktor heißt“

<< „für nullptr“

<< endl ;

löschen Wert ;

}

} ;

int hauptsächlich ( )

{

Vektor < Bewegen > meine Sache ;

meine Sache. push_back ( Bewegen { 39 } ) ;
meine Sache. push_back ( Bewegen { 57 } ) ;
meine Sache. push_back ( Bewegen { 91 } ) ;
zurückkehren 0 ;


}

Ausgabe:

Dies zeigt, dass wir anstelle der Funktion „Kopieren“ die Funktion „Verschieben“ verwenden müssen, um den unnötigen Aufruf der Funktion „Kopieren“ zu verhindern. Der „move“-Konstruktor wird hier aufgerufen, wenn wir das Objekt mit einem temporären Objekt oder einem Objekt initialisieren, das zerstört wird. Anstatt eine tiefe Kopie der gegebenen Daten zu manipulieren, verschiebt der „move“-Konstruktor den Besitz der Ressourcen von einem Objekt auf ein anderes.

Abschluss

In diesem Leitfaden haben wir uns mit dem „move“-Konstruktor befasst. Wir haben erklärt, dass der „Move“-Konstruktor in der C++-Programmierung eine einzigartige Methode ist, um die Ressourcen eines Objekts effektiv auf ein anderes Objekt zu verlagern. Wir haben besprochen, dass der Aufruf des „move“-Konstruktors weniger Overhead verursacht und den Code dadurch speichereffizienter macht. Wir haben die Tatsache untersucht, dass der „move“-Konstruktor eine leistungsstarke Funktion in der C++-Programmierung ist. Wir nutzten die praktischen Beispiele auch, um das Konzept des „Move“-Konstruktors zu veranschaulichen und die Leistungsvorteile der Verwendung des „Move“-Konstruktors in der C++-Programmierung zu demonstrieren.