C++ teisaldamise konstruktor

C Teisaldamise Konstruktor



C++ programmeerimine on parim keel, kuna see hõlbustab meid paljude funktsioonide, konstruktorite, päisefailide, klasside ja palju muuga, muutes kodeerimise huvitavamaks ja lihtsamaks. Üks C++ programmeerimise konstruktoritest on “move” konstruktor. Liikumiskonstruktor on ainulaadne konstruktor, mis võimaldab dünaamiliselt eraldatud mälu või muude ressursside omandiõigust ühelt objektilt teisele tõhusal ja ressursiteadlikul viisil üle kanda.

C++ programmeerimises võeti dubleerimise vähendamiseks ja tõhususe suurendamiseks kasutusele “move” konstruktorid. See mängib jõudluse parandamisel otsustavat rolli, minimeerides paljundustoiminguid. See juhend uurib põhjalikult C++ programmeerimise konstruktorit 'teisaldamine'.







Näide 1:

Koodi alustamiseks siin lisame päisefailid 'iostream' ja 'string', mis panevad meie koodi ideaalselt töötama, kuna nendes päisefailides on deklareeritud palju funktsioone. Kui peame kasutama lauset 'cout', kasutatakse päisefaili 'iostream', kuna see funktsioon on selles deklareeritud. Kui peame töötama stringitüübi andmetega, on stringi päisefail vajalik.



Pärast seda lisatakse nende päisefailide alla nimeruum std. Seejärel ehitame siia klassi. Klassi nimi on “Move”. Selle alla on lisatud märksõna 'privaatne', milles deklareerime privaatse stringi muutuja nimega 'my_str'. Nüüd asetame märksõna 'avalik', kuhu lisame vaikekonstruktori määratluse. Me edastame 'See on vaikestring siin' parameetriks 'my_str' ja jätame vaikekonstruktori tühjaks.



Pärast seda kopeerime konstruktori määratluse ja lähtestame 'my_str' väärtuseks 'my_obj.my_str'. Selle alla prindime rea ja asetame seejärel konstruktori “teisaldamise” definitsiooni. Siin initsialiseerime 'my_str' uuesti 'my_obj.my_str'. Me ei lisa selle alla ühtegi avaldust; see on tühi. Pärast seda deklareerime stringi tüüpi funktsiooni nimega 'displayMyObject()' ja kasutame 'return str', et see tagastaks stringi.





Asetame globaalse funktsiooni 'new_temp' tüüpi 'move'. Selle all on „tagasi temp”, mis tagastab käigutüüpi objekti. Nüüd asetame draiveri koodi 'main()' ja 'move' tüüpi 'new_obj1' ning saame 'rvalue'-st konstruktori 'move'. Eesolevale reale asetame 'new_obj1.displayMyObject()', et saada 'lvalue'-st konstruktor 'move'. Pärast seda kutsume konstruktorit “move” objektiga “my_obj1”. Seejärel anname objekti 'my_obj1' omandiõiguse üle teisele objektile, mis on 'minu_obj2'.

Kood 1:

#include

#include

kasutades nimeruum std ;

klass Liiguta

{

privaatne :
string minu_str ;
avalik :
Liiguta ( ) : minu_str ( 'See on siin vaikestring' )
{
}
Liiguta ( konst Liiguta & minu_objekt ) : minu_str ( minu_objekt. minu_str )
{


cout << 'Koopiakonstruktor on käivitatud, teisaldamine ebaõnnestus! \n ' ;

}
Liiguta ( Liiguta && minu_objekt ) : minu_str ( liigutada ( minu_objekt. minu_str ) )
{
}
string displayMyObject ( )
{
tagasi minu_str ;
}
} ;
Teisalda uus_temp ( Liiguta tmp )
{
tagasi tmp ;
}
int peamine ( )
{
Teisalda uus_obj1 = uus_temp ( Liiguta ( ) ) ;


cout << 'enne move() call : new_obj1 = ' << uus_objekt1. kuva MinuObject ( ) << endl ;

Teisalda uus_obj2 = liigutada ( uus_objekt1 ) ;

cout << 'pärast move() konstruktori kutset : new_obj1 = ' << uus_objekt1. kuva MinuObject ( ) << endl ;

cout << 'pärast move() konstruktori kutset : new_obj2 = ' << uus_objekt2. kuva MinuObject ( ) << endl ;

tagasi 0 ;

}

Väljund:

Väljund renderdab, et enne meetodi “move()” kutsumist sisaldab “new_obj1” vaikestringi. Kuid pärast klassi move() meetodi 'Move' kutsumist sisaldab 'my_obj1' tühja stringi ja 'my_obj2' on vaikestringiga.



Näide 2:

Siia lisame veel ühe päisefaili, mis on 'vektor' päisefail. Kaasame selle alati, kui peame vektoritega tehtavaid toiminguid manipuleerima. Klass, mille me siin loome, on klass „Teisalda”. Samuti loome siin 'avaliku' konstruktori, milles deklareerime toorosuti 'int* väärtus' klassiliikme andmeteks. Selle all on meil „avalik”, kuhu asetame konstruktori „Move” ja anname selle parameetriks „int v1”.

Pärast seda deklareerime objektid hunnikus. Initsialiseerime 'väärtuse' väärtusega 'new int' ja '*value' väärtusega 'v1'. Seejärel asetage 'cout', kuhu lisame rea, mis prinditakse koodi täitmisel. Selle all kasutame konstruktorit 'koopia'. See 'koopia' konstruktor kopeerib andmed, tehes sügava koopia. Asetame konstruktori “Move” ja anname selle parameetriks “Move&& new_source”. Selle alla asetame 'cout', mis aitab kuvada vajalikku avaldust.

Sisestame märksõna „nullptr”, et teha kindlaks, kas kursor on enne viite kasutamist tühi. Nüüd asetame ka hävitaja '~Move()', millesse asetame tingimuse 'if', mis kontrollib, kas 'väärtus' ei ole võrdne 'nullptr'-ga. Kui see tingimus on kontrollitud, täidetakse allolev avaldus. Kui seda tingimust ei kontrollita, jätab see vahele lause 'cout', mis on pärast tingimust 'if' ja liigub osa 'muu' poole.

Pärast seda kasutame märksõna 'kustuta', mis aitab objekti eraldada või võib öelda, et see vabastab objekti andmekomponendile eraldatud mälu. Nüüd kutsume siin esile meetodi 'main()' ja loome oma klassi 'Move' vektori nimega 'my_vec'. Pärast seda kasutame funktsiooni 'push_back()', mis aitab sisestada väärtuse vektori lõpp-punkti. 'Vektor' päisefail sisaldab seda funktsiooni. Esiteks sisestame vektorisse '39'. Seejärel lisatakse '57' ja '91' samuti, kasutades 'push_back()' meetodit.

Kood 2:

#include

#include

kasutades nimeruum std ;

klass Liiguta {

privaatne :
int * väärtus ;
avalik :
Liiguta ( int v1 )
{
väärtus = uus int ;
* väärtus = v1 ;

cout << 'Ehitaja on kutsutud'

<< v1 << endl ;

} ;
Liiguta ( konst Liiguta & uus_allikas )
: Liiguta { * uus_allikas. väärtus }
{


cout << 'Koopiakonstruktori nimi on -'

<< 'Deep copy for'

<< * uus_allikas. väärtus

<< endl ;

}
Liiguta ( Liiguta && uus_allikas )
: väärtus { uus_allikas. väärtus }
{


cout << 'Move Constructor for'

<< * uus_allikas. väärtus << endl ;

uus_allikas. väärtus = nullptr ;

}
~Liikuge ( )
{
kui ( väärtus ! = nullptr )


cout << 'Hävitajat kutsutakse'

<< * väärtus << endl ;

muidu

cout << 'Hävitajat kutsutakse'

<< ' nullptr jaoks '

<< endl ;

kustutada väärtus ;

}

} ;

int peamine ( )

{

vektor < Liiguta > minu_asi ;

minu_asi. lükka tagasi ( Liiguta { 39 } ) ;
minu_asi. lükka tagasi ( Liiguta { 57 } ) ;
minu_asi. lükka tagasi ( Liiguta { 91 } ) ;
tagasi 0 ;


}

Väljund:

See näitab, et funktsiooni 'kopeerimine' asemel peame kasutama funktsiooni 'teisaldamine', et vältida tarbetut 'kopeerimis' funktsiooni kutsumist. Siin käivitatakse teisaldamise konstruktor, kui initsialiseerime objekti ajutise objektiga või mõne objektiga, mis hävitatakse. Selle asemel, et manipuleerida antud andmete sügava koopiaga, nihutab “teisaldamise” konstruktor ressursside omandiõiguse ühelt objektilt teisele.

Järeldus

Selles juhendis uurisime teisaldamise konstruktorit. Selgitasime, et C++ programmeerimise konstruktor 'teisaldamine' on ainulaadne meetod objekti ressursside tõhusaks teisele objektile ümberpaigutamiseks. Arutasime, et „move” konstruktori kutsumisel on vähem üldkulusid, muutes koodi mälutõhusamaks. Uurisime tõsiasja, et teisaldamise konstruktor on C++ programmeerimise võimas funktsioon. Samuti kasutasime praktilisi näiteid, et illustreerida konstruktori 'teisaldamine' kontseptsiooni ja demonstreerisime C++ programmeerimises 'teisaldamise' konstruktori kasutamise eeliseid.