Zajęcie 1 * Każda struktura może posiadać funkcje składowe zwane metodami * Metody mogą być przeciążane tak samo jak zwykłe funkcje * Metody mogą mieć parametry domyślne tak samo jak zwykłe funkcje * Deklaruje się metodę wewnątrz struktury, definiuje się zaś w lub poza strukturą * W definicji metody jej nazwa jest poprzedzona nazwą struktury oraz operatorem :: * Wewnątrz metody możemy posługiwać się danymi składowymi struktury * Metoda działająca na strukturze stałej ma słówko kluczowe const po liście parametrów * Definicja metody rozwijanej w miejscu wywołania poprzedzona jest słowem inline * Jeżeli metoda zdefiniowana wewnątrz struktury to ta metoda również jest inline * Użycie metod podobne do użycia danych składowych (przez kropkę lub strzałkę) * Wewnątrz metody można wywołać inną metodę struktury bez podania obiektu Zajęcie 2 * Każda struktura może mieć jeden lub kilka konstruktorów * Konstruktor domyślny - bez parametrów * Konstruktor kopiujący - jedynym parametrem jest referencja na taką samą strukturę * Używamy konstruktora podając jego parametry po nazwie obiektu * Listę parametrów obiektu można pominąć jeżeli obiekt posiada konstruktor domyślny * Dla przekazywania obiektów przez wartość używany jest konstruktor kopiujący * Dla zwracania obiektów przez wartość używany jest konstruktor kopiujący * Konstruktor może posiadać listę inicjalizacyjną, : po liście parametrów dalej zaś przez , * W przypadku kolizji nazw parametrów oraz składowych można użyć autoreferencji this * Autoreferencja this jest wskaźnikiem na obiekt na rzecz którego wywołano metodę * Każda struktura może posiadać destruktor * Destruktor wywoływany jest automatycznie tuż przed zakończeniem istnienia obiektu Zajęcie 3 * Klasę można deklarować również za pomocą słowa kluczowego class * W strukturze wszystkie składowe domyślnie są publiczne * W klasie wszystkie składowe domyślnie są prywatne * Zmiana domyślnego statusu składowych za pomocą public, protected, private * Można przeciążyć znaczenie każdego znanego operatora w C++ (no prawie każdego) * Autoreferencja this jest przydatna przy zwracaniu samej klasy przez metodę * Niektóre operatory można przeciążyć wyłącznie jako funkcje składowe * Dla bezpieczeństwa klasy dynamicznej konieczne jest przeciążenie operatora = * Przy operatorze konwersji nie wskazuje się zwracanego typu * Można przeciążyć również operatory () oraz [] Zajęcie 4 * Funkcje można tworzyć za pomocą wzorca * Klasy można tworzyć za pomocą wzorca * Metodę nie zdefiniowaną w klasie wzorcowej deklarujemy jak funkcję wzorcową * Proste manipulatory dla ostream to funkcje z parametrem ostream& zwracające ostream& * Pisząc klasę wzorcową należy pamiętać iż parametr nie koniecznie jest typem podstawowym * Wzorzec może mieć kilka parametrów * Parametrem klasy wzorcowej może być ona sama (z innym parametrem) * Kompilator nie protestuje w przypadku zadeklarowanej zaś nie zdefiniowanej metody wzorca Zajęcie 5 * Klasa może posiadać również składowe statyczne * Statyczne zmienne składowe są wspólne dla wszystkich obiektów tej klasy * Statyczne zmienne składowe istnieją nawet jeżeli nie istnieje żaden obiekt tej klasy * Statyczna metoda może być wywołana również na rzecz obiektu stałego * Klauzule static i const wykluczają się na wzajem * Klasa może pochodzić od innej klasy * Klasa pochodna dziedziczy wszystkie składowe oprócz niektórych operatorów * Składowe oznaczone klauzulą protected są widoczne również w metodach klas pochodnych * Metodę odziedziczoną można nadpisać * Odziedziczoną ale nadpisaną metodę można jednak wywołać (inaczej w metodach i na zewnątrz) * Wirtualne metody nie są nadpisywane lecz zamieniane * Zamienioną metodę wirtualną można wywołać wyłącznie z poziomu metody * Klasa może również pochodzić od wzorca * Definicja początkowych wartości składowych statycznych dla klas wzorcowych - również wzorzec Zajęcie 6 * Każda funkcja może wyrzucić wyjątek za pomocą instrukcji throw * Typem wyjątku może być dowolny typ w tym obiekt klasy * Jeżeli wyjątek powstał w ramach instrukcji try to można go złapać w instrukcje catch * W instrukcji catch podajemy typ wyjątku który chcemy złapać (działa jak funkcja) * Instrukcja catch(...) łapie każdy wyjątek * W ramach catch można użyć instrukcji throw bez parametrów (wyrzucenie dalej złapanego wyjątku) * Metoda wirtualna w klasie bazowej może być czysta =0 w deklaracji * Jeżeli klasa ma metodę czysta, bądź ją dziedziczy i nie definiuje to klasa jest klasa abstrakcyjną * Nie może istnieć obiekt klasy abstrakcyjnej * Klasa może pochodzić od kilku klas bazowych naraz (dziedziczenie wielobazowe) * Dziedziczenie wirtualne pozwala uniknąć wielokrotnego pośredniego dziedziczenia * Przy dziedziczeniu wirtualnym jawne wywołanie konstruktora części wirtualnej jest pomijane przez kompilator * Możliwe jest zaprzyjaźnienie nie tylko pojedynczej funkcji bądź metody lecz nawet całej klasy * Przy dziedziczeniu wielobazowym odziedziczone metody mogą mieć różne wskaźniki this * Poprawna konwersja pomiędzy wskaźnikami do klasy bazowej oraz pochodnej odbywa się za pomocą dynamic_cast<>