/ / Jaki jest preferowany sposób tworzenia instancji klasy? [duplikat] - java, c ++, wskaźniki, instancja

Jaki jest preferowany sposób tworzenia wystąpienia? [duplicate] - java, c ++, pointers, tworzenie instancji

Pochodzę z Javy, więc kiedy tworzę instancję klasy, zrobiłbym to w c ++:

Class myClass;
myClass.print();

Ale ostatnio używam wskaźnika i adresu jako tak:

Class *pClass = new Class;
pClass->print();

a pierwszą zaletą, jaką widzę, jest oczywiście usunięcie pClass i zwolnij pamięć.

delete pClass;

Ale poza tym, przyzwyczaiłem się do tego, że robię to po raz pierwszy na moim kursie. Czy jest to źle widziane i czy powinienem mieć zwyczaj robienia tego za pomocą wskaźnika?

Odpowiedzi:

4 dla odpowiedzi № 1

Unikaj dynamicznej alokacji (nawet ukrytej jak w std ::make_unique / std :: make_shared), chyba że naprawdę potrzebujesz tego, co robisz. Biorąc to pod uwagę, istnieje wiele sytuacji, w których taka alokacja jest bardzo potrzebna.


0 dla odpowiedzi nr 2

Nie, nie powinieneś „robić zwyczaju robienia tego za pomocą wskaźnika”.

Mówiąc ogólnie, należy używać wskaźników i dynamicznej alokacji pamięci tylko wtedy, gdy istnieje konkretna potrzeba. Jeśli nie możesz zidentyfikować konkretnej potrzeby, nie rób tego.

Tak, istnieją szczególne przypadki, gdy używaszdynamiczna alokacja pamięci (i zwolnienie) jest odpowiednia. Ale to również wiąże się z dodatkowymi wymaganiami, takimi jak programista PAMIĘTAJĄC o zwolnieniu obiektu lub za pomocą specyficznych technik (np. Inteligentnego wskaźnika zamiast surowego wskaźnika), aby upewnić się, że jest poprawnie zwolniony. Nie ma sensu akceptować wysiłków, aby spełnić te dodatkowe wymagania, chyba że masz prawdziwą potrzebę na początek.

Nawiasem mówiąc, operator delete niekoniecznie „uwalnia pamięć”. Powoduje, że dynamicznie przydzielony obiekt przestaje istnieć, jeśli chodzi o twój program. Jednak niekoniecznie powoduje to, że program do pamięci podręcznej jest używany na przykład w systemie operacyjnym hosta. Takie rzeczy zależą od szczegółów systemów operacyjnych hosta (np. Od tego, jak kosztowne jest żądanie systemu operacyjnego i sterowników trybu jądra do przydzielania pamięci fizycznej?) Oraz szczegółów kompilatora i standardowych ustawień biblioteki i optymalizacji (np. Ile woli dostawca kompilatora aby wymienić dodatkowe wykorzystanie pamięci przez programy użytkownika w porównaniu z prędkością wykonywania?)


0 dla odpowiedzi № 3

Pochodząc z Javy, oczekiwałbym tegopowiedz, że korzystałeś ze wskaźników w C ++, ponieważ zachowanie Javy jest bardzo zbliżone do używania wskaźników (z wyjątkiem tego, że „niczego” nie usuwasz). mają semantykę wartości.

np. następująca Java:

Foo f1 = new Foo();
Foo f2 = f1;

jest odpowiednikiem następującego C ++:

Foo *f1 = new Foo();
Foo *f2 = f1;
... delete later

Jak powiedzieli inni, lepiej jest nie używaj wskaźników w C ++, ale jeśli konwertujesz kod Java na C ++, jesteś w stanie wiele bólu i przepisania kodu, jeśli nie używasz wskaźników (lub inteligentnych wskaźników).