Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory Wskaźnik this Destruktor Przeciążanie funkcji i operatorów Funkcje otwarte

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

Wykład 8: klasy cz. 4

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

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

Wstęp do Programowania 2

PARADYGMATY PROGRAMOWANIA Wykład 2

TEMAT : KLASY DZIEDZICZENIE

PARADYGMATY PROGRAMOWANIA Wykład 4

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

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

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

Szablony klas, zastosowanie szablonów w programach

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

Wykład 4: Klasy i Metody

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wykład 5: Klasy cz. 3

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

Wstęp do programowania

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

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

Materiały do zajęć VII

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

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

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

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

PARADYGMATY PROGRAMOWANIA Wykład 3

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

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Programowanie w języku C++

Podstawy Programowania Obiektowego

Zaawansowane programowanie w języku C++ Klasy w C++

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

Szablony funkcji i szablony klas

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

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

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

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

Język C++ zajęcia nr 2

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

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

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Przekazywanie argumentów wskaźniki

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Podstawy programowania obiektowego

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

Do czego służą klasy?

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

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

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

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

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Wykład 5: Więcej o Klasach i Metodach

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Wstęp do programowania

Szablony. Szablony funkcji

Wprowadzenie do szablonów szablony funkcji

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

KLASY cz.1. Dorota Pylak

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

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

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

Programowanie obiektowe

Wprowadzenie do szablonów szablony funkcji

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie w języku C++

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

Zaawansowane programowanie w C++ (PCP)

Podział programu na moduły

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

Kurs WWW. Paweł Rajba.

Wskaźniki Cztery atrybuty zmiennej. Wskaźnik jest typem wartości. Operator * oznacza: Operator & oznacza: nazwa typ. wartość lokacja (adres)

Referencje do zmiennych i obiektów

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Wstęp do programowania obiektowego, wykład 7

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

Przeciążenie (przeładowanie nazw) funkcji

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Podstawy programowania w języku C++

Wyjątki (exceptions)

ALGORYTMY I STRUKTURY DANYCH

Wstęp do programowania obiektowego. Wykład 2

Wprowadzenie do programowanie obiektowego w języku C++

Transkrypt:

Dzisiejszy wykład Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory Wskaźnik this Destruktor Przeciążanie funkcji i operatorów Funkcje otwarte 1

Interfejs prostej klasy Date Oto deklaracja (nie definicja) prostej klasy class DateType { public: // constructor DateType(); DateType(int newmonth, int newday, int newyear); // accessor methods (get methods) int GetYear( ) const; // returns Year int GetMonth( ) const; // returns Month int GetDay( ) const; private: ; int Year; int Month; int Day; // returns Day Deklaracja typu czy zmiennej? Co oznacza public/private? Co oznacza const? Co to są pola? Co to są metody? Czego tu brakuje? 2

Użycie prostej klasy Date Oto przykład użycia prostej klasy class DateType { public: // constructor DateType(); DateType(int newmonth, int newday, int newyear); // accessor methods (get methods) int GetYear( ) const; // returns Year int GetMonth( ) const; // returns Month int GetDay( ) const; private: ; int Year; int Month; int Day; // returns Day Jak są inicjalizowane zmienne? Użycie dwóch konstruktorów Czy mamy dostęp do pól? Czy możemy używać metod? DateType today(3, 4, 2004); DateType tomorrow, someday; //can I do this? cout << today.month; //how about cout << today.getmonth(); 3

Implementacja prostej klasy Date Oto definicja (implementacja) prostej klasy // DateType.cpp #include "DateType.h" /** Constructors **/ Czego brakowało w deklaracji? DateType::DateType() { Co to za zmienne Day, Month, Year? Day = 1; Czy DateType.h jest niezbędny do kompilacji? Month = 1; Year = 1; DateType::DateType(int newmonth, int newday, int newyear) { Day = newday; Month = newmonth; Year = newyear; // returns Year int DateType::GetYear( ) const { return Year; // returns Month int DateType::GetMonth( ) const { return Month; // returns Day int DateType:: GetDay( ) const { return Day; 4

Enkapsulacja i ukrywanie informacji klient klient Deklaracja klasy (plik.h) Definicja klasy (plik.cpp) pole dana dana klient metoda metod metod a a Klienci Interfejs Implementacja Enkapsulacja Klasa C++ dostarcza mechanizm grupowania danych i wykonywanych na nich operacji w jeden obiekt Ukrywanie informacji Klasa C++ dostarcza mechanizm określania ograniczeń dostępu do pól i metod 5

Organizacja implementacja Aby umożliwić oddzielną kompilację, typowa organizacja implementacji składa się z dwóch plików: DateType.h DateType.cpp deklaracja klasy definicje składowych Jeżeli użytkownik klasy DateType napisze program składający się z pojedynczego pliku DateClient.cpp, organizacja plików będzie następująca: // DateClient.cpp // #include "DateType.h"... Klienci // DateType.h // class DateType { ;... Interfejs // DateType.cpp // Implementacja #include "DateType.h" int DateType::GetMonth() const { return Month;... 6

Używanie składowych Poza bezpośrednim użyciem składowych, klient używający klasy może zaimplementować funkcje wyższego poziomu które używają metod klasy, np.: enum RelationType {Precedes, Same, Follows; RelationType ComparedTo(DateType datea, DateType dateb) { if (datea.getyear() < dateb.getyear()) return Precedes; if (datea.getyear() > dateb.getyear()) return Follows; if (datea.getmonth() < dateb.getmonth()) return Precedes; if (datea.getmonth() > dateb.getmonth()) return Follows; if (datea.getday() < dateb.getday()) return Precedes; if (datea.getday() > dateb.getday()) return Follows; return Same; Klient 7

Używanie składowych Wówczas DateType Tomorrow(1,18,2002), AnotherDay(10, 12, 1885); if ( ComparedTo(Tomorrow, AnotherDay) == Same ) { cout << "what do you think?" << endl; Projektant klasy DateType mógłby również zaimplementować metodę porównującą dwie daty. Jest to w istocie podejście bardziej naturalne i bardziej użyteczne, gdyż istnieje tylko jeden sposób na zadeklarowanie takiej funkcji. 8

Dodatkowe metody klasy DateType // add to DateType.h: enum RelationType {Precedes, Same, Follows; // file scoped RelationType ComparedTo(DateType datea); // to public section // add implementation to DateType.cpp: RelationType DateType::ComparedTo(DateType otherdate) { if (Year < otherdate.year) return Precedes; if (Year > otherdate.year) return Follows; if (Month < otherdate.month) return Precedes; if (Month > otherdate.month) return Follows; if (Day < otherdate.day) return Precedes; if (Day > otherdate.day) return Follows; return Same; if ( Tomorrow.ComparedTo(AnotherDay) == Same ) cout << Think about it, Scarlett! << endl; 9

Używanie składowych Kolejny przykład: void PrintDate(DateType adate, ostream& Out) { PrintMonth( adate.getmonth( ), Out ); Out << ' ' << adate.getday( ) << ", " << setw(4) << adate.getyear( ) << endl; void PrintMonth(int Month, ostream& Out) { switch (Month) { case 1: Out << "January"; return; case 2: Out << "February"; return;... case 12: Out << "December"; return; default: Out << "Juvember"; Program: DateType LeapDay(2, 29,2000); PrintDate(LeapDay, cout); wypisze: February 29, 2000 10

Klasyfikacja składowych Metody implementują operacje na obiektach. Typy możliwych operacji mogą być klasyfikowane na różne sposoby. Oto powszechna klasyfikacja: Konstruktor Operacja tworząca nowy egzemplarz klasy (nowy obiekt) Mutator Operacja zmieniająca stan jednego lub więcej pola klasy Obserwator Operacja odczytująca stan jednego lub więcej pól klasy, bez ich modyfikacji (Accessor, Getter) Iterator Operacja pozwalająca na kolejne przetwarzanie wszystkich elementów struktury danych W klasie DateType, DateType() jest konstruktorem, GetYear(), GetMonth() i GetDay() są obserwatorami. DateType nie posiada mutatorów ani iteratorów. 11

Konstruktor domyślny Klasa DateType ma dwa jawnie zdefiniowane konstruktory. Zwykle definiuje się konstruktor domyślny, co gwarantuje inicjalizację każdego obiektu klasy: DateType::DateType( ) { Month = Day = 1; // default date Year = 1980; Konstruktor domyślny to konstruktor bez parametrów Zasady dotyczące konstruktorów: nazwa składowej jest identyczna z nazwą klasy konstruktor nie ma specyfikacji wartości zwracanej, nawet void konstruktor domyślny jest wywoływany automatycznie podczas definicji egzemplarza klasy; jeżeli konstruktor przyjmuje parametry muszą one być podane po nazwie zmiennej w momencie deklaracji. 12

Inne konstruktory Klasa DateType posiada również konstruktor z parametrami. Pozwala to użytkownikowi na podanie reprezentowanej daty (ponieważ w klasie brak mutatorów, jest to jedyna możliwość). DateType::DateType(int amonth, int aday, int ayear) { if ( (amonth >= 1 && amonth <= 12) && (aday >= 1) && (ayear >= 1) ) { Month = amonth; Day = aday; Year = ayear; else { Month = Day = 1; // handling user error Year = 1980; Jeżeli konstruktor przyjmuje parametry muszą one być podane po nazwie zmiennej w momencie deklaracji: DateType adate(10, 15, 2000); DateType bdate(4, 0, 2005); // set to 1/1/1980 Kompilator określa który konstruktor wywołać w ten sam sposób, co dla funkcji przeciążonych. 13

Użycie domyślnego konstruktora Jeżeli nie dostarczy się jawnie żadnego konstruktora, kompilator wygeneruje automatycznie konstruktor domyślny. Konstruktor wygenerowany automatycznie nie posiada parametrów wywołuje konstruktor domyślny dla każdego pola, które jest klasą nie inicjalizuje pól, które nie są klasami Dlatego: Projektując klasę, zawsze należy jawnie zaimplementować konstruktor domyślny 14

Wskaźnik this Rozważmy następujący fragment kodu: Czy jest składniowo poprawny? Czy się skompiluje? Czy jest semantycznie poprawny? Czy zadziała bez błędów czasu wykonania? Czy robi coś sensownego? DateType::DateType(int Month, int Day, int Year) { Month = Month; Day = Day; Year = Year; Jaką wartością zostanie zainicjowane today w poniższym kodzie? DateType today(3, 4, 2004); 15

Wskaźnik this Aby zrozumieć this trzeba myśleć w kategoriach klas i obiektów DateType today, tomorrow, nextweek; class DateType today tomorrow nextweek Day Month Year Day Month Year Day Month Year // returns Year int DateType::GetYear( ) const { return Year; Ktorych Month, Day i Year używamy w powyższej definicji? 16

Wskaźnik this this jest przekazywany jako dodatkowy, niejawny argument do wszystkich metod i niejawnie używany do odwoływania się do pól klasy // returns Year int DateType::GetYear( ) const { return Year; int y=today.getyear(); today Day Month Year nextweek tomorrow Day Month Year // returns Year int DateType::GetYear(const DateType* const this) { return this->year; Day Month Year Tak wygląda definicja metody widziana przez kompilator this jest stałym wskaźnikiem, nie możemy go zmieniać wewnątrz metody, Ponieważ metoda jest typu const (jest obserwatorem), this jest również wskaźnikiem do stałej 17

Destruktor Wywoływany automatycznie w chwili, kiedy zmienna jest usuwana z pamięci (m.in. kończy się jej zakres) W każdej klasie jest najwyżej jeden destruktor. Nazwa destruktora to nazwa klasy poprzedzona znakiem tyldy (~). Destruktor, podobnie jak konstruktor, nie ma typu wartości zwracanej (nawet void) Destruktor zwalnia zasoby używane przez obiekt (zaalokowaną pamięć, deskryptory plików, semafory etc.) // stack.h class stack {... int* dane;... public:... ~stack();... ; Interfejs // stack.cpp stack::~stack() { free(dane); ; Implementacja { stack s;... //tu wywoływany s.~stack() Klient 18

Klasa Stack //stack.h #define STACKSIZE 20 class stack { public: void push(int a); int pop(); void clear(); stack(); ~stack(); private: int top; int dane[stacksize]; ; Interfejs //stack.cpp #include <assert.h> #include <stdlib.h> #include <stdio.h> #include "stack.h" stack::stack() { this->top=0; ; stack::~stack(){; void stack::clear() { this->top=0; ; void stack::push(int a) { assert(this->top<stacksize); this->dane[this->top++]=a; ; int stack::pop() { assert(this->top>0); return this->dane[--this->top]; ; Implementacja 19

Klasa Stack - wersja ulepszona Do implementacji Dynamiczna alokacja pamięci jak w drugiej wersji modułowej Niepusty destruktor //stack.h class stack { public: void push(int a); int pop(); void clear(); stack(); ~stack(); private: int top; int *dane; int size; ; Interfejs 20

Przeciążenie funkcji W C++ możliwe jest zadeklarowanie dwóch lub więcej funkcji o tej samej nazwie. Nazywa się to przeciążeniem. Kompilator określa, do której funkcji odnosi się każde wywołanie. Poszukiwanie najlepiej pasującej funkcji odbywa się na podstawie typów parametrów formalnych i aktualnych według kryteriów przedstawionych poniżej w podanej kolejności. Typ wartości zwracanej przez funkcję nie jest uwzględniany. Dokładne dopasowanie (brak konwersji lub konwersje trywialne, np. tablicy do wskaźnika) Dopasowanie z użyciem promocji (bool do int, char do int, float do double etc.) Dopasowanie z użyciem konwersji standardowych (int do double, double do int etc.) Dopasowanie z użyciem konwersji zdefiniowanych przez użytkownika Dopasowanie z użyciem wielokropka (...) 21

Przeciążenie operatorów Operatory C++ (np. ==, ++ etc.) mogą zostać przeciążone w celu umożliwienia operacji na typach zdefiniowanych przez użytkownika. A == B obiekt operator obiekt oznacza A.==(B) czyli: Klasa typu A musi mieć zdefiniowaną jednoargumentową składową o nazwie == 22

Przeciążenie operatorów Składowe przeciążające operatory są definiowane z użyciem słowa kluczowego operator // add to DateType.h: bool operator==(datetype otherdate) const ; Interfejs // add to DateType.cpp: bool datetype::operator==(datetype otherdate) const { return( (Day == otherdate.day ) && (Month == otherdate.month ) && (Year == otherdate.year )); DateType adate(10, 15, 2000); DateType bdate(10, 15, 2001); Klient Odpowiednio użyte przeciążenie operatorów pozwala na traktowanie obiektów typu zdefiniowanego przez użytkownika w sposób tak samo naturalny, jak typów wbudowanych. if (adate == bdate) {... Implementacja 23

Domyślne argumenty funkcji W C++ możliwe jest podanie domyślnych wartości parametrów formalnych funkcji, które zostaną użyte w przypadku, kiedy pominie się je przy wywołaniu // add to Datetype.h DateType::DateType(int amonth = 1, int aday = 1, int ayear = 1980); Domyślne wartości parametrów podaje się w prototypie funkcji, a nie w implementacji. // add to DateType.cpp DateType::DateType(int amonth, int aday, int ayear){ if ( (amonth >= 1 && amonth <= 12) && (aday >= 1) && (ayear >= 1) ) { Month = amonth; Day = aday; Year = ayear; else { Month = Day = 1; // default date Year = 1980; Ponieważ wartości domyślne są podane dla wszystkich parametrów, można pominąć konstruktor domyślny. Pozostawienie konstruktora domyślnego spowoduje błąd przy próbie kompilacji. 24

Domyślne argumenty funkcji Jeżeli argument posiadający wartość domyślną zostanie pominięty przy wywołaniu funkcji, kompilator automatycznie wpisze wartość domyślną: DateType ddate(2,29); // Feb 29, 1980 DateType edate(3); // March 1, 1980 DateType fdate(); // Jan 1, 1980 Jedynie ostatnie argumenty mogą zostać pominięte DateType ddate(,29); // error Wspólne użycie przeciążenia funkcji i parametrów domyślnych wymaga ostrożności Parametry domyślne mogą być użyte dla każdej funkcji, nie tylko dla konstruktorów i metod. 25

Używanie argumentów domyślnych Domyślne argumenty w prototypach funkcji Można pomijać jedynie ostatnie argumenty Reguły stosowania domyslnych argumentów Domyślne argumenty podaje się w pierwszej deklaracji/definicji funkcji (najczęściej jest to prototyp) Domyślne wartości powinny być stałymi Na liście parametrów w deklaracji funkcji argumenty domyślne muszą być ostatnimi argumentami Przy wywołaniu funkcji posiadającej więcej niż jeden domyślny argument, argumenty po pierwszym pominiętym muszą być również pominięte Domyślne argumenty i konstruktory Domyślne argumenty konstruktorów mogą zastąpić kilka osobnych konstruktorów Domyślne argumenty konstruktorów zapewniają pełną inicjalizację obiektów Konstruktory z wszystkimi parametrami domyślnymi zastępują konstruktor domyślny (bezparametrowy) 26

Funkcje otwarte (inline) 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 27

Przykłady funkcji otwartych // DateType.h class DateType { public: DateType(int newmonth = 1, int newday = 1, int newyear = 1980); int GetYear () const; int GetMonth ()const {return M onth; int GetDay () const {return Day; private: int Year, Month, Day; ; Interfejs // DateType.h inline int DateType::GetYear() const { // explicit inline return Year; Implementacja 28

Funkcje otwarte 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 // DateType.h class DateType { public: DateType(int newmonth = 1, int newday = 1, int newyear = 1980); int GetYear () const; int GetMonth ()const {return M onth; int GetDay () const {return Day; private: int Year, Month, Day; ; 29

Wady i zalety funkcji otwartych Pogwałcenie celów inżynierii oprogramowania 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 30