C++ Move Constructor

C Move Constructor



C++ programmering er det bedste sprog, da det letter os med en bred vifte af funktioner, konstruktører, header-filer, klasser og meget mere, hvilket gør kodning mere interessant og lettere. En af konstruktørerne i C++-programmering er 'move'-konstruktøren. 'Move'-konstruktøren er en unik form for konstruktør, der gør det muligt at overføre ejerskab af en dynamisk allokeret hukommelse eller andre ressourcer fra et objekt til et andet på en effektiv og ressourcebevidst måde.

I C++-programmering blev 'move'-konstruktører introduceret for at reducere duplikeringen og øge effektiviteten. Det spiller en afgørende rolle i at forbedre ydeevnen ved at minimere kopieringsoperationerne. Denne guide udforsker dybt om 'move'-konstruktøren i C++-programmering.







Eksempel 1:

For at begynde koden her inkluderer vi 'iostream' og 'string' header-filer, der vil få vores kode til at køre perfekt, da mange funktioner er erklæret i disse header-filer. Når vi skal bruge 'cout'-sætningen, bruges 'iostream'-headerfilen, da denne funktion er erklæret inde i denne. Når vi skal arbejde med strengtypedataene, er 'streng'-headerfilen nødvendig.



Herefter tilføjes 'namespace std' under disse header-filer. Så konstruerer vi en klasse her. Klassens navn er 'Move'. Under dette tilføjes nøgleordet 'privat', hvori vi erklærer en privat strengvariabel med navnet 'my_str'. Nu placerer vi det 'offentlige' søgeord, hvor vi tilføjer definitionen af ​​standardkonstruktøren. Vi sender 'Dette er standardstrengen her' til 'my_str' som parameter og lader standardkonstruktøren være tom.



Efter dette kopierer vi konstruktørdefinitionen og initialiserer 'my_str' til 'my_obj.my_str'. Under dette udskriver vi en linje og placerer derefter definitionen af ​​'move'-konstruktøren. Her initialiserer vi 'my_str' igen med 'my_obj.my_str'. Vi tilføjer ikke nogen udtalelse under dette; den er tom. Efter dette erklærer vi en funktion ved navn 'displayMyObject()' af strengtype og bruger 'return str', så den returnerer strengen.





Vi placerer den globale 'new_temp'-funktion i 'move'-typen. Under den har vi 'retur temp', som returnerer flyttetypen objektet. Nu placerer vi 'main()'-driverkoden og 'new_obj1' af 'move'-typen og henter 'move'-konstruktøren fra 'rvalue'. I linjen foran placerer vi 'new_obj1.displayMyObject()' for at hente 'move'-konstruktøren fra 'lvalue'. Efter dette kalder vi 'move'-konstruktøren med 'my_obj1'-objektet. Derefter overfører vi ejerskabet af 'my_obj1' til det andet objekt, som er 'my_obj2'.

Kode 1:

#include

#include

ved brug af navneområde std ;

klasse Bevæge sig

{

privat :
streng min_str ;
offentlig :
Bevæge sig ( ) : min_str ( 'Dette er standardstrengen her' )
{
}
Bevæge sig ( konst Bevæge sig & mit_objekt ) : min_str ( mit_objekt. min_str )
{


cout << 'Kopikonstruktøren er påberåbt, flytningen mislykkedes! \n ' ;

}
Bevæge sig ( Bevæge sig && mit_objekt ) : min_str ( bevæge sig ( mit_objekt. min_str ) )
{
}
streng displayMyObject ( )
{
Vend tilbage min_str ;
}
} ;
Flyt new_temp ( Flyt tmp )
{
Vend tilbage tmp ;
}
int vigtigste ( )
{
Flyt new_obj1 = ny_temp ( Bevæge sig ( ) ) ;


cout << 'before move() call : new_obj1 = ' << ny_objekt1. displayMyObject ( ) << endl ;

Flyt new_obj2 = bevæge sig ( ny_objekt1 ) ;

cout << 'after move() constructor call: new_obj1 = ' << ny_objekt1. displayMyObject ( ) << endl ;

cout << 'after move() constructor call: new_obj2 = ' << ny_objekt2. displayMyObject ( ) << endl ;

Vend tilbage 0 ;

}

Produktion:

Outputtet viser, at før 'move()'-metoden kaldes, indeholder 'new_obj1' standardstrengen. Men efter at have kaldt 'Move'-klassen move()-metoden, indeholder 'my_obj1' en tom streng, og 'my_obj2' har standardstrengen.



Eksempel 2:

Her inkluderer vi endnu en header-fil, som er 'vektor'-header-filen. Vi inkluderer dette, når vi skal manipulere operationerne på vektorerne. Klassen, som vi opretter her, er 'Move'-klassen. Vi opretter også en 'offentlig' konstruktør her, hvor vi erklærer 'int* value'-råmarkøren for at være et klassemedlems data. Under den har vi 'public', hvori vi placerer 'Move'-konstruktøren og sender 'int v1' som parameter.

Herefter erklærer vi objekterne i en bunke. Vi initialiserer 'værdien' med 'ny int' og '*værdien' med 'v1'. Placer derefter 'cout', hvor vi tilføjer en linje, der udskrives, når vi udfører koden. Herunder bruger vi 'kopi'-konstruktøren. Denne 'kopi'-konstruktør kopierer dataene ved at lave en dyb kopi. Vi placerer 'Move'-konstruktøren og sender 'Move&& new_source' som dens parameter. Under den placerer vi 'cout', som hjælper med at vise den påkrævede erklæring.

Vi indsætter søgeordet 'nullptr' for at afgøre, om en markør er tom, før referencen bruges. Nu placerer vi også '~Move()'-destruktoren, hvori vi placerer 'hvis'-betingelsen, som verificerer, om 'værdien' ikke er lig med 'nullptr'. Når denne betingelse er verificeret, udføres sætningen nedenfor. Hvis denne betingelse ikke er verificeret, springer den 'cout'-sætningen over, som er til stede efter 'hvis'-betingelsen, og bevæger sig mod 'andet'-delen.

Efter dette bruger vi nøgleordet 'delete', som hjælper med at deallokere et objekt, eller vi kan sige, at det frigiver den hukommelse, der er allokeret til objektets datakomponent. Nu påberåber vi os 'main()'-metoden her og opretter vektoren for vores 'Move'-klasse med navnet 'my_vec'. Herefter bruger vi funktionen 'push_back()', der hjælper med at indsætte en værdi ved en vektors endepunkt. 'Vektor'-headerfilen indeholder denne funktion. Først indsætter vi '39' i vektoren. Derefter indsættes '57' og '91' indsættes også ved at bruge 'push_back()'-metoden.

Kode 2:

#include

#inkluder

ved brug af navneområde std ;

klasse Bevæge sig {

privat :
int * værdi ;
offentlig :
Bevæge sig ( int v1 )
{
værdi = ny int ;
* værdi = v1 ;

cout << 'Konstruktøren er tilkaldt'

<< v1 << endl ;

} ;
Bevæge sig ( konst Bevæge sig & ny_kilde )
: Bevæge sig { * ny_kilde. værdi }
{


cout << 'Copy Constructor hedder -'

<< 'Dyb kopi for'

<< * ny_kilde. værdi

<< endl ;

}
Bevæge sig ( Bevæge sig && ny_kilde )
: værdi { ny_kilde. værdi }
{


cout << 'Flyt konstruktør for'

<< * ny_kilde. værdi << endl ;

ny_kilde. værdi = nullptr ;

}
~Bevæg dig ( )
{
hvis ( værdi ! = nullptr )


cout << 'Destructor er tilkaldt'

<< * værdi << endl ;

andet

cout << 'Destructor kaldes'

<< 'for nullptr'

<< endl ;

slette værdi ;

}

} ;

int vigtigste ( )

{

vektor < Bevæge sig > min_ting ;

min_ting. skub tilbage ( Bevæge sig { 39 } ) ;
min_ting. skub tilbage ( Bevæge sig { 57 } ) ;
min_ting. skub tilbage ( Bevæge sig { 91 } ) ;
Vend tilbage 0 ;


}

Produktion:

Dette viser, at i stedet for at bruge 'kopi'-funktionen, skal vi bruge 'flytte'-funktionen for at forhindre det unødvendige opkald til 'kopi'-funktionen. 'Move'-konstruktøren påkaldes her, når vi initialiserer objektet med et midlertidigt objekt eller et objekt, der vil blive ødelagt. I stedet for at manipulere en dyb kopi af de givne data, flytter 'move'-konstruktøren ejerskabet af ressourcerne fra et objekt til et andet.

Konklusion

I denne guide udforskede vi om 'move'-konstruktøren. Vi forklarede, at 'move'-konstruktøren i C++-programmering er en unik metode til effektivt at flytte et objekts ressourcer til et andet objekt. Vi diskuterede, at det at kalde 'move'-konstruktøren har mindre overhead, hvilket gør koden mere hukommelseseffektiv. Vi undersøgte det faktum, at 'move'-konstruktøren er en kraftfuld funktion i C++-programmering. Vi brugte også de praktiske eksempler til at illustrere konceptet med 'move'-konstruktøren og demonstrerede ydeevnefordelene ved at bruge 'move'-konstruktøren i C++-programmering.