Prasek Aneta, Skiba Katarzyna
Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać wartość swoich różnych atrybutów. Funkcja stała jest zdefiniowana przez słowo kluczowe const, które jest wstawione po deklaracji i definicji funkcji. Funkcja stała może wywoływać tylko funkcje stałe. Słowo kluczowe const umieszczone po nazwie funkcji nie ma nic wspólnego z const umieszczonym przed nazwą. Pierwsze zastosowanie modyfikuje deklarację wskaźnika this dla funkcji składowej, drugie dotyczy wartości zwracanej przez funkcję. FUNKCJA STAŁA CONST
ZAPRZYJAŹNIONE FUNKCJE I KLASY
Zaprzyjaźnione z klasą mogą być funkcje, klasy i metody klas. Funkcja zaprzyjaźniona nie jest metodą klasy, ale ma dostęp do wszystkich składowych klasy. Tworząc funkcję zaprzyjaźnioną musimy * umieścić jej prototyp w deklaracji klasy, * zdefiniować funkcję. DEFINIOWANIE ZAPRZYJAŹNIONYCH FUNKCJI
Definicja klas zaprzyjaźnionych ma postać class X { public: friend class Y;// klasa Y posiada dostęp do prywatnych danych X //tu metody klasy X private: //tu pola klasy X }; class Y { //tu pola i metody klasy Y }; DEFINIOWANIE ZAPRZYJAŹNIONYCH KLAS
Klasa Y jest zaprzyjaźniona z klasą X, posiada dostęp do jej prywatnych danych. Metody klasy Y mogą korzystać z interfejsu klasy X, nie muszą być zaprzyjaźnione z tą klasą. Zamiast definiować klasy zaprzyjaźnione, można zdefiniować zaprzyjaźnione funkcje składowe. Wtedy deklaracja klas musi przebiegać w następującej kolejności : DEFINIOWANIE ZAPRZYJAŹNIONYCH KLAS
class X; class Y { //tu deklacja pól i metod klasy Y, //metody używające klasy X - tylko prototypy }; class X { //tu deklacja pól i metod klasy X //i funkcje zaprzyjaźnione z klasą Y //o prototypach podobnych do friend typ_wyniku Y::nazwa_funkcji(argumenty); }; //tu definicje metod klasy Y DEFINIOWANIE ZAPRZYJAŹNIONYCH KLAS
Typowym zastosowaniem funkcji zaprzyjaźnionej jest przeciążanie operatora <<. Przeciążenie operatora << umożliwi wyświetlanie obiektów za pomocą instrukcji cout << obiekt; Prototyp funkcji zaprzyjaźnionej, przeciążającej operator << powinien mieć postać: friend ostream & operator<<(ostream &, const Nazwa_klasy &); natomiast definicja ostream & operator<<(ostream & os, const Nazwa_klasy obiekt) { os <<...; // tu wstawić wyświetlanie wartości pól obiektu return os; } STOSOWANIE FUNKCJI ZAPRZYJAŹNIONYCH
W programowaniu obiektowym interfejs jest abstrakcyjną reprezentacją klasy. Interfejs umożliwia korzystanie z danej klasy, niezależnie od faktycznej implementacji. Interfejs pozwala na hermetyzację obiektów, utworzonych w oparciu o klasy zawierające definicję (implementację) wspólnego interfejsu. Tak rozumiany interfejs, w ramach programowania obiektowego, określany jest też mianem interfejs klasy. Implementacja - informatyczny proces przekształcania abstrakcyjnego opisu systemu lub programu na obiekt fizyczny: komputer lub działający program zapisany w konkretnym języku programowania; także obiekt fizyczny będący efektem takiego przekształcenia, np. implementacja systemu operacyjnego lub kompilatora dla konkretnego typu komputera. INTERFEJS A IMPLEMENTACJA
Najbardziej efektywne dla małych i średnich funkcji Rozwijane w miejscu wywołania Brak narzutu na wywołanie funkcji Kompilator generuje odpowiedni kod i odwzorowuje parametry Oprócz tego generowana kopia implementacji funkcji (na wypadek, gdyby programista chciał pobrać jej adres) Dwie metody specyfikacji funkcji otwartej: Podanie implementacji w deklaracji klasy Użycie słowa kluczowego inline w definicji funkcji FUNKCJE OTWARTE (INLINE)
Funkcje otwarte muszą być zdefiniowane w plikach nagłówkowych aby umożliwić kompilatorowi generację kopii funkcji w momencie ich użycia Metody zdefiniowane wewnątrz deklaracji klasy są niejawnie deklarowane jako otwarte Kompromis między wydajnością a ukrywaniem informacji Odwołanie się do pól zdefiniowanych poniżej ich definicji jest poprawne FUNKCJE OTWARTE (INLINE)
brak oddzielenia interfejsu od implementacji brak ukrywania informacji Kod używający funkcji otwartych musi być ponownie skompilowany, gdy: treść metody ulegnie zmianie zostanie ona zastąpiona zwykłą metodą i odwrotnie inline to żądanie, nie polecenie można rozwinąć ręcznie, ale to kosztowne Rozmiar pliku wykonywalnego może ulec powiększeniu zwykle nie jest to problemem WADY I ZALETY FUNKCJI OTWARTYCH