Ściąga z JTP. (Ja Tjeba Pierd...) Uwagi, nowe pytania, poprawki itd. zgłaszać na forum mambo.



Podobne dokumenty
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

PARADYGMATY PROGRAMOWANIA Wykład 4

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Szablony funkcji i klas (templates)

Wykład 8: klasy cz. 4

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Identyfikacje typu na etapie. wykonania (RTTI)

TEMAT : KLASY DZIEDZICZENIE

Język C++ Programowanie obiektowe

Spis treści. Wprowadzenie 15

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

.NET Klasy, obiekty. ciąg dalszy

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Abstrakcyjny typ danych

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Szablony. Szablony funkcji

Szablony klas, zastosowanie szablonów w programach

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wykład 9: Polimorfizm i klasy wirtualne

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Obsługa wyjątków. Język C++ WW12

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

C++ - [4-7] Polimorfizm

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Rozdział 4 KLASY, OBIEKTY, METODY

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

C++ Przeładowanie operatorów i wzorce w klasach

Zaawansowane programowanie w C++ (PCP)

Podstawy programowania skrót z wykładów:

Wykład 4: Klasy i Metody

Część I Programowanie niskiego poziomu w języku C 19

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Dziedziczenie jednobazowe, poliformizm

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Wykład 5 Okna MDI i SDI, dziedziczenie

Materiały do zajęć VII

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Zaawansowane programowanie w C++ (PCP)

Język C++ wykład VIII

STL: Lekcja 1&2. Filozofia STL

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

Język C++ Różnice między C a C++

Programowanie, część I

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Dziedziczenie. Ogólna postać dziedziczenia klas:

Podstawy Programowania Obiektowego

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie 2. Język C++. Wykład 3.

Wprowadzenie do programowanie obiektowego w języku C++

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wprowadzenie do szablonów szablony funkcji

Programowanie obiektowe - 1.

Kurs WWW. Paweł Rajba.

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Klasy cd. Struktury Interfejsy Wyjątki

Lab 9 Podstawy Programowania

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Wprowadzenie do szablonów szablony funkcji

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Wstęp do programowania obiektowego, wykład 7

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Programowanie obiektowe

Programowanie, część I

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie i struktury danych

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wyjątki (exceptions)

Dziedziczenie. Tomasz Borzyszkowski

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Programowanie Obiektowe i C++

PHP 5 język obiektowy

Język C++ zajęcia nr 2

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie obiektowe w języku

Szablony funkcji i szablony klas

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

10. Programowanie obiektowe w PHP5

Wykład 5: Klasy cz. 3

Do czego służą klasy?

Transkrypt:

Spis treści Ściąga z JTP (Ja Tjeba Pierd...) Uwagi, nowe pytania, poprawki itd. zgłaszać na forum mambo. Rzutowanie typów...1 Obiektówka i polimorfizm...2 Szablony...6 Wyjątki...8 STL i biblioteka standardowa...10 Modyfikatory...11 Kompilacja...12 Duperszmity...13 Rzutowanie typów Rodzaje rzutowań 1. Rzutowanie niejawne dokonuje się automatycznie, gdy próbujemy jakiejś zmiennej przypisać wartość innego typu: int foo = 5; float bar = foo; 2. Rzutowanie jawne wykonujemy samodzielnie za pomocą odpowiednich operatorów rzutowania i ręcznie określając typ. Rodzaje rzutowań jawnych 1. dynamic_cast Operuje wyłącznie na wskaźnikach i referencjach. W przypadku obiektów polimorficznych wykorzystuje RTTI do określenia ich typu i zdecydowania, czy mogą być one zrzutowane na wybrany typ. Jeśli nie, zwracany jest wskaźnik pusty NULL. Dla obiektów niepolimorficznych dynamic_cast zezwala na konwersję z klasy pochodnej do bazowej, ale nie na odwrót (błąd kompilacji). 2. static_cast Operuje na wskaźnikach, pozwala na rzutowanie między typami klas powiązanymi ze sobą, zarówno z klasy potomnej do bazowej, jak i na odwrót. Nie jest jednak wykonywane żadne dynamiczne sprawdzenie, czy rezultat takiego działania będzie mieć sens. static_cast może także pracować na zwykłych wartościach, udostępniając konwersję między typami podstawowymi (np. int i double). 3. reinterpret_cast Rzutuje dowolny typ wskaźnikowy na dowolny inny bez żadnego sprawdzania typów oraz poprawności. Nowy obiekt jest binarną kopią źródłowego. 4. const_cast pozwala zdjąć lub nałożyć parametr const na wybraną zmienną. Co oznacza skrót RTTI? Run-Time Type Information. Jest to technika polegająca na przechowywaniu w pamięci informacji o typach danych. Pozwala to sprawdzać typy podczas wykonywania programu. W C++ RTII jest niezbędne do działania operatora typeid oraz dynamic_cast. 1 z 13

Co robi typeid? Operator ten zwraca referencję do obiektu identyfikującego typ podanego za parametr wyrażenia. Można dzięki temu porównywać typy lub pobierać ich nazwę. Obiekt typeinfo zawarty jest w nagłówku typeinfo. #include <typeinfo> #include <iostream> int main() int *a, b; a = 0; b = 0; if(typeid(a)!= typeid(b)) cout << typeid(a).name() << ", " << typeid(b).name(); } } // end main(); Obiektówka i polimorfizm Funkcje/pola publiczne, prywatne i chronione... Różnią się w zależności od tego, skąd można się do nich odwołać: 1. Element publiczny dowolne miejsce kodu. 2. Element chroniony wyłącznie obiekty tej samej klasy oraz klas potomnych. 3. Element prywatny wyłącznie obiekty tej samej klasy. Dziedziczenie publiczne, prywatne i chronione... Zmienia widoczność elementów klasy bazowej według następujących zasad: 1. publiczne wszystkie elementy klasy bazowej zachowują oryginalną widoczność. 2. chronione elementy publiczne w klasie bazowej stają się chronionymi w pochodnej, reszta pozostaje bez zmian. 3. prywatne elementy publiczne i chronione w klasie bazowej stają się prywatne w klasie pochodnej, zatem nie są widoczne dla kolejnych klas, które dziedziczą po klasie pochodnej. Co to jest polimorfizm? Polimorfizm umożliwia zapamiętanie w obiektach informacji o tym, czym tak naprawdę są, dzięki czemu zachowują swoje oryginalne zachowania nawet po zrzutowaniu do klasy bazowej. Załóżmy, że klasa bazowa base posiada metodę foo(), a klasa pochodna derive przeciąża foo(). Tworzymy obiekt klasy derive, przypisujemy go do wskaźnika x typu base i wywołujemy spod niego metodę foo(). Co się stanie: 1. Bez polimorfizmu wywołana zostanie metoda foo() z klasy bazowej pomimo tego, że obiekt tak naprawdę jest klasy derive. Metoda została określona w momencie kompilacji na podstawie typu wskaźnika. 2 z 13

2. Z polimorfizmem wywołany zostanie wskaźnik do odpowiedniej metody przechowywany w tablicy metod wirtualnych obiektu. Jeżeli do x przypisaliśmy obiekt klasy derive, wywoła się przeciążona metoda. Jeżeli zaś obiekt klasy base, wtedy podstawowa. Czym są metody (funkcje) wirtualne? Są to metody poprzedzone słowem kluczowym virtual. Są realizacją polimorfizmu. Zadeklarowanie metody jako wirtualnej powoduje, że jej adres zostaje zapamiętany w tablicy metod wirtualnych, do której wskaźnik trafia do każdego obiektu tej klasy. Wywołując taką metodę nawet po zrzutowaniu obiektu do klasy nadrzędnej, zostanie wywołana "ta właściwa" wybór konkretnej metody następuje w momencie wykonania programu, a nie kompilacji, na podstawie tablicy metod wirtualnych. Czym się różni dziedziczenie zwykłe od wirtualnego? Różnice dotyczą dziedziczenia wielokrotnego. Załóżmy następującą sytuację: klasa D dziedziczy z B i C, a obie te klasy dziedziczą z klasy A. A B C Teraz: D 1. Przy dziedziczeniu zwykłym wszystkie elementy klasy A zostaną powielone dwukrotnie w klasie D, co prowadzi do niejednoznaczności. 2. Przy dziedziczeniu wirtualnym wszystkie elementy klasy A wystąpią w klasie D dokładnie jeden raz. Kiedy klasa powinna mieć destruktor wirtualny? Klasa powinna mieć destruktor wirtualny zawsze, gdy mamy w niej choć jedną metodę wirtualną. Czy i ew. kiedy można jawnie wywołać destruktor klasy? W sytuacji gdy korzystamy z "placement new" (umieszczanie obiektów w ściśle określonym miejscu pamięci), bierzemy całkowitą odpowiedzialność za zniszczenie stworzonych tak obiektów. Wtedy można, a nawet trzeba jawnie wywołać destruktor. W jakiej kolejności niszczone są obiekty? Obiekty są niszczone w odwrotnej kolejności do tej, jak były tworzone (tj. pierwszy utworzony = ostatni zniszczony). Analogiczna sytuacja dotyczy obiektów umieszczonych w tablicach. W jakiej kolejności wywoływane są destruktory obiektu? Kolejno od najwyżej położonej klasy pochodnej do klasy bazowej. Jeżeli jakaś klasa dziedziczy po kilku innych, ich destruktory wywoływane są w odwrotnej kolejności, niż zostały wymienione na liście dziedziczonych klas. 3 z 13

Jakie są własności funkcji/klas zaprzyjaźnionych? 1. Przyjaźń nie jest dziedziczona. 2. Przyjaźń nie jest przechodnia. Jeśli A jest przyjacielem B oraz B jest przyjacielem C, to A nie jest przyjacielem C, o ile nie zadeklarowaliśmy jawnie inaczej. 3. Przyjaźń nie jest zwrotna. To, że klasa A ma dostęp do prywatnych składowych B nie znaczy, że B ma dostęp do prywatnych składowych A. Jakich operatorów nie można przeciążać? Nieprzeciążalnymi operatorami są: 1.. (kropka) 2..* 3.?: 4. :: (operator zakresu) 5. sizeof Na czym polega const correctness? Polega na ochronie przed celową lub przypadkową zmianą obiektu przy pomocy słowa kluczowego "const". Argumenty typu const mogą być używane wyłącznie do odczytu kompilator zablokuje próbę wykonania na nich jakichkolwiek operacji modyfikujących wartość, w tym próbę wywołania metod obiektu, które taką zmianę powodują. Kiedy wskaźnik do obiektu klasy potomnej nie może być rzutowany do wskaźnika obiektu klasy bazowej? Gdy mamy wielokrotne dziedziczenie i ścieżka rzutowania jest niejednoznaczna: A A B C D Rozwiązanie (rzutujemy wskaźnik do d na wskaźnik do a): d obj; a *p = static_cast<d::b*>(&obj); Co to jest ADL, OL i czym się różnią? 1. OL Ordinary Lookup szukanie operatora w aktualnym kontekście. 2. ADL Argument Depending Lookup, Koeing Lookup poszukiwanie operatora w przestrzeni nazw, w której zadeklarowane są typy obu jego argumentów. 4 z 13

Rozwiń skrót VMTP. Virtual Method Table Pointer wskaźnik do tablicy metod wirtualnych używanej przy polimorfiźmie. Zawiera go każdy obiekt, w którym korzystamy z metod wirtualnych. Jak utworzyć klasę, z której nie można dziedziczyć? class Finalizer friend class A; private: Finalizer()} class A: public virtual Finalizer Jaki typ powinien zwracać przeciążony operator ->? Operator ten musi zwrócić wskaźnik lub obiekt klasy, który także ma przeciążony ten sam operator. Czy klasa zagnieżdżona ma dostęp do prywatnych składowych klasy zewn.? Tak. Poniższy kod nie powoduje żadnego błędu kompilacji: class foo public: class bar public: int xyz(foo &x) return x.foobar; } void setfoobar(int a) foobar = a; } private: int foobar; Czym się różni struktura (struct) od klasy (class)? W C++ jedyna różnica (oprócz słowa kluczowego) polega na tym, że jeżeli określiliśmy jakiś element składowy poza modyfikatorem dostępu (public, private, protected), to: 1. W klasie będzie on prywatny. 2. W strukturze będzie on publiczny. Poza tym struktury mogą posiadać metody, podlegają dziedziczeniu, możliwe jest także, 5 z 13

żeby struktura dziedziczyła po klasie i na odwrót. Jakie elementy klasy nie podlegają dziedziczeniu? 1. Konstruktory 2. Destruktory 3. Operator przypisania (=) Jak wygląda algorytm wyboru funkcji przeciążonej? 1. Dopasowanie dokładne: brak lub trywialne konwersje (T -> const T) 2. Dopasowanie z promocjami (całkowitymi lub zmiennoprzecinkowymi), np. bool -> int czy float -> double. 3. Dopasowanie ze standardowymi konwersjami (double -> int) 4. Dopasowanie z konwersjami zdefiniowanymi przez użytkownika (operatory konwersji, konstruktory konwertujące) 5. Dopasowanie do funkcji z dowolną ilością parametrów. Szablony Co to jest metaprogramowanie? Technika programowania umożliwiająca programom tworzenie/modyfikację kodu źródłowego innych programów lub ich samych. Jedną z implementacji jest metaprogramowanie z użyciem szablonów w C++. Co to jest programowanie uogólnione (generic programming)? Pozwala na pisanie kodu bez wcześniejszej znajomości typów danych, na których ten kod będzie pracować. W C++ realizowane przy pomocy szablonów. Opisz pojęcie klasy wytycznych (policy class). Klasa wytycznych mówi, w jaki sposób ma być realizowana obsługa elementarnego zadania w większej klasie X. Do klasy X przekazywana jest jako parametr szablonu. Przykład klasy parametryzowanej wytycznymi: template <class T, class Foo> class Bar: public Foo Możemy teraz sami decydować, po jakiej klasie ma dziedziczyć klasa Bar. Klasa, po której dziedziczymy, jest właśnie klasą wytycznych. Przykłady: alokatory w STL-u. Konkretyzacja na żądanie i konkretyzacja jawna. 1. Konkretyzacja jawna kompilator konkretyzuje od razu całą klasę w momencie, gdy będziemy chcieli jej użyć. 2. Konkretyzacja na żądanie kompilator konkretyzuje wyłącznie metody klasy, które 6 z 13

wykorzystujemy. W ten sposób można konkretyzować klasę typem, który nie spełnia wszystkich ograniczeń. Wszystko będzie w porządku, dopóki nie będziemy próbowali wykonać operacji odwołujących się do niespełnianych założeń. Aby poinformować kompilator, że chcemy mieć konkretyzację na żądanie, należy poprzedzić deklarację zmiennej słowem template: template foo<int> variable; Co to jest CRTP? Curiously Recurring Template Pattern idiom programowania uogólnionego. Dziedziczymy z klasy bazowej, której parametrem jest aktualnie definiowana klasa: template <class T> class Base class Derived: public Base<Derived> Co to jest polimorfizm statyczny? Jest to imitacja polimorfizmu wykonywana z użyciem szablonów. Polega na odpowiednim zrzutowaniu typów jeszcze w momencie kompilacji za pomocą schematu CRTP. Przykład: template <class Derived> struct base void interface() static_cast<derived*>(this)->implementation(); } struct derived : base<derived> void implementation(); Do czego służy słowo kluczowe typename? Służy do podpowiadania przy deklarowaniu pól klasy, że odwołujemy się do typu składowego innej klasy, a nie np. jej zmiennej statycznej. template <class T> class foo typename T::id x; public: void func() x.g(); } 7 z 13

class bar public: class id public: void g() } foo<bar> variable; variable.func(); W powyższym przypadku dzięki typename zaznaczyliśmy, że potrzebujemy klasy składowej id z typu przekazanego parametrem T. Bez tego słowa powstałby w tamtym miejscu błąd kompilacji. typename może być też używany w obrębie deklaracji szablonu zamiast słowa kluczowego class: template <typename T> Opisz pojęcie klasy cech (traits). Klasa cech dostarcza dodatkowych informacji o używanym typie: typy stowarzyszone, ograniczenia, dostępne operacje. Przekazywujemy ją przez parametry szablonu. Co to jest koncept? Odpowiednik interfejsu z programowania obiektowego dla programowania uogólnionego. Koncept określa podstawowe warunki jakie musi spełniać typ, aby mógł być zaliczonym do odpowiedniej kategorii. Jak wygląda algorytm rozstrzygania przeciążenia szablonów funkcji? 1. Tworzenie zbiorów specjalizacji. 2. Do dalszych rozważań wybierane są funkcje bardziej specjalizowane (lepiej pasujące do wywołania). 3. Rozstrzyganie przeciążenia na zbiorze specjalizacji i funkcji przeciążonych. 4. Jeśli funkcja i specjalizacja są jednakowo dobre, wybierana jest funkcja. Wyjątki Kiedy wyjątek będzie złapany? try throw Thrown; } catch(caught) } 1. Gdy Thrown I Caught są tego samego typu. 8 z 13

2. Gdy Caught jest jednoznaczną klasą bazową Thrown. 3. Gdy Caught i Thrown są wskaźnikami do typów spełniających warunek 1 albo 2. 4. Gdy Caught i Thrown są referencjami do typów spełniających warunek 1 albo 2. Jakiej konstrukcji używamy do łapania wszystkich wyjątków? try } catch(...) // wszystko idzie tutaj. } Kiedy wołana jest funkcja unexpected()? Gdy funkcja rzuci wyjątek, którego nie złapiemy i którego nie miała wyszczególnionego na liście wyjątków. Jakie są standardowe wyjątki C++? 1. exception podstawowa klasa wyjątku 2. bad_alloc rzucany przez operator new w przypadku niepowodzenia. 3. bad_cast rzucany przez dynamic_cast. 4. bad_exception rzucany, gdy wyjątek nie pasuje do żadnego bloku catch. 5. bad_typeid rzucany przez typeid. 6. ios_base::failure rzucany przez bibliotekę iostream. Jak powiadomić kompilator o tym, jakie wyjątki może wygenerować funkcja? Po liście parametrów podajemy słowo kluczowe throw i wymieniamy w nawiasie dozwolone typy wyjątków: void foo(char bar) throw(int); Jak powiadomić kompilator, że funkcja nie może rzucać żadnych wyjątków? Po liście parametrów podajemy słowo kluczowe throw z pustymi nawiasami: void foo(char bar) throw(); Jak przekazać wyjątek do obsługi nadrzędnemu blokowi try...catch? W bloku catch umieszczamy słowo kluczowe throw bez żadnych parametrów: try } catch(foo &x) throw; 9 z 13

} STL i biblioteka standardowa Co to jest kontener? Kontener służy do przechowywania w pewien uporządkowany sposób kolekcji obiektów tego samego typu. Rodzaje kontenerów: 1. Sekwencyjne (vector, list, deque) nie mogą być zaimplementowane za pomocą innych kontenerów bez straty efektywności. 2. Asocjacyjne (map, multimap) implementacje bazujące na drzewach. 3. Uporządkowane (set, multiset) odmiana kontenerów asocjacyjnych. 4. Adaptery (stack, queue, priority_queue) - bazują na innych kontenerach, wprowadzając ograniczenia dostępowe 5. Specjalne (string, bitset, valarray) Co to jest alokator? Alokator to klasa wytycznych zajmująca się zarządzaniem pamięcią w kontenerach. Co to jest funktor? Inaczej obiekt funkcyjny z przeciążonym operatorem funkcji (). Używany jest do parametryzowania algorytmów i przycinania ich do naszych potrzeb. Przykładowe funktory: plus, minus, negate Co to jest iterator? Iterator jest jest uogólnieniem wskaźnika; jest to obiekt służący do wskazywania na inny obiekt, a także do przemieszczania się po sekwencji obiektów. Wymień koncepty iteratorów. 1. TrivialIterator wskaźnik bez iteracji. 2. OutputIterator taśma wyjściowa: inkrementacja i dereferencjacja do l-wartości. Porównywalny. 3. InputIterator taśma wejściowa: inkrementacja i dereferencjacja do r-wartości. Porównywalny. 4. ForwardIterator połączenie InputIterator oraz OutputIterator. 5. BidirectionalIterator ForwardIterator z dekrementacją. 6. RandomAccessIterator BidirectionalIterator z operacjami dodawania/odejmowania. Porównywalny, także za pomocą operatorów relacji (mniejszy, większy). Wymień adaptery iteratorów. 1. front_insert_iterator 2. back_insert_iterator 10 z 13

3. insert_iterator Jakie są założenia algorytmów w STL? Algorytmy te mają charakter ogólny nie są pisane z myślą o konkretnej strukturze danych. Operują na sekwencjach elementów wyznaczonych przez parę iteratorów, z których pierwszy wskazuje na początkowy element, a drugi za ostatnim elementem. Dlaczego sort() z STL jest szybszy, niż qsort() z C? 1. Mechanizm porównywania przekazujemy do qsort() za pośrednictwem wskaźnika do funkcji. Jej wywoływanie przez to zajmuje trochę czasu. W STL-u operacja porównania jest rozwijana na miejscu już w momencie kompilacji. 2. W STL-u nie mamy w tym miejscu żadnego rzutowania typów z void*. Was steht für ein Manipulator? Element sterujący strumieni. Rodzaje manipulatorów: 1. Włączanie flag 2. Wyłączanie flag 3. Podstawa systemu liczbowego 4. Rodzaj formatu zmiennopozycyjnego 5. Wyrównywanie 6. Sterowanie wyjściem 7. Parametryzowane Modyfikatory Do czego służy volatile? Informuje kompilator, że wykorzystanie tej zmiennej nie może być optymalizowane np. przez czasowe przeniesienie jej do rejestru procesora bądź cache, gdyż istnieje prawdopodobieństwo, że może być ona w tym samym czasie zmodyfikowana przez inny wątek, co prowadziłoby oczywiście do nieścisłości w wykonywanym programie. Do czego służy mutable? Informuje, że dane pole obiektu może być zmieniane nawet przez metody const lub gdy obiekt przekazywany jest jako parametr typu const. Do czego służy register? Informacja dla kompilatora, że zmienna powinna być optymalizowana poprzez przeniesienie jej do rejestru. Obecnie ignorowana w zasadzie przez każdy kompilator. Do czego służy auto? Deklaruje zmienną lokalną, dodatkowo automatycznie wybiera typ na podstawie podanej wartości. Dzisiaj w zasadzie nieużywany. 11 z 13

Kompilacja Wymień etapy kompilacji. 1. Analiza leksykalna rozdzielenie kodu na elementarne jednostki języka zwane tokenami. 2. Analiza składniowa sprawdzenie, czy ułożenie tokenów nie łamie żadnej z reguł gramatycznych języka. 3. Analiza semantyczna określenie znaczenia poszczególnych tokenów. Na koniec tego etapu otrzymujemy reprezentację pośrednią kodu źródłowego. 4. Optymalizacja wiadomo. 5. Generacja kodu wynikowego. Wymień etapy budowania programu wynikowego. 1. Preprocessing preprocesor (kod źródłowy -> jednostka translacji) 2. Kompilacja kompilator (jednostka translacji -> plik obiektowy) 3. Łączenie linker (pliki obiektowe + biblioteki -> program) Czym się różni łączenie zewnętrzne od wewnętrznego? 1. Elementy łączone wewnętrznie są dostępne wyłącznie w obrębie kodu stanowiącego jedną jednostkę translacji. 2. Elementy łączone zewnętrznie są dostępne ze wszystkich plików obiektowych tworzących program. Jak wymusić łączenie wewnętrzne? Poprzez zastosowanie nienazwanych przestrzeni nazw. W jaki sposób zapewnić, aby zmienna globalna była łączona zewnętrznie? Poprzez użycie słowa kluczowego extern: extern int foo; Co to jest ODR? One Definition Rule. Mówi ona, że jedna nazwa (klasa, szablon, funkcja inline) może być zdefiniowana kilkakrotnie, jeżeli: 1. Każda definicja znajduje się w innej jednostce translacji. 2. Definicje są identyczne co do tokenu. 3. Znaczenie tokenów jest identyczne we wszystkich jednostkach translacji. Dlaczego definicje klas należy umieszczać w plikach nagłówkowych? Definicje podlegają regule ODR. Gdyby np. klasa została umieszczona w kilku jednostkach translacji w niezbyt identycznej formie, wystąpiłby błąd kompilacji. Czym są wiązania wczesne i późne? 1. Wiązanie wczesne (early binding) wiązanie wywołania funkcji składowej w czasie kompilacji 2. Wiązanie późne (late binding) wiązanie wywołania funkcji w czasie wykonywania. 12 z 13

Duperszmity Czym jest Smart Pointer? Abstrakcyjny typ danych symulujący wskaźnik i zapewniający dodatkowe właściwości pozwalające uniknąć błędów, np. automatyczne niszczenie obiektu, gdy ten przestaje być już używany. Kiedy tworzona jest zmienna statyczna? 1. Gdy zadeklarujemy zmienną jako zmienną globalną. 2. Gdy deklarację zmiennej poprzedzimy słowem kluczowym static. Rozwiń skrót RAII. Resource Allocation Is Initialization oznacza tworzenie na stosie specjalnych obiektów, których destruktory zwalniają zajęte miejsce podczas zwijania stosu. Takimi obiektami mogą być smart pointery. W jaki sposób korzysta się ze słowa kluczowego enum? enum [nazwa_typu] wartosc1 [= liczba], wartosc2 [= liczba],... } [lista nazw zmiennych oddzielonych przecinkiem]; Co to znaczy "foo"? :) http://pl.wikipedia.org/wiki/foo http://tools.ietf.org/html/rfc3092 13 z 13