C++ konstruktor pomicanja

C Konstruktor Pomicanja



C++ programiranje je najbolji jezik jer nam olakšava širok raspon funkcija, konstruktora, datoteka zaglavlja, klasa i još mnogo toga, čineći kodiranje zanimljivijim i lakšim. Jedan od konstruktora u C++ programiranju je “move” konstruktor. Konstruktor 'pomicanja' jedinstvena je vrsta konstruktora koji omogućuje prijenos vlasništva nad dinamički dodijeljenom memorijom ili drugim resursima s jednog objekta na drugi na učinkovit način svjestan resursa.

U C++ programiranju uvedeni su konstruktori 'pomicanja' kako bi se smanjilo dupliciranje i povećala učinkovitost. Igra ključnu ulogu u poboljšanju performansi minimiziranjem operacija kopiranja. Ovaj vodič detaljno istražuje konstruktor 'pomicanja' u C++ programiranju.







Primjer 1:

Za početak koda ovdje uključujemo 'iostream' i 'string' datoteke zaglavlja koje će omogućiti da naš kod radi savršeno budući da su mnoge funkcije deklarirane u ovim datotekama zaglavlja. Kada moramo upotrijebiti naredbu 'cout', koristi se datoteka zaglavlja 'iostream' jer je ova funkcija deklarirana unutar nje. Kada moramo raditi s podacima tipa string, neophodna je datoteka zaglavlja 'string'.



Nakon toga, 'namespace std' dodaje se ispod ovih datoteka zaglavlja. Zatim ovdje konstruiramo klasu. Naziv klase je “Pomakni”. Ispod toga se dodaje ključna riječ “private” u kojoj deklariramo privatnu string varijablu s imenom “my_str”. Sada postavljamo ključnu riječ 'public' tamo gdje dodajemo definiciju zadanog konstruktora. Prosljeđujemo 'Ovo je ovdje zadani niz' u 'my_str' kao parametar i ostavljamo zadani konstruktor prazan.



Nakon toga kopiramo definiciju konstruktora i inicijaliziramo “my_str” u “my_obj.my_str”. Ispod toga ispisujemo redak i zatim postavljamo definiciju konstruktora 'pomicanja'. Ovdje ponovno inicijaliziramo “my_str” s “my_obj.my_str”. Ispod ovoga ne dodajemo nikakvu izjavu; prazna je. Nakon toga, deklariramo funkciju pod nazivom “displayMyObject()” vrste niza i koristimo “return str” tako da vraća niz.





Globalnu funkciju “new_temp” postavljamo u tip “move”. Ispod njega imamo 'return temp' koji vraća objekt vrste poteza. Sada postavljamo kod drajvera “main()” i “new_obj1” tipa “move” i dobivamo konstruktor “move” iz “rvalue”. U red ispred, postavljamo “new_obj1.displayMyObject()” da dobijemo konstruktor “move” iz “lvalue”. Nakon toga pozivamo konstruktor “move” s objektom “my_obj1”. Zatim prenosimo vlasništvo nad “my_obj1” na drugi objekt koji je “my_obj2”.

Kod 1:

#include

#include

korištenjem imenski prostor std ;

razreda Potez

{

privatna :
niz moj_str ;
javnost :
Potez ( ) : moja_str ( 'Ovo je ovdje zadani niz' )
{
}
Potez ( konst Potez i moj_obj ) : moja_str ( moj_obj. moja_str )
{


cout << 'Pozvan je konstruktor kopiranja, premještanje nije uspjelo! \n ' ;

}
Potez ( Potez && moj_obj ) : moja_str ( potez ( moj_obj. moja_str ) )
{
}
niz displayMyObject ( )
{
povratak moja_str ;
}
} ;
Premjesti novu_temp ( Premjesti tmp )
{
povratak tmp ;
}
int glavni ( )
{
Premjesti novi_obj1 = nova_temp ( Potez ( ) ) ;


cout << 'prije pokretanja() poziva: new_obj1 = ' << novi_obj1. displayMyObject ( ) << endl ;

Premjesti new_obj2 = potez ( novi_obj1 ) ;

cout << 'nakon poziva konstruktora move(): new_obj1 = ' << novi_obj1. displayMyObject ( ) << endl ;

cout << 'nakon poziva konstruktora move(): new_obj2 = ' << novi_obj2. displayMyObject ( ) << endl ;

povratak 0 ;

}

Izlaz:

Izlaz prikazuje da prije pozivanja metode “move()” “new_obj1” sadrži zadani niz. Ali nakon pozivanja metode move() klase “Move”, “my_obj1” sadrži prazan niz, a “my_obj2” ima zadani niz.



Primjer 2:

Ovdje uključujemo još jednu datoteku zaglavlja koja je 'vektorska' datoteka zaglavlja. Ovo uključujemo kad god moramo manipulirati operacijama na vektorima. Klasa koju ovdje stvaramo je klasa 'Premjesti'. Ovdje također stvaramo 'javni' konstruktor u kojem deklariramo neobrađeni pokazivač 'int* value' kao podatke člana klase. Ispod njega imamo “public” u koji postavljamo konstruktor “Move” i prosljeđujemo “int v1” kao njegov parametar.

Nakon toga deklariramo objekte u gomili. Inicijaliziramo 'vrijednost' s 'new int', a '*vrijednost' s 'v1'. Zatim postavite 'cout' na mjesto gdje dodajemo liniju koja se ispisuje kada izvršimo kod. Ispod ovoga koristimo konstruktor 'kopiraj'. Ovaj konstruktor 'kopije' kopira podatke izradom duboke kopije. Postavljamo konstruktor “Move” i prosljeđujemo “Move&& new_source” kao njegov parametar. Ispod njega stavljamo “cout” koji pomaže u prikazu tražene izjave.

Umećemo ključnu riječ 'nullptr' kako bismo utvrdili je li pokazivač prazan prije nego što se referenca iskoristi. Sada također postavljamo destruktor “~Move()” u koji postavljamo uvjet “if” koji provjerava nije li “vrijednost” jednaka “nullptr”. Kada se ovaj uvjet potvrdi, izvršava se naredba ispod ove. Ako ovaj uvjet nije provjeren, preskače se izjava 'cout' koja je prisutna nakon uvjeta 'if' i pomiče se prema dijelu 'else'.

Nakon toga koristimo ključnu riječ 'delete' koja pomaže u oslobađanju objekta ili možemo reći da oslobađa memoriju koja je dodijeljena podatkovnoj komponenti objekta. Sada ovdje pozivamo metodu “main()” i stvaramo vektor naše klase “Move” s imenom “my_vec”. Nakon toga koristimo funkciju 'push_back()' koja pomaže u umetanju vrijednosti na krajnju točku vektora. Datoteka zaglavlja 'vector' sadrži ovu funkciju. Prvo umetnemo '39' u vektor. Zatim se umeće '57' i '91' također se umeće korištenjem metode 'push_back()'.

Kod 2:

#include

#uključi

korištenjem imenski prostor std ;

razreda Potez {

privatna :
int * vrijednost ;
javnost :
Potez ( int v1 )
{
vrijednost = novi int ;
* vrijednost = v1 ;

cout << 'Konstruktor je pozvan za'

<< v1 << endl ;

} ;
Potez ( konst Potez i novi_izvor )
: Potez { * novi_izvor. vrijednost }
{


cout << 'Konstruktor kopiranja se zove -'

<< 'Dubina kopija za '

<< * novi_izvor. vrijednost

<< endl ;

}
Potez ( Potez && novi_izvor )
: vrijednost { novi_izvor. vrijednost }
{


cout << 'Premjesti konstruktor za '

<< * novi_izvor. vrijednost << endl ;

novi_izvor. vrijednost = nullptr ;

}
~Pomakni se ( )
{
ako ( vrijednost ! = nullptr )


cout << 'Destructor je pozvan za '

<< * vrijednost << endl ;

drugo

cout << 'Destruktor se zove'

<< ' za nullptr '

<< endl ;

izbrisati vrijednost ;

}

} ;

int glavni ( )

{

vektor < Potez > moja stvar ;

moja stvar. odgurnuti ( Potez { 39 } ) ;
moja stvar. odgurnuti ( Potez { 57 } ) ;
moja stvar. odgurnuti ( Potez { 91 } ) ;
povratak 0 ;


}

Izlaz:

Ovo pokazuje da umjesto korištenja funkcije 'copy', moramo koristiti funkciju 'move' kako bismo spriječili bespotrebno pozivanje funkcije 'copy'. Konstruktor “move” ovdje se poziva kada inicijaliziramo objekt s privremenim objektom ili nekim objektom koji će biti uništen. Umjesto manipuliranja dubokom kopijom danih podataka, konstruktor 'pomicanja' prebacuje vlasništvo nad resursima s jednog objekta na drugi.

Zaključak

U ovom smo vodiču istražili konstruktor 'pomicanja'. Objasnili smo da je konstruktor 'pomicanja' u C++ programiranju jedinstvena metoda za učinkovito premještanje resursa objekta na drugi objekt. Raspravljali smo o tome da pozivanje konstruktora 'move' ima manje troškova, što kod čini memorijski učinkovitijim. Istražili smo činjenicu da je konstruktor 'pomicanja' moćna značajka u C++ programiranju. Također smo upotrijebili praktične primjere za ilustraciju koncepta 'move' konstruktora i demonstrirali prednosti izvedbe korištenja 'move' konstruktora u C++ programiranju.