22.x — Rozdział 22, podsumowanie i quiz

Klasa inteligentnego wskaźnika to klasa złożona, która została zaprojektowana do zarządzania dynamicznie przydzielaną pamięcią i zapewniania, że pamięć zostanie usunięta, gdy obiekt inteligentnego wskaźnika wyjdzie poza zakres.

Semantyka kopiowania umożliwia kopiowanie naszych klas. Odbywa się to głównie za pomocą konstruktora kopiującego i operatora przypisania kopii.

Semantyka przenoszenia oznacza, że ​​klasa przeniesie własność obiektu, zamiast tworzyć kopię. Odbywa się to głównie za pomocą konstruktora przenoszenia i operatora przypisania przenoszenia.

std::auto_ptr jest przestarzałe i należy go unikać.

Odwołanie do wartości r to odwołanie zaprojektowane do inicjowania wartością r. Odniesienie do wartości r jest tworzone przy użyciu podwójnego znaku ampersand. Nie ma nic złego w pisaniu funkcji, które przyjmują parametry referencyjne w postaci r, ale prawie nigdy nie powinieneś zwracać odniesienia w postaci r.

Jeśli konstruujemy obiekt lub wykonujemy zadanie, w którym argumentem jest wartość l, jedyne, co możemy rozsądnie zrobić, to skopiować wartość l. Nie możemy założyć, że zmiana wartości l jest bezpieczna, ponieważ może ona zostać ponownie użyta w dalszej części programu. Jeśli mamy wyrażenie „a = b”, nie spodziewalibyśmy się, że b zostanie w jakikolwiek sposób zmienione.

Jeśli jednak skonstruujemy obiekt lub wykonamy zadanie, w którym argumentem jest wartość r, to wiemy, że wartość r jest tylko pewnego rodzaju obiektem tymczasowym. Zamiast go kopiować (co może być kosztowne), możemy po prostu przenieść jego zasoby (co jest tanie) na obiekt, który konstruujemy lub przydzielamy. Jest to bezpieczne, ponieważ element tymczasowy i tak zostanie zniszczony na końcu wyrażenia, więc mamy pewność, że nigdy więcej nie zostanie użyty!

Możesz użyć słowa kluczowego Delete, aby wyłączyć semantykę kopiowania dla tworzonych klas, usuwając konstruktor kopiujący i operator przypisania kopiowania.

std::move pozwala traktować wartość l jako wartość r. Jest to przydatne, gdy chcemy wywołać semantykę przenoszenia zamiast semantyki kopiowania na wartości l.

std::unique_ptr to klasa inteligentnego wskaźnika, której prawdopodobnie powinieneś używać. Zarządza pojedynczym zasobem, którego nie można współdzielić. Do utworzenia nowego std::unique_ptr należy preferować std::make_unique() (w C++ 14). std::unique_ptr wyłącza semantykę kopiowania.

std::shared_ptr to klasa inteligentnego wskaźnika używana, gdy potrzebujesz wielu obiektów uzyskujących dostęp do tego samego zasobu. Zasób nie zostanie zniszczony, dopóki ostatni zarządzający nim std::shared_ptr nie zostanie zniszczony. Do utworzenia nowego std::shared_ptr powinna być preferowana std::make_shared(). W przypadku std::shared_ptr należy zastosować semantykę kopiowania w celu utworzenia dodatkowego std::shared_ptr wskazującego na ten sam obiekt.

std::weak_ptr to klasa inteligentnego wskaźnika używana, gdy potrzebny jest jeden lub więcej obiektów z możliwością przeglądania i uzyskiwania dostępu do zasobu zarządzanego przez std::shared_ptr, ale w przeciwieństwie do std::shared_ptr, std::weak_ptr nie jest brane pod uwagę przy określaniu czy zasób powinien zostać zniszczony.

Czas quizu

  1. Wyjaśnij, kiedy należy używać następujących typów wskaźników.

1a) std::unique_ptr

Pokaż rozwiązanie

1b) std::shared_ptr

Pokaż rozwiązanie

1c) std::weak_ptr

Pokaż rozwiązanie

1d) std::auto_ptr

Pokaż rozwiązanie

  1. Wyjaśnij, dlaczego semantyka przenoszenia skupia się wokół wartości r.

Pokaż rozwiązanie

  1. Co jest nie tak z poniższym kodem? Zaktualizuj program, aby był zgodny z najlepszymi praktykami.

3a)

#include <iostream>
#include <memory> // for std::shared_ptr
 
class Resource
{
public:
	Resource() { std::cout << "Resource acquired\n"; }
	~Resource() { std::cout << "Resource destroyed\n"; }
};
 
int main()
{
	auto* res{ new Resource{} };
	std::shared_ptr<Resource> ptr1{ res };
	std::shared_ptr<Resource> ptr2{ res };

	return 0;
}

Pokaż rozwiązanie

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
84 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze