C++ Move Constructor

C Move Constructor



Programovanie v C++ je najlepší jazyk, pretože nám uľahčuje širokú škálu funkcií, konštruktorov, hlavičkových súborov, tried a oveľa viac, vďaka čomu je kódovanie zaujímavejšie a jednoduchšie. Jedným z konštruktorov v programovaní v C++ je konštruktor „pohyb“. Konštruktor „presun“ je jedinečný druh konštruktora, ktorý umožňuje prenášať vlastníctvo dynamicky alokovanej pamäte alebo iných zdrojov z jedného objektu na druhý efektívnym spôsobom s ohľadom na zdroje.

V programovaní v C++ boli zavedené konštruktory „pohyb“, aby sa znížila duplicita a zvýšila účinnosť. Zohráva kľúčovú úlohu pri zlepšovaní výkonu minimalizovaním operácií kopírovania. Táto príručka podrobne skúma konštruktor „presun“ v programovaní C++.







Príklad 1:

Na začiatok kódu tu uvádzame hlavičkové súbory „iostream“ a „reťazec“, vďaka ktorým bude náš kód fungovať perfektne, pretože v týchto hlavičkových súboroch je deklarovaných veľa funkcií. Keď musíme použiť príkaz „cout“, použije sa hlavičkový súbor „iostream“, pretože táto funkcia je v ňom deklarovaná. Keď musíme pracovať s údajmi typu reťazec, je potrebný hlavičkový súbor „string“.



Potom sa pod tieto hlavičkové súbory pridá „namespace std“. Potom tu vytvoríme triedu. Názov triedy je „Presunúť“. Pod ním sa pridáva kľúčové slovo „private“, v ktorom deklarujeme premennú súkromného reťazca s názvom „my_str“. Teraz umiestnime kľúčové slovo „public“, kam pridáme definíciu predvoleného konštruktora. Do parametra „my_str“ odovzdáme „Toto je predvolený reťazec“ a predvolený konštruktor necháme prázdny.



Potom skopírujeme definíciu konštruktora a inicializujeme „my_str“ na „my_obj.my_str“. Pod tým vytlačíme riadok a potom umiestnime definíciu konštruktora „presunúť“. Tu znova inicializujeme „my_str“ pomocou „my_obj.my_str“. Pod toto nepridávame žiadne vyhlásenie; je prázdny. Potom deklarujeme funkciu s názvom „displayMyObject()“ typu reťazec a použijeme „return str“, takže vráti reťazec.





Globálnu funkciu „new_temp“ umiestnime do typu „presunúť“. Pod ním máme „return temp“, ktorý vracia objekt typu move. Teraz umiestnime kód ovládača „main()“ a „new_obj1“ typu „move“ a získame konštruktor „move“ z „rvalue“. Na riadok dopredu umiestnime „new_obj1.displayMyObject()“, aby sme získali konštruktor „presunúť“ z „lvalue“. Potom zavoláme konštruktor „presunúť“ s objektom „my_obj1“. Potom prevedieme vlastníctvo „my_obj1“ na druhý objekt, ktorým je „my_obj2“.

Kód 1:

#include

#include

použitím menný priestor std ;

trieda Pohybujte sa

{

súkromné :
reťazec môj_str ;
verejnosti :
Pohybujte sa ( ) : my_str ( 'Toto je predvolený reťazec tu' )
{
}
Pohybujte sa ( konšt Pohybujte sa & my_obj ) : my_str ( my_obj. my_str )
{


cout << 'Bol vyvolaný konštruktor kopírovania, presun zlyhal! \n ' ;

}
Pohybujte sa ( Pohybujte sa && my_obj ) : my_str ( pohybovať sa ( my_obj. my_str ) )
{
}
string displayMyObject ( )
{
vrátiť my_str ;
}
} ;
Presunúť new_temp ( Presunúť tmp )
{
vrátiť tmp ;
}
int Hlavná ( )
{
Presunúť new_obj1 = new_temp ( Pohybujte sa ( ) ) ;


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

Presunúť new_obj2 = pohybovať sa ( new_obj1 ) ;

cout << 'po zavolaní konštruktora move() : new_obj1 = ' << new_obj1. displayMyObject ( ) << endl ;

cout << 'po zavolaní konštruktora move() : new_obj2 = ' << new_obj2. displayMyObject ( ) << endl ;

vrátiť 0 ;

}

Výkon:

Výstup vykreslí, že pred volaním metódy „move()“ obsahuje „new_obj1“ predvolený reťazec. Ale po zavolaní metódy move() triedy „Move“ obsahuje „my_obj1“ prázdny reťazec a „my_obj2“ má predvolený reťazec.



Príklad 2:

Tu uvádzame ešte jeden hlavičkový súbor, ktorým je „vektorový“ hlavičkový súbor. Zahrnieme to vždy, keď musíme manipulovať s operáciami s vektormi. Trieda, ktorú tu vytvoríme, je trieda „Presunúť“. Tu tiež vytvoríme „verejný“ konštruktor, v ktorom deklarujeme nespracovaný ukazovateľ „int* value“ za údaje člena triedy. Pod ním máme „public“, do ktorého umiestnime konštruktor „Move“ a ako jeho parameter odovzdáme „int v1“.

Potom deklarujeme objekty v hromade. Inicializujeme „value“ s „new int“ a „*value“ s „v1“. Potom umiestnite „cout“ tam, kde pridáme riadok, ktorý sa vytlačí pri spustení kódu. Pod tým používame konštruktor „kopírovať“. Tento „kopírovací“ konštruktor skopíruje údaje vytvorením hlbokej kópie. Umiestnime konštruktor „Move“ a ako jeho parameter odovzdáme „Move&& new_source“. Pod ním umiestnime „cout“, ktorý pomáha pri zobrazovaní požadovaného výpisu.

Pred použitím referencie vložíme kľúčové slovo „nullptr“, aby sme určili, či je ukazovateľ prázdny. Teraz tiež umiestnime deštruktor „~Move()“, do ktorého umiestnime podmienku „if“, ktorá overí, či sa „hodnota“ nerovná „nullptr“. Keď je táto podmienka overená, vykoná sa príkaz uvedený nižšie. Ak táto podmienka nie je overená, preskočí príkaz „cout“, ktorý je prítomný po podmienke „if“, a presunie sa k časti „else“.

Potom použijeme kľúčové slovo „delete“, ktoré pomáha pri uvoľnení objektu alebo môžeme povedať, že uvoľňuje pamäť, ktorá je pridelená dátovému komponentu objektu. Teraz tu vyvoláme metódu „main()“ a vytvoríme vektor našej triedy „Move“ s názvom „my_vec“. Potom použijeme funkciu „push_back()“, ktorá pomáha vložiť hodnotu na koncový bod vektora. Túto funkciu obsahuje „vektorový“ hlavičkový súbor. Najprv do vektora vložíme „39“. Potom sa vloží „57“ a tiež sa vloží „91“ pomocou metódy „push_back()“.

Kód 2:

#include

#include

použitím menný priestor std ;

trieda Pohybujte sa {

súkromné :
int * hodnotu ;
verejnosti :
Pohybujte sa ( int v1 )
{
hodnotu = Nový int ;
* hodnotu = v1 ;

cout << 'Konštruktér je povolaný'

<< v1 << endl ;

} ;
Pohybujte sa ( konšt Pohybujte sa & nový_zdroj )
: Pohybujte sa { * nový_zdroj. hodnotu }
{


cout << 'Copy Constructor sa volá -'

<< 'Deep copy for'

<< * nový_zdroj. hodnotu

<< endl ;

}
Pohybujte sa ( Pohybujte sa && nový_zdroj )
: hodnotu { nový_zdroj. hodnotu }
{


cout << 'Presunúť konštruktor pre'

<< * nový_zdroj. hodnotu << endl ;

nový_zdroj. hodnotu = nullptr ;

}
~Pohni sa ( )
{
ak ( hodnotu ! = nullptr )


cout << 'Deštruktor je povolaný'

<< * hodnotu << endl ;

inak

cout << 'Nazýva sa deštruktor'

<< 'pre nullptr'

<< endl ;

vymazať hodnotu ;

}

} ;

int Hlavná ( )

{

vektor < Pohybujte sa > my_vec ;

    my_vec. push_back ( Pohybujte sa { 39 } ) ;
    my_vec. push_back ( Pohybujte sa { 57 } ) ;
    my_vec. push_back ( Pohybujte sa { 91 } ) ;
vrátiť 0 ;


}

Výkon:

To ukazuje, že namiesto funkcie „kopírovať“ musíme použiť funkciu „presunúť“, aby sme zabránili zbytočnému volaniu funkcie „kopírovať“. Konštruktor „presunúť“ sa tu vyvolá, keď inicializujeme objekt s dočasným objektom alebo nejakým objektom, ktorý bude zničený. Namiesto manipulácie s hlbokou kópiou daných údajov konštruktor „presun“ presúva vlastníctvo zdrojov z jedného objektu na druhý.

Záver

V tejto príručke sme skúmali konštruktor „presun“. Vysvetlili sme, že konštruktor „presun“ v programovaní C++ je jedinečná metóda na efektívne premiestnenie zdrojov objektu do iného objektu. Diskutovali sme o tom, že volanie konštruktora „presun“ má menšiu réžiu, vďaka čomu je kód efektívnejší z hľadiska pamäte. Preskúmali sme skutočnosť, že konštruktor „presun“ je výkonná funkcia v programovaní v C++. Využili sme aj praktické príklady na ilustráciu konceptu konštruktora „move“ a demonštrovali sme výkonnostné výhody použitia konštruktora „move“ v programovaní v C++.