Konstruktor przenoszenia w C++

Konstruktor Przenoszenia W C



Programowanie C++ jest najlepszym językiem, ponieważ udostępnia nam szeroką gamę funkcji, konstruktorów, plików nagłówkowych, klas i wiele więcej, dzięki czemu kodowanie jest ciekawsze i łatwiejsze. Jednym z konstruktorów w programowaniu w C++ jest konstruktor „przenieś”. Konstruktor „move” to unikalny rodzaj konstruktora, który umożliwia przeniesienie własności dynamicznie przydzielanej pamięci lub innych zasobów z jednego obiektu do drugiego w sposób efektywny i uwzględniający zasoby.

W programowaniu w C++ wprowadzono konstruktory „przenoszące”, aby zmniejszyć duplikację i zwiększyć wydajność. Odgrywa kluczową rolę w poprawie wydajności poprzez minimalizację operacji kopiowania. Ten przewodnik szczegółowo omawia konstruktor „przenieś” w programowaniu w C++.







Przykład 1:

Aby rozpocząć kod w tym miejscu, dołączamy pliki nagłówkowe „iostream” i „string”, które sprawią, że nasz kod będzie działał idealnie, ponieważ wiele funkcji jest zadeklarowanych w tych plikach nagłówkowych. Kiedy musimy użyć instrukcji „cout”, używany jest plik nagłówkowy „iostream”, ponieważ ta funkcja jest w nim zadeklarowana. Kiedy musimy pracować z danymi typu string, niezbędny jest plik nagłówkowy „string”.



Następnie pod plikami nagłówkowymi dodawana jest „przestrzeń nazw std”. Następnie konstruujemy tutaj klasę. Nazwa klasy to „Przenieś”. Poniżej dodane jest słowo kluczowe „private”, w którym deklarujemy prywatną zmienną string o nazwie „my_str”. Teraz umieszczamy słowo kluczowe „public” w miejscu, w którym dodajemy definicję domyślnego konstruktora. Przekazujemy „To jest domyślny ciąg znaków” do „my_str” jako parametr i pozostawiamy domyślny konstruktor pusty.



Następnie kopiujemy definicję konstruktora i inicjujemy „my_str” do „my_obj.my_str”. Poniżej drukujemy linię, a następnie umieszczamy definicję konstruktora „przenieś”. Tutaj ponownie inicjujemy „my_str” za pomocą „my_obj.my_str”. Nie dodajemy poniżej żadnego oświadczenia; to jest puste. Następnie deklarujemy funkcję o nazwie „displayMyObject()” typu łańcuchowego i wykorzystujemy funkcję „return str”, aby zwróciła ciąg znaków.





Globalną funkcję „new_temp” umieszczamy w typie „move”. Poniżej znajduje się „temperatura powrotu”, która zwraca obiekt typu move. Teraz umieszczamy kod sterownika „main()” i „new_obj1” typu „move” i pobieramy konstruktor „move” z „rvalue”. W następnej linii umieszczamy „new_obj1.displayMyObject()”, aby pobrać konstruktor „move” z „lvalue”. Następnie wywołujemy konstruktor „move” z obiektem „my_obj1”. Następnie przenosimy własność „my_obj1” na inny obiekt, którym jest „my_obj2”.

Kod 1:

#include

#include

za pomocą przestrzeń nazw st ;

klasa Przenosić

{

prywatny :
ciąg moja_str ;
publiczny :
Przenosić ( ) : moja_str ( „To jest tutaj domyślny ciąg” )
{
}
Przenosić ( konst Przenosić & mój_obj ) : moja_str ( mój_obj. moja_str )
{


cout << „Wywołano konstruktora kopiującego, przeniesienie nie powiodło się! \N ' ;

}
Przenosić ( Przenosić && mój_obj ) : moja_str ( przenosić ( mój_obj. moja_str ) )
{
}
string displayMyObject ( )
{
powrót moja_str ;
}
} ;
Przenieś nową_temp ( Przesuń tmp )
{
powrót tmp ;
}
wew główny ( )
{
Przenieś nowy_obj1 = nowa_temp ( Przenosić ( ) ) ;


cout << „przed wywołaniem funkcji move(): new_obj1 =” << nowy_obj1. wyświetlMójObiekt ( ) << koniec ;

Przenieś nowy_obj2 = przenosić ( nowy_obj1 ) ;

cout << „po wywołaniu konstruktora move(): new_obj1 =” << nowy_obj1. wyświetlMójObiekt ( ) << koniec ;

cout << „po wywołaniu konstruktora move() : new_obj2 = „ << nowy_obj2. wyświetlMójObiekt ( ) << koniec ;

powrót 0 ;

}

Wyjście:

Dane wyjściowe pokazują, że przed wywołaniem metody „move()” parametr „new_obj1” zawiera domyślny ciąg znaków. Ale po wywołaniu metody move() klasy „Move” „my_obj1” zawiera pusty ciąg, a „my_obj2” ma ciąg domyślny.



Przykład 2:

Tutaj dołączamy jeszcze jeden plik nagłówkowy, który jest plikiem nagłówkowym „wektorowym”. Uwzględniamy to zawsze, gdy musimy manipulować operacjami na wektorach. Klasa, którą tutaj tworzymy, to klasa „Przenieś”. Tworzymy tutaj także „publiczny” konstruktor, w którym deklarujemy surowy wskaźnik „int* value” jako dane członka klasy. Poniżej mamy „public”, w którym umieszczamy konstruktor „Move” i jako jego parametr przekazujemy „int v1”.

Następnie deklarujemy obiekty na stercie. Inicjujemy „wartość” za pomocą „new int”, a „*wartość” za pomocą „v1”. Następnie umieść „cout” w miejscu, w którym dodajemy linię, która będzie wyświetlana po wykonaniu kodu. Poniżej używamy konstruktora „kopiującego”. Ten konstruktor „kopiujący” kopiuje dane, tworząc głęboką kopię. Umieszczamy konstruktor „Move” i jako jego parametr przekazujemy „Move&& new_source”. Poniżej umieszczamy znak „cout”, który pomaga wyświetlić żądane oświadczenie.

Wstawiamy słowo kluczowe „nullptr”, aby określić, czy wskaźnik jest pusty przed wykorzystaniem odwołania. Teraz umieszczamy także destruktor „~Move()”, w którym umieszczamy warunek „if” sprawdzający, czy „wartość” nie jest równa „nullptr”. Po sprawdzeniu tego warunku wykonywana jest poniższa instrukcja. Jeśli warunek ten nie zostanie zweryfikowany, pomija instrukcję „cout”, która występuje po warunku „if” i przechodzi do części „else”.

Następnie używamy słowa kluczowego „delete”, które pomaga w zwolnieniu alokacji obiektu lub możemy powiedzieć, że zwalnia pamięć przydzieloną komponentowi danych obiektu. Teraz wywołujemy tutaj metodę „main()” i tworzymy wektor naszej klasy „Move” o nazwie „my_vec”. Następnie używamy funkcji „push_back()”, która pomaga wstawić wartość na końcu wektora. Plik nagłówkowy „wektorowy” zawiera tę funkcję. Najpierw wstawiamy do wektora liczbę „39”. Następnie wstawia się „57” i „91” za pomocą metody „push_back()”.

Kod 2:

#include

#uwzględnij

za pomocą przestrzeń nazw st ;

klasa Przenosić {

prywatny :
wew * wartość ;
publiczny :
Przenosić ( wew v1 )
{
wartość = nowy wew ;
* wartość = v1 ;

cout << „Konstruktor jest wezwany”

<< v1 << koniec ;

} ;
Przenosić ( konst Przenosić & nowe źródło )
: Przenosić { * nowe źródło. wartość }
{


cout << „Konstruktor kopiujący nazywa się -”

<< „Głęboka kopia dla”

<< * nowe źródło. wartość

<< koniec ;

}
Przenosić ( Przenosić && nowe źródło )
: wartość { nowe źródło. wartość }
{


cout << „Przenieś konstruktor dla”

<< * nowe źródło. wartość << koniec ;

nowe źródło. wartość = nullptr ;

}
~Przesuń się ( )
{
Jeśli ( wartość ! = nullptr )


cout << „Wzywa się destruktora”

<< * wartość << koniec ;

w przeciwnym razie

cout << „Nazywa się destruktor”

<< 'dla nullptr'

<< koniec ;

usuwać wartość ;

}

} ;

wew główny ( )

{

wektor < Przenosić > moja rzecz ;

moja rzecz. push_back ( Przenosić { 39 } ) ;
moja rzecz. push_back ( Przenosić { 57 } ) ;
moja rzecz. push_back ( Przenosić { 91 } ) ;
powrót 0 ;


}

Wyjście:

To pokazuje, że zamiast korzystać z funkcji „kopiuj”, musimy skorzystać z funkcji „przenieś”, aby zapobiec niepotrzebnemu wywoływaniu funkcji „kopiuj”. Konstruktor „move” wywoływany jest tutaj, gdy inicjujemy obiekt obiektem tymczasowym lub jakimś obiektem, który zostanie zniszczony. Zamiast manipulować głęboką kopią danych, konstruktor „move” przenosi własność zasobów z jednego obiektu na inny.

Wniosek

W tym przewodniku omówiliśmy konstruktora „przenieś”. Wyjaśniliśmy, że konstruktor „move” w programowaniu w C++ to unikalna metoda skutecznego przenoszenia zasobów obiektu do innego obiektu. Omówiliśmy, że wywołanie konstruktora „przenieś” wiąże się z mniejszym obciążeniem, dzięki czemu kod jest bardziej wydajny pod względem pamięci. Zbadaliśmy fakt, że konstruktor „move” jest potężną funkcją w programowaniu w C++. Wykorzystaliśmy także praktyczne przykłady, aby zilustrować koncepcję konstruktora „przenieś” i zademonstrowaliśmy korzyści wydajnościowe wynikające z wykorzystania konstruktora „przenieś” w programowaniu w C++.