Czytałeś jakąś książkę na temat C++? To są dość elementarne rzeczy, całkiem proste w zrozumieniu jeżeli się już coś pisało.
dobra, a więc tak, po przeczytaniu linka - The rule of 3/5/0
rozumiem następująco
- Zasada 3
Jeżeli klasa wymaga destruktora, konstruktora kopiującego lub operatora przypisania, to najprawdopodobniej potrzebuje ich wszystkich trzech - czyli już na dzień dobry mam sam określić czy w mojej klasie będą wymagane te składowe, jeżeli nie jestem pewny czy ich potrzebuję, to dla bezpieczeństwa lepiej je zdefiniować.
Nie, nie masz o tym myśleć na dzień dobry. Jeżeli w trakcie pisania okaże się, że potrzebujesz jednego z tych trzech, wtedy należy przemyśleć, czy nie potrzeba też dwóch pozostałych. Na przykład, jeżeli masz
class Foo
{
int* array;
Foo(int size) : array{new size}
{}
}
E: oczywiście nie żadne new size tylko new int[size]
Łatwo zauważyć, że potrzebny jest destruktor do zwolnienia pamięci zablokowanej przez new. Teraz myślisz, skoro destruktor, to pewnie i kopiujący konstruktor i kopiujący operator przypisania? Tak, przecież kopiowanie składowa po składowej nie wystarczy, gdy mamy dynamicznie alokowaną pamięć.
- Zasada 5
Jeżeli mam zdefiniowany destruktor, konstruktor kopiujący i operator przypisania to ta zasada implikuje zasadę 3 i trzeba dołożyć jeszcze dwie składowe konstruktor przenoszący i przenoszący operator przypisania
Zasada 5 powstała przez to, że od C++11 mamy move semantics
, czyli to po prostu to co było kiedyś + dodatkowy konstruktor przenoszący i przenoszący operator przypisania. Więc generalnie masz rację.
- Zasada 0
Implikuje zasadę 5 - czyli jeżeli w klasie zdefiniowany jest destruktor, konstruktor kopiujący, operator przypisania, konstruktor przenoszący i przenoszący operator przypisania to te składowe jak i klasa powinna zajmować się własnymi składowymi klasy. Czyli w klasie nie powinno być definicji i deklaracji żadnych obcych obiektów. - Ale jak to rozumieć że ma się zajmować tylko "sobą" ? Chodzi o SRP ?
Chodzi o to, że nie musisz żadnych zasobów zwalniać[bo na przykład jako składowe masz same zmienne typu prostego, jak int, czy zmienne typu, który sam dba o zwalnianie swoich zasobów, jak std::vector
], więc nie ma potrzeby pisania innych niż domyślne operacje.
Klasy które nie spełniają zasady 5 - mogą uniknąć pisania destruktora, konstruktora kopiującego, operatora przypisania, konstruktora przenoszącego, przenoszącego operatora przypisania o ile użyjemy wbudowanych typów, które obsługują odpowiednią semantykę kopiowania i przenoszenia.
Tylko nie wiem co z klasami polimorficznymi.
Ale co ma być z klasami polimorficznymi, jaki to ma związek?