Głęboka kopia C ++

Głęboka kopia C ++
Kopia oznacza to samo dla tej samej repliki oryginalnego obiektu. W programowaniu istnieją różne metody tworzenia kopii obiektów. Kopia obiektów, zmiennych można wykonać za pomocą konstruktora kopii lub za pomocą domyślnego operatora przypisania „=”. W kodzie C ++ można wykonać dwa rodzaje kopii, i.mi., płytka i głęboka kopia. Możesz użyć jednego do kopiowania dowolnej zmiennej lub obiektu w kodzie. Kiedy nasz obiekt ma zmienne, które są dynamicznie przydzielane w całym programie, musimy utworzyć głęboką kopię takiego rodzaju obiektu. W tym artykule zobaczy, jak można utworzyć głęboką kopię w C++.

Płytka kopia vs. Głęboka kopia

Przed przyjrzeniem się przykładowi głębokiej kopii należy również zrozumieć płytką kopię. Tak więc płytka kopia została utworzona, gdy chcesz skopiować wszystkie zmienne jednego obiektu do innego obiektu. Możesz to nazwać obrazem lustrzanym, ale to nie jest oryginalny. Zarówno oryginalne, jak i nowe obiekty, i.mi., replika, będzie odwoływać się do tego samego adresu pamięci w płytkiej kopii. Oznacza to, że zarówno oryginalne, jak i repliki obiekty zostaną rozpoznane i pobierane za pomocą tego samego adresu pamięci. Gdy użytkownik próbuje wprowadzić zmiany w jednym obiekcie, automatycznie odzwierciedla zmianę w innym obiekcie z powodu tego samego adresu pamięci. Może to powodować wiele błędów podczas wykonywania, a obiekt prawdziwy i repliki zostanie zniszczony. Mówi się zatem, aby unikać używania płytkiej kopii, gdy pracujesz z dynamicznie przydzielonymi zmiennymi określonego obiektu.

Zaleca się użycie głębokiej kopii zamiast płytkiej kopii podczas korzystania z zmiennych przydzielonych dynamicznie. Głęboką kopię można uzyskać, kopiując wszystkie dane obiektu, i.mi., Wartości zmienne, alokacja pamięci i zasoby do nowego, podczas gdy zarówno rzeczywisty, jak i repliki obiekt ma zupełnie inny adres pamięci. Może być używany do obiektu o zmiennych, które są alokowane dynamicznie. Więc zacznijmy.

Przykład: głęboka kopia

Zaczęliśmy nasz przykład, aby zademonstrować koncepcję głębokiej kopii w programowaniu C ++, otwierając konsolę powłoki Ubuntu 20.04 System. Pierwszą rzeczą jest stworzenie nowego pliku C ++ dla kodu. Wieczne, stare i najprostsze polecenie dostarczone przez rozkład Linuksa w celu utworzenia dokumentu w terminalu powłoki to instrukcja „dotyk”. Proste słowo „dotyk” zostanie użyte z tytułem dokumentu do wygenerowania. Pamiętaj, aby dodać rozszerzenie C ++ na końcu nazwy dokumentu; W przeciwnym razie kod nie będzie działał na powłoce po wykonaniu pliku. Po utworzeniu tego pliku pojawia się krok, aby.

Najlepsza rzecz w Ubuntu 20.04 to jest wyposażone w wbudowane edytory do otwierania i edytowania plików. Zawiera edytor „VIM” do edycji w bardzo kolorowym środowisku, edytor tekstu do aktualizacji i edytowania kodu w najprostszym środowisku, oraz edytor GNU Nano do tworzenia i edytowania kodu w skorcie. W ten sposób odrzuciliśmy edytor kodu, i.mi., Redaktor GNU Nano w naszym przypadku, a nano słowo służy do otwarcia dokumentu „głęboko.CC ”. Instrukcje dotyczące generowania i uruchamiania dokumentu „Deep.CC ”podano na zrzucie ekranu poniżej.

Po wydaniu edytora GNU Nano uruchomienie dokumentu tekstowego „Deep.CC ”, musimy najpierw dodać w nim niektóre biblioteki. Biblioteki te są wymagane do wykonywania kodu w określony sposób. Strumień wejściowy „IO” jest zawarty przy użyciu słowa „include” z znakiem skrótu, i.mi., „#”. Użycie standardowej przestrzeni nazw jest niezbędne do używania w nim kodu C ++. Kod rozpoczął się od deklaracji nowej klasy o nazwie „Test”. Ta klasa została zainicjowana z trzema prywatnymi członkami danych liczb całkowitych. Zmienne „len” i „wid” są normalnymi zmiennymi całkowitymi, podczas gdy „wiek” jest zmienną wskaźnika. Konstruktor testu () został zainicjowany i służy go do bezpośredniej inicjalizacji wskaźnika „wiek” z dynamiczną wartością typu liczb całkowitych.

Funkcja zdefiniowana przez użytkownika o nazwie „SET” bez typu powrotu została uruchomiona. Wymaga trzech argumentów typu liczb całkowitych w swoich parametrach, i.mi., „L”, „W” i „A”. Ta funkcja jest tutaj używana do uzyskania wartości z funkcji main () i przechowywania ich w zmiennych lub członków danych zadeklarowanych wcześniej na początku klasy „test” i.mi., „Len”, „wid” i zmienna typu wskaźnika „Wiek”. Kolejna funkcja zdefiniowana przez użytkownika o nazwie „Display ()” została użyta bez wartości parametrycznych. Ta funkcja wykorzystuje w niej jedną standardową instrukcję Cout. Instrukcja Cout wykorzystuje zmienne „len”, „wid” i „*wiek” do wyświetlania już ustawionych wartości przez funkcję set ().

Teraz używamy sparametryzowanego testu funkcji konstruktora () klasy „test”, aby wdrożyć koncepcję głębokiej kopii w naszym programie. Ten sparametryzowany konstruktor zostanie wywołany po utworzeniu nowego obiektu. Wprowadza wskaźnik typu „test” klasy w swoim parametrze, i.mi., Oryginalny obiekt. Ten pierwszy obiekt przekazany w parametrach zostanie użyty do kopiowania wszystkich danych oryginalnego obiektu w nowym obiekcie, jak pokazano na obrazie. Klasy Test Destructor został wykorzystany do zniszczenia obiektu testu klasowego podczas usunięcia dynamicznie przydzielonej zmiennej pamięci „wiek” po zakończeniu programu. Klasa testowa została tutaj zamknięta, a wykonanie zostanie rozpoczęte z główną funkcją.

Teraz przychodzi główna funkcja. Wykonanie zaczyna się stąd, gdy powstaje pierwszy obiekt „T1” testu klasy,. Konstruktor „test ()” będzie działał automatycznie wraz z tworzeniem obiektu „T1” i przypisania dynamicznej pamięci kopuły do ​​zmiennej dynamicznej „wiek”. Funkcja set () została wywołana przy użyciu obiektu T1 i aby ustawić wartości na zmienne, funkcja display () zostanie wywołana, aby wyświetlić wartości na powładzie. Drugi obiekt, T2, został utworzony Plik głęboko kopiowanie wszystkich danych obiektu T1 przez przypisanie. Sparametryzowany konstruktor zostanie tutaj wywołany. Kiedy wywołamy metodę display () z obiektem T2, wyświetli ten sam wynik, co dla obiektu 1. Destruktor zostanie wykonywany automatycznie, ponieważ obiekt zakończył działanie.

Po kompilacji z G ++ i wykonaniem z „./A.OUT, „Mamy te same wyniki metody display () dla obiektów T1 i T2.

Wniosek

W ramach tego przewodnika w artykule znajdziesz wyjaśnienie głębokiej kopii wraz z przykładową demonstracją. Rozpoczęliśmy ten przewodnik, definiując warunki kopii, głębokiej kopii i płytkiej kopii. Następnie omówiliśmy różnicę między użyciem głębokiej kopii i płytkiej kopii w kodzie C ++ do kopiowania obiektów. Dodaliśmy krótki i prosty przykład programu głębokiej kopii, aby go bardziej zademonstrować. Dlatego uważamy, że ten artykuł byłby bardzo korzystny dla wszystkich naiwnych użytkowników C ++ i tych, którzy są już ekspertami w ich domenie.