C++ perkėlimo konstruktorius

C Perkelimo Konstruktorius



C++ programavimas yra geriausia kalba, nes ji mums palengvina daugybę funkcijų, konstruktorių, antraščių failų, klasių ir daug daugiau, todėl kodavimas tampa įdomesnis ir lengvesnis. Vienas iš C++ programavimo konstruktorių yra „move“ konstruktorius. „Perkelti“ konstruktorius yra unikalus konstruktorius, leidžiantis dinamiškai paskirstytos atminties ar kitų išteklių nuosavybės teisę perkelti iš vieno objekto į kitą efektyviai ir nenaudojant išteklių.

Programuojant C++, buvo įdiegti „move“ konstruktoriai, siekiant sumažinti dubliavimą ir padidinti efektyvumą. Jis atlieka labai svarbų vaidmenį gerinant našumą sumažinant kopijavimo operacijas. Šiame vadove išsamiai nagrinėjamas C++ programavimo konstruktorius „judėti“.







1 pavyzdys:

Norėdami pradėti kodą čia, įtraukiame „iostream“ ir „string“ antraštės failus, kurie leis mūsų kodui veikti puikiai, nes šiuose antraštės failuose deklaruojama daug funkcijų. Kai turime naudoti „cout“ teiginį, naudojamas „iostream“ antraštės failas, nes ši funkcija deklaruojama jame. Kai turime dirbti su eilutės tipo duomenimis, būtinas „eilutės“ antraštės failas.



Po to po šiais antraščių failais pridedama vardų erdvė std. Tada čia sukuriame klasę. Klasės pavadinimas yra „Perkelti“. Po juo pridedamas raktinis žodis „privatus“, kuriame deklaruojame privačios eilutės kintamąjį pavadinimu „my_str“. Dabar įdedame „viešąjį“ raktinį žodį, kuriame pridedame numatytojo konstruktoriaus apibrėžimą. Kaip parametrą „Tai yra numatytoji eilutė“ perduodame į „my_str“ ir paliekame numatytąjį konstruktorių tuščią.



Po to nukopijuojame konstruktoriaus apibrėžimą ir inicijuojame 'my_str' į 'my_obj.my_str'. Po juo atspausdiname eilutę ir pateikiame konstruktoriaus „judėti“ apibrėžimą. Čia mes vėl inicijuojame „my_str“ su „my_obj.my_str“. Mes nepridedame jokio teiginio žemiau; jis tuščias. Po to paskelbiame eilutės tipo funkciją pavadinimu „displayMyObject()“ ir naudojame „return str“, kad ji grąžintų eilutę.





Pasaulinę funkciją „new_temp“ įdedame į „move“ tipą. Po juo turime „grįžimo temp“, kuris grąžina judėjimo tipo objektą. Dabar įdedame „main()“ tvarkyklės kodą ir „move“ tipo „new_obj1“ ir gauname „move“ konstruktorių iš „rvalue“. Eilutėje į priekį įdedame 'new_obj1.displayMyObject()', kad gautume 'move' konstruktorių iš 'lvalue'. Po to mes vadiname „move“ konstruktorių su objektu „my_obj1“. Tada perduodame „mano_objekto“ nuosavybės teisę kitam objektui, kuris yra „my_obj2“.

1 kodas:

#include

#include

naudojant vardų erdvė std ;

klasė Judėti

{

privatus :
string my_str ;
viešas :
Judėti ( ) : mano_str ( 'Čia yra numatytoji eilutė' )
{
}
Judėti ( konst Judėti & mano_objektas ) : mano_str ( mano_objektas. mano_str )
{


cout << „Iškviestas kopijavimo konstruktorius, perkelti nepavyko! \n ;

}
Judėti ( Judėti && mano_objektas ) : mano_str ( judėti ( mano_objektas. mano_str ) )
{
}
eilutė displayMyObject ( )
{
grąžinti mano_str ;
}
} ;
Perkelti naują_temp ( Perkelti tmp )
{
grąžinti tmp ;
}
tarpt pagrindinis ( )
{
Perkelti new_obj1 = naujas_temp ( Judėti ( ) ) ;


cout << 'prieš perkėlimą () skambinkite: new_obj1 = ' << naujas_objektas1. displayMyObject ( ) << endl ;

Perkelti new_obj2 = judėti ( naujas_objektas1 ) ;

cout << 'po move() konstruktoriaus iškvietimo : new_obj1 = ' << naujas_objektas1. displayMyObject ( ) << endl ;

cout << 'po move() konstruktoriaus iškvietimo : new_obj2 = ' << new_obj2. displayMyObject ( ) << endl ;

grąžinti 0 ;

}

Išvestis:

Išvestis rodo, kad prieš iškviečiant metodą „move()“, „new_obj1“ yra numatytoji eilutė. Tačiau iškvietus „Move“ klasės move() metodą, „my_obj1“ yra tuščia eilutė, o „my_obj2“ turi numatytąją eilutę.



2 pavyzdys:

Čia įtraukiame dar vieną antraštės failą, kuris yra „vektorinis“ antraštės failas. Tai įtraukiame, kai turime manipuliuoti vektoriais. Čia sukurta klasė yra „Perkelti“. Čia taip pat sukuriame „viešąjį“ konstruktorių, kuriame „int* vertės“ neapdorotą žymeklį deklaruojame kaip klasės nario duomenis. Po juo turime „viešą“, kurioje įdedame konstruktorių „Move“ ir kaip parametrą perduodame „int v1“.

Po to objektus deklaruojame krūvoje. „Vertę“ inicijuojame su „new int“, o „*value“ – su „v1“. Tada įdėkite „cout“, kur pridedame eilutę, kuri spausdinama, kai vykdome kodą. Žemiau mes naudojame konstruktorių „kopijuoti“. Šis „kopijos“ konstruktorius nukopijuoja duomenis darydamas gilią kopiją. Įdedame konstruktorių „Move“ ir kaip jo parametrą perduodame „Move&& new_source“. Po juo dedame „cout“, kuris padeda parodyti reikiamą teiginį.

Įterpiame raktinį žodį „nullptr“, kad nustatytume, ar rodyklė tuščia prieš naudojant nuorodą. Dabar taip pat įdedame destruktorių „~Move()“, į kurį įdedame sąlygą „if“, kuri patikrina, ar „reikšmė“ nėra lygi „nullptr“. Kai ši sąlyga patikrinama, vykdomas toliau pateiktas teiginys. Jei ši sąlyga nėra patikrinta, ji praleidžia teiginį „cout“, esantį po sąlygos „jei“, ir pereina prie dalies „else“.

Po to naudojame raktinį žodį „ištrinti“, kuris padeda panaikinti objekto paskirstymą arba galime sakyti, kad jis išlaisvina objekto duomenų komponentui skirtą atmintį. Dabar čia iškviečiame „main()“ metodą ir sukuriame „Move“ klasės vektorių pavadinimu „my_vec“. Po to naudojame funkciją „push_back()“, kuri padeda įterpti reikšmę vektoriaus galiniame taške. „Vector“ antraštės faile yra ši funkcija. Pirmiausia į vektorių įterpiame „39“. Tada įterpiamas „57“, o „91“ taip pat įterpiamas naudojant „push_back()“ metodą.

2 kodas:

#include

#įtraukti

naudojant vardų erdvė std ;

klasė Judėti {

privatus :
tarpt * vertė ;
viešas :
Judėti ( tarpt v1 )
{
vertė = naujas tarpt ;
* vertė = v1 ;

cout << „Kviečiamas konstruktorius“

<< v1 << endl ;

} ;
Judėti ( konst Judėti & naujas_ šaltinis )
: Judėti { * naujas_ šaltinis. vertė }
{


cout << 'Kopijavimo konstruktorius vadinamas -'

<< „Gili kopija“

<< * naujas_ šaltinis. vertė

<< endl ;

}
Judėti ( Judėti && naujas_ šaltinis )
: vertė { naujas_ šaltinis. vertė }
{


cout << „Move Constructor for“

<< * naujas_ šaltinis. vertė << endl ;

naujas_ šaltinis. vertė = nullptr ;

}
~ Judėti ( )
{
jeigu ( vertė ! = nullptr )


cout << „Pašauktas naikintojas“

<< * vertė << endl ;

Kitas

cout << „Destruktorius vadinamas“

<< 'for nullptr'

<< endl ;

Ištrinti vertė ;

}

} ;

tarpt pagrindinis ( )

{

vektorius < Judėti > mano_daiktas ;

mano_daiktas. pastumti atgal ( Judėti { 39 } ) ;
mano_daiktas. pastumti atgal ( Judėti { 57 } ) ;
mano_daiktas. pastumti atgal ( Judėti { 91 } ) ;
grąžinti 0 ;


}

Išvestis:

Tai rodo, kad užuot naudoję „kopijavimo“ funkciją, turime naudoti funkciją „perkelti“, kad išvengtume nereikalingo „kopijavimo“ funkcijos iškvietimo. „Perkelti“ konstruktorius čia iškviečiamas, kai inicijuojame objektą laikinu objektu arba kokiu nors objektu, kuris bus sunaikintas. Užuot manipuliavęs gilia pateiktų duomenų kopija, „perkėlimo“ konstruktorius perkelia išteklių nuosavybės teisę iš vieno objekto į kitą.

Išvada

Šiame vadove mes tyrinėjome „judėjimo“ konstruktorių. Paaiškinome, kad C++ programavimo konstruktorius „perkelti“ yra unikalus būdas efektyviai perkelti objekto išteklius į kitą objektą. Aptarėme, kad „move“ konstruktoriaus iškvietimas turi mažiau papildomų išlaidų, todėl kodas tampa efektyvesnis atmintyje. Ištyrėme faktą, kad „judėjimo“ konstruktorius yra galinga C++ programavimo funkcija. Mes taip pat panaudojome praktinius pavyzdžius, iliustruodami „move“ konstruktoriaus koncepciją ir pademonstravome „judėjimo“ konstruktoriaus panaudojimo C++ programavime našumo pranašumus.