C++ Move Constructor

C Move Constructor



Programování v C++ je nejlepší jazyk, protože nám usnadňuje širokou škálu funkcí, konstruktorů, hlavičkových souborů, tříd a mnoho dalšího, díky čemuž je kódování zajímavější a jednodušší. Jedním z konstruktorů v programování v C++ je konstruktor „move“. Konstruktor „přesunout“ je jedinečný druh konstruktoru, který umožňuje převedení vlastnictví dynamicky alokované paměti nebo jiných zdrojů z jednoho objektu na druhý efektivním způsobem s ohledem na zdroje.

V programování v C++ byly zavedeny konstruktory „move“, aby se snížila duplicita a zvýšila účinnost. Hraje klíčovou roli při zlepšování výkonu minimalizací operací kopírování. Tato příručka hluboce zkoumá konstruktor „move“ v programování C++.







Příklad 1:

Pro začátek kódu zde uvádíme hlavičkové soubory „iostream“ a „string“, díky kterým bude náš kód fungovat perfektně, protože v těchto hlavičkových souborech je deklarováno mnoho funkcí. Když musíme použít příkaz „cout“, použije se hlavičkový soubor „iostream“, protože tato funkce je v něm deklarována. Když musíme pracovat s daty typu string, je nezbytný hlavičkový soubor „string“.



Poté se pod tyto hlavičkové soubory přidá „jmenný prostor std“. Poté zde vytvoříme třídu. Název třídy je „Přesunout“. Pod to je přidáno klíčové slovo „private“, ve kterém deklarujeme proměnnou soukromého řetězce s názvem „my_str“. Nyní umístíme klíčové slovo „public“, kam přidáme definici výchozího konstruktoru. Předáme „Toto je zde výchozí řetězec“ do parametru „my_str“ a ponecháme výchozí konstruktor prázdný.



Poté zkopírujeme definici konstruktoru a inicializujeme „my_str“ na „my_obj.my_str“. Pod tím vytiskneme řádek a poté umístíme definici konstruktoru „přesunout“. Zde znovu inicializujeme „my_str“ pomocí „my_obj.my_str“. Pod toto nepřidáváme žádné prohlášení; je to prázdné. Poté deklarujeme funkci s názvem „displayMyObject()“ typu řetězec a použijeme „return str“, aby vrátila řetězec.





Globální funkci „new_temp“ umístíme do typu „přesunout“. Pod ním máme „return temp“, který vrací objekt typu move. Nyní umístíme kód ovladače „main()“ a „new_obj1“ typu „move“ a získáme konstruktor „move“ z „rvalue“. Na řádek dopředu umístíme „new_obj1.displayMyObject()“, abychom získali konstruktor „move“ z „lvalue“. Poté zavoláme konstruktor „move“ s objektem „my_obj1“. Poté převedeme vlastnictví „my_obj1“ na druhý objekt, který je „my_obj2“.

Kód 1:

#include

#include <řetězec>

použitím jmenný prostor std ;

třída Hýbat se

{

soukromé :
řetězec můj_str ;
veřejnost :
Hýbat se ( ) : můj_str ( 'Toto je zde výchozí řetězec' )
{
}
Hýbat se ( konst Hýbat se & můj_obj ) : můj_str ( můj_obj. můj_str )
{


cout << 'Byl vyvolán konstruktor kopírování, přesun se nezdařil! \n ' ;

}
Hýbat se ( Hýbat se && můj_obj ) : můj_str ( hýbat se ( můj_obj. můj_str ) )
{
}
řetězec displayMyObject ( )
{
vrátit se můj_str ;
}
} ;
Přesunout new_temp ( Přesunout tmp )
{
vrátit se tmp ;
}
int hlavní ( )
{
Přesunout nový_obj1 = nová_teplota ( Hýbat se ( ) ) ;


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

Přesunout nový_obj2 = hýbat se ( nový_obj1 ) ;

cout << 'po volání konstruktoru move() : new_obj1 = ' << nový_obj1. displayMyObject ( ) << endl ;

cout << 'po volání konstruktoru move() : new_obj2 = ' << new_obj2. displayMyObject ( ) << endl ;

vrátit se 0 ;

}

Výstup:

Výstup vykreslí, že před voláním metody „move()“ obsahuje „new_obj1“ výchozí řetězec. Ale po zavolání metody move() třídy „Move“ obsahuje „my_obj1“ prázdný řetězec a „my_obj2“ má výchozí řetězec.



Příklad 2:

Zde uvádíme ještě jeden hlavičkový soubor, kterým je „vektorový“ hlavičkový soubor. Zahrnujeme to vždy, když musíme manipulovat s operacemi s vektory. Třída, kterou zde vytvoříme, je třída „Move“. Také zde vytvoříme „veřejný“ konstruktor, ve kterém deklarujeme nezpracovaný ukazatel „int* value“ jako data člena třídy. Pod ním máme „public“, do kterého umístíme konstruktor „Move“ a jako jeho parametr předáme „int v1“.

Poté deklarujeme objekty v hromadě. Inicializujeme „hodnotu“ pomocí „new int“ a „*hodnotu“ pomocí „v1“. Poté umístěte „cout“ tam, kde přidáme řádek, který se vytiskne, když spustíme kód. Pod tím používáme konstruktor „copy“. Tento „kopírovací“ konstruktor zkopíruje data vytvořením hluboké kopie. Umístíme konstruktor „Move“ a jako jeho parametr předáme „Move&& new_source“. Pod ním umístíme „cout“, který pomáhá zobrazit požadovaný výpis.

Před použitím reference vložíme klíčové slovo „nullptr“, abychom zjistili, zda je ukazatel prázdný. Nyní také umístíme destruktor „~Move()“, do kterého vložíme podmínku „if“, která ověří, zda se „hodnota“ nerovná „nullptr“. Když je tato podmínka ověřena, provede se níže uvedený příkaz. Pokud tato podmínka není ověřena, přeskočí příkaz „cout“, který je přítomen po podmínce „if“, a přesune se k části „else“.

Poté použijeme klíčové slovo „delete“, které pomáhá uvolnit objekt nebo můžeme říci, že uvolňuje paměť, která je přidělena datové složce objektu. Nyní zde vyvoláme metodu „main()“ a vytvoříme vektor naší třídy „Move“ s názvem „my_vec“. Poté použijeme funkci „push_back()“, která pomáhá vložit hodnotu na koncový bod vektoru. Tuto funkci obsahuje „vektorový“ hlavičkový soubor. Nejprve do vektoru vložíme „39“. Poté se vloží „57“ a také se vloží „91“ pomocí metody „push_back()“.

Kód 2:

#include

#include

použitím jmenný prostor std ;

třída Hýbat se {

soukromé :
int * hodnota ;
veřejnost :
Hýbat se ( int v1 )
{
hodnota = Nový int ;
* hodnota = v1 ;

cout << 'Konstruktor je volán'

<< v1 << endl ;

} ;
Hýbat se ( konst Hýbat se & nový_zdroj )
: Hýbat se { * nový_zdroj. hodnota }
{


cout << 'Kopírovací konstruktor se nazývá -'

<< 'Deep copy for'

<< * nový_zdroj. hodnota

<< endl ;

}
Hýbat se ( Hýbat se && nový_zdroj )
: hodnota { nový_zdroj. hodnota }
{


cout << 'Přesunout konstruktor pro'

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

nový_zdroj. hodnota = nullptr ;

}
~Pohni se ( )
{
-li ( hodnota ! = nullptr )


cout << 'Destruktor je volán'

<< * hodnota << endl ;

jiný

cout << 'Jmenuje se destruktor'

<< 'pro nullptr'

<< endl ;

vymazat hodnota ;

}

} ;

int hlavní ( )

{

vektor < Hýbat se > my_věc ;

my_věc. zatlačit zpátky ( Hýbat se { 39 } ) ;
my_věc. zatlačit zpátky ( Hýbat se { 57 } ) ;
my_věc. zatlačit zpátky ( Hýbat se { 91 } ) ;
vrátit se 0 ;


}

Výstup:

To ukazuje, že místo funkce „kopírovat“ musíme použít funkci „přesunout“, abychom zabránili zbytečnému volání funkce „kopírovat“. Konstruktor „move“ se zde vyvolá, když objekt inicializujeme dočasným objektem nebo nějakým objektem, který bude zničen. Namísto manipulace s hlubokou kopií daných dat přesune konstruktor „přesun“ vlastnictví zdrojů z jednoho objektu na druhý.

Závěr

V této příručce jsme prozkoumali konstruktor „move“. Vysvětlili jsme, že konstruktor „přesunout“ v programování C++ je jedinečná metoda, jak efektivně přemístit prostředky objektu do jiného objektu. Diskutovali jsme o tom, že volání konstruktoru „move“ má menší režii, takže kód je efektivnější z hlediska paměti. Prozkoumali jsme skutečnost, že konstruktor „move“ je mocná funkce v programování v C++. Využili jsme také praktické příklady k ilustraci konceptu konstruktoru „move“ a demonstrovali výkonnostní výhody použití konstruktoru „move“ v programování v C++.