1/23
Looks like no tags are added yet.
Name | Mastery | Learn | Test | Matching | Spaced | Call with Kai |
|---|
No analytics yet
Send a link to your students to track their progress
Jednostka translacji to pojedynczy plik .cpp wraz z dołączonymi nagłówkami (.h). Kod klasy dzieli się na plik nagłówkowy (wizytówka klasy deklarująca ciało pól i metody) oraz plik implementacji (zawierający zewnętrzne definicje metod oraz zawsze dołączony własny plik nagłówkowy klasy).
Jest to przeciążanie nazw funkcji oparte na sztywnym wiązaniu w trakcie kompilacji. Uzyskuje się go poprzez definiowanie wielu funkcji o tej samej nazwie lecz różniących się listą argumentów (ich liczbą typami lub kolejnością).
Opiera się na wskaźnikach na funkcje a wiązanie jest elastyczne i następuje podczas działania programu. Uzyskuje się go przypisując adres wybranej funkcji o identycznym interfejsie (zwracany typ i argumenty) do wskaźnika funkcyjnego.
Zwykła 1D: przez wskaźnik (void f(double tab, int size)) lub referencję C++ (void f(double (&tab)[SIZE])). Zwykła 2D: wskaźnik na tablicę (void f(double (tab)[COLS], int rows)) lub referencję. Dynamiczna 1D: wskaźnik pierwszego stopnia (void f(int *tab, int n)). Dynamiczna 2D: wskaźnik drugiego stopnia (void f(double **tab, int r, int c)).
Pojedyncza zmienna/instancja: Typ* wsk = new Typ{wartość} / delete wsk. Tablica 1D: Typ* wsk = new Typ[rozmiar]{wartości} / delete[] wsk. Alokacja obiektów (typów złożonych) ma identyczną składnię jak typów fundamentalnych.
Czas życia to okres od użycia operatora new do momentu ręcznego zwolnienia pamięci operatorem delete/delete[]. Wyciek pamięci to bezpowrotna utrata wskaźnika kontaktowego przed jej zwolnieniem co blokuje bezużyteczny obszar aż do zamknięcia programu.
Fragmentaryczna: główny wskaźnik 2. stopnia przechowuje wskaźniki z których każdy oddzielnie alokuje osobną tablicę (wiersz) w losowym miejscu pamięci. Ciągła: powołany jest jeden długi ciągły blok pamięci po którym wskaźniki z tablicy głównej są po prostu ustawiane w odpowiednich odstępach (partycjonowanie).
AND (&): zwraca 1 gdy oba bity to 1. OR (|): zwraca 1 gdy min. jeden bit to 1. XOR (^): zwraca 1 gdy bity są różne. NOT (~): odwraca wszystkie bity (zera na jedynki). Przesunięcia (>> i <<): przesuwają całą sekwencję bitów a puste miejsca uzupełniają zerami.
Maska bitowa to wzór (kombinacja zer i jedynek) wyznaczający bity do manipulacji. Tworzy się ją np. przez przesunięcie bitowe (1 << n) lub stałą szesnastkową. Służy do celowej zmiany wybranych bitów: ustawiania na 1 (|=) zerowania (&= ~) przełączania na przeciwne (^=) i odczytu.
Tryb tekstowy: operacje na czytelnym dla człowieka sformatowanym tekście (funkcje: fprintf fscanf fputs fgets). Tryb binarny: dane to szybka wierna i niesformatowana kopia bajtów prosto z pamięci (dopisek 'b' w trybie otwarcia; funkcje: fwrite fread).
Klasa: koncepcyjny zbiór danych i zachowań. Instancja: konkretny obiekt klasy powołany do życia w pamięci. Akcesor: publiczna metoda do bezpiecznego odczytu/zapisu pola prywatnego. Enkapsulacja: zasada zamykania wszystkich pól jako prywatne (private) z udostępnianiem dostępu do nich wyłącznie przez publiczne metody.
Instancyjne: każda instancja ma osobną niezależną kopię (inicjalizowane zazwyczaj przy tworzeniu instancji np. w konstruktorze; dostęp przez (.) lub (->)). Statyczne: tylko jedna współdzielona kopia dla całej klasy bez względu na instancje (wymagają zewnętrznej inicjalizacji w pliku .cpp; dostęp operatorem zakresu np. Klasa::pole).
Domyślny: wstępnie konfiguruje klasę bez argumentów zewnętrznych (Klasa();). Argumentowy: narzuca wstępny stan startowy używając przekazanych zmiennych (Klasa(int x);). Kopiujący: powołuje całkowicie nową instancję na podstawie danych innej istniejącej już instancji (Klasa(const Klasa&);).
Const za metodą blokuje jej możliwość zmiany wewnętrznych pól klasy oraz pozwala działać na 'stałych instancjach'. Mutable przed polem to odgórny wyjątek pozwalający na nadpisywanie tego konkretnego pola nawet kiedy wywołana metoda to const lub instancja jest stała.
Publiczne (sekcje zostają bez zmian) Chronione (publiczne stają się chronionymi) Prywatne (domyślne - wszystko staje się prywatne). Prywatne składniki z klasy bazowej zawsze wpadają do niedostępnej 'sekcji zabronionej'. Wyjątek (słowo kluczowe using KlasaBazowa::pole;) przywraca dawną widoczność dla składników niebędących oryginalnie prywatnymi.
Elementarna: proste jednokrotne przedłużenie bazy. Drzewiasta jednopoziomowa: kilka klas pochodnych budowanych od tego samego korzenia. Drzewiasta wielopoziomowa: tworzenie kolejnych pokoleń (pochodna staje się bazą dla innej). Diamentowa: dziedziczenie dwóch odgałęzień w jednym punkcie wymagające dziedziczenia wielobazowego oraz specyfikatora virtual by nie dublować korzenia.
To wysoce uogólniona 'niedokończona' baza (z minimum jedną metodą czysto wirtualną '=0' lub ochronionymi konstruktorami) z której nie można zbudować samodzielnej instancji. Służy wyłącznie jako fundament (wspólny interfejs) do dziedziczenia i uruchamiania zachowań z użyciem polimorfizmu.
Polega na automatycznym wyborze (nadpisanej) metody dopiero podczas pracy programu bazując na faktycznym rzeczywistym typie schowanym we wskaźniku. Wymaga definicji wirtualnych (virtual w bazie i override w pochodnej). Idea: Baza* wsk = new Pochodna; wsk->wirtualna_metoda();.
Zależność: słabe i tymczasowe użycie klasy (np. jako argument). Asocjacja: swobodna współpraca równorzędnych i żyjących obok siebie bytów. Agregacja: relacja całość-część gdzie usunięcie agregatu nie niszczy elementów grupy. Kompozycja: bardzo ścisła relacja własności – usunięcie całości niszczy nieodwracalnie wszystkie wewnętrzne składowe moduły.
Ciągłe ułożenie pełnych rozbudowanych instancji pochodnych w których początek to oryginalny mały 'klocek' z klasy bazowej po którym występuje strefa dopisana w klasie pochodnej. To tworzy w pamięci strukturalne "dziury" z punktu widzenia klasy bazowej przez co jej bezpieczna iteracja przy użyciu wskaźnika rzuconego w dół jest niemożliwa.
Jako metoda klasy (gdzie lewy argument to obiekt pod this) oraz jako wolna zaprzyjaźniona globalna funkcja. 1-arg: Typ operator!(). 2-arg z klasy: Typ operator+(const Typ&). 2-arg jako funkcja: friend ostream& operator<<(ostream& const Typ&). Wieloargumentowy dozwolony tylko jako przeciążenie nawiasów ( ) np. Typ operator()(int a int b).
Nieformalne to ręczne wywoływanie typowych metod użytkownika (np. double toDouble()). Formalne to wbudowane silnikowo algorytmy rzutujące automatycznie w czasie kompilacji obejmujące konstruktory konwertujące (np. Klasa(int z zewnątrz)) oraz specyficzne operatory konwersji wymuszające wydanie oczekiwanej wartości (np. operator double() { }).
Element po elemencie: ręczne bezpieczne kopiowanie komórek z użyciem standardowej pętli (np. cel[i] = org[i]). Kopia binarna: radykalne błyskawiczne i masowe przepisywanie czystych bajtów pamięci przez gotowe funkcje jak np. memcpy dozwolone tylko na prostych spłaszczonych strukturach.
static_cast: bezpieczne kompilacyjne przejścia. const_cast: zdejmowanie kłódki 'const' blokującej edycję wskaźników/referencji. reinterpret_cast: omijające wszelkie zasady i silnie inwazyjne forsowanie interpretacji pamięci. dynamic_cast: do polimorfizmu podczas wykonywania programu gdzie niezgodność zwraca nullptr. bit_cast: szybka weryfikowana na bieżąco przed kompilacją binarna kopia struktury obiektu.@