C++ Verplaatsconstructor

C Verplaatsconstructor



Programmeren in C++ is de beste taal omdat het ons een breed scala aan functies, constructors, headerbestanden, klassen en nog veel meer biedt, waardoor coderen interessanter en gemakkelijker wordt. Een van de constructors in C++-programmeren is de ‘move’-constructor. De ‘move’-constructor is een uniek soort constructor waarmee het eigendom van een dynamisch toegewezen geheugen of andere bronnen op een effectieve en hulpbronnenbewuste manier van het ene object naar het andere kan worden overgedragen.

Bij het programmeren in C++ werden ‘move’-constructors geïntroduceerd om duplicatie te verminderen en de efficiëntie te vergroten. Het speelt een cruciale rol bij het verbeteren van de prestaties door de kopieerbewerkingen te minimaliseren. Deze gids gaat dieper in op de “move”-constructor in C++-programmeren.







Voorbeeld 1:

Om de code hier te beginnen, voegen we de headerbestanden “iostream” en “string” toe die ervoor zorgen dat onze code perfect werkt, aangezien veel functies in deze headerbestanden worden gedeclareerd. Wanneer we de “cout” -instructie moeten gebruiken, wordt het “iostream” headerbestand gebruikt, aangezien deze functie hierin wordt gedeclareerd. Wanneer we met stringtypegegevens moeten werken, is het headerbestand “string” nodig.



Hierna wordt de “namespace std” toegevoegd onder deze headerbestanden. Vervolgens construeren we hier een klasse. De klassenaam is 'Verplaatsen'. Daaronder wordt het trefwoord “private” toegevoegd, waarin we een private stringvariabele declareren met de naam “my_str”. Nu plaatsen we het trefwoord ‘public’ waar we de definitie van de standaardconstructor toevoegen. We geven “Dit is de standaardtekenreeks hier” door aan de “my_str” als parameter en laten de standaardconstructor leeg.



Hierna kopiëren we de constructordefinitie en initialiseren we “my_str” naar “my_obj.my_str”. Hieronder drukken we een lijn af en plaatsen dan de definitie van de “move” -constructor. Hier initialiseren we “my_str” opnieuw met “my_obj.my_str”. We voegen hieronder geen verklaring toe; het is leeg. Hierna declareren we een functie met de naam “displayMyObject()” van het stringtype en gebruiken we de “return str” zodat deze de string retourneert.





We plaatsen de globale functie “new_temp” in het type “move”. Daaronder hebben we de “retourtemperatuur” die het verplaatsingstypeobject retourneert. Nu plaatsen we de “main()” drivercode en de “new_obj1” van het “move” type en halen de “move” constructor uit de “rvalue”. In de volgende regel plaatsen we de “new_obj1.displayMyObject()” om de “move” -constructor uit de “lvalue” te halen. Hierna roepen we de constructor “move” aan met het object “my_obj1”. Vervolgens dragen we het eigendom van “my_obj1” over aan het andere object dat “my_obj2” is.

Code1:

#include

#include

gebruik makend van naamruimte soa ;

klas Beweging

{

privaat :
tekenreeks mijn_str ;
openbaar :
Beweging ( ) : mijn_str ( 'Dit is hier de standaardtekenreeks' )
{
}
Beweging ( const Beweging & mijn_obj ) : mijn_str ( mijn_obj. mijn_str )
{


uit << 'Kopieerconstructor aangeroepen, verplaatsing mislukt! \N ' ;

}
Beweging ( Beweging && mijn_obj ) : mijn_str ( beweging ( mijn_obj. mijn_str ) )
{
}
string weergaveMijnObject ( )
{
opbrengst mijn_str ;
}
} ;
Verplaats nieuwe_temp ( Verplaats tmp )
{
opbrengst tmp ;
}
int voornaamst ( )
{
Verplaats new_obj1 = nieuwe_temp ( Beweging ( ) ) ;


uit << 'roep vóór move() aan: new_obj1 = ' << nieuwe_obj1. toonMijnObject ( ) << eindl ;

Verplaats new_obj2 = beweging ( nieuwe_obj1 ) ;

uit << 'na move() constructoraanroep: new_obj1 = ' << nieuwe_obj1. toonMijnObject ( ) << eindl ;

uit << 'na move() constructoraanroep: new_obj2 = ' << nieuw_obj2. toonMijnObject ( ) << eindl ;

opbrengst 0 ;

}

Uitgang:

De uitvoer geeft aan dat voordat de methode “move()” wordt aangeroepen, de “new_obj1” de standaardtekenreeks bevat. Maar na het aanroepen van de move()-methode van de klasse “Move”, bevat “my_obj1” een lege string en heeft “my_obj2” de standaardstring.



Voorbeeld 2:

Hier voegen we nog een headerbestand toe, het “vector” headerbestand. We nemen dit op wanneer we de bewerkingen op de vectoren moeten manipuleren. De klasse die we hier maken is de klasse 'Move'. We maken hier ook een 'openbare' constructor waarin we de ruwe pointer 'int* value' declareren als de gegevens van een klasselid. Daaronder hebben we de “public” waarin we de “Move” -constructor plaatsen en “int v1” als parameter doorgeven.

Hierna declareren we de objecten op een hoop. We initialiseren de “waarde” met “new int” en de “*value” met “v1”. Plaats vervolgens de 'cout' waar we een regel toevoegen die wordt afgedrukt wanneer we de code uitvoeren. Hieronder gebruiken we de ‘copy’-constructor. Deze “kopie”-constructor kopieert de gegevens door een diepe kopie te maken. We plaatsen de constructor “Move” en geven “Move&& new_source” door als parameter. Daaronder plaatsen we de “cout” die helpt bij het weergeven van de vereiste verklaring.

We voegen het zoekwoord 'nullptr' in om te bepalen of een aanwijzer leeg is voordat de verwijzing wordt gebruikt. Nu plaatsen we ook de “~Move()” destructor waarin we de “if” voorwaarde plaatsen die verifieert of de “waarde” niet gelijk is aan “nullptr”. Wanneer deze voorwaarde is geverifieerd, wordt de onderstaande instructie uitgevoerd. Als deze voorwaarde niet wordt geverifieerd, slaat het de “cout”-verklaring over die aanwezig is na de “if”-voorwaarde en gaat naar het “else”-gedeelte.

Hierna gebruiken we het trefwoord ‘delete’ dat helpt bij het ongedaan maken van de toewijzing van een object, of we kunnen zeggen dat het het geheugen vrijgeeft dat is toegewezen aan de gegevenscomponent van het object. Nu roepen we hier de methode “main()” aan en creëren de vector van onze klasse “Move” met de naam “my_vec”. Hierna gebruiken we de functie “push_back()” die helpt bij het invoegen van een waarde op het eindpunt van een vector. Het headerbestand “vector” bevat deze functie. Eerst voegen we “39” in de vector in. Vervolgens wordt “57” ingevoegd en “91” wordt ook ingevoegd door gebruik te maken van de “push_back()” -methode.

Code2:

#include

#include

gebruik makend van naamruimte soa ;

klas Beweging {

privaat :
int * waarde ;
openbaar :
Beweging ( int v1 )
{
waarde = nieuw int ;
* waarde = v1 ;

uit << 'De Constructeur wordt opgeroepen'

<< v1 << eindl ;

} ;
Beweging ( const Beweging & nieuwe bron )
: Beweging { * nieuwe bron. waarde }
{


uit << 'Kopieerconstructor heet -'

<< 'Diepe kopie voor'

<< * nieuwe bron. waarde

<< eindl ;

}
Beweging ( Beweging && nieuwe bron )
: waarde { nieuwe bron. waarde }
{


uit << 'Verplaats Constructor voor'

<< * nieuwe bron. waarde << eindl ;

nieuwe bron. waarde = nulptr ;

}
~Verplaatsen ( )
{
als ( waarde ! = nulptr )


uit << 'Destructor is nodig'

<< * waarde << eindl ;

anders

uit << 'Destructor wordt gebeld'

<< ' voor nullptr '

<< eindl ;

verwijderen waarde ;

}

} ;

int voornaamst ( )

{

vector < Beweging > mijn ding ;

mijn ding. terugduwen ( Beweging { 39 } ) ;
mijn ding. terugduwen ( Beweging { 57 } ) ;
mijn ding. terugduwen ( Beweging { 91 } ) ;
opbrengst 0 ;


}

Uitgang:

Dit laat zien dat we in plaats van de functie “kopiëren” de functie “verplaatsen” moeten gebruiken om de onnodige aanroep naar de functie “kopiëren” te voorkomen. De constructor “move” wordt hier aangeroepen wanneer we het object initialiseren met een tijdelijk object of een object dat zal worden vernietigd. In plaats van een diepe kopie van de gegeven gegevens te manipuleren, verschuift de ‘move’-constructor het eigendom van de bronnen van het ene object naar het andere.

Conclusie

In deze handleiding hebben we de constructor 'verplaatsen' onderzocht. We hebben uitgelegd dat de ‘move’-constructor in C++-programmeren een unieke methode is om de bronnen van een object effectief naar een ander object te verplaatsen. We hebben besproken dat het aanroepen van de ‘move’-constructor minder overhead met zich meebrengt, waardoor de code geheugenefficiënter wordt. We hebben onderzocht dat de ‘move’-constructor een krachtige functie is in C++-programmeren. We hebben ook de praktische voorbeelden gebruikt om het concept van de “move”-constructor te illustreren en de prestatievoordelen van het gebruik van de “move”-constructor in C++-programmering gedemonstreerd.