Programowanie obiektowe III rok EiT

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

Język C/C++ Funkcje.
Wstęp do programowania
Programowanie obiektowe
C++ Paweł Rzechonek Instytut Informatyki Uniwersytetu Wrocławskiego
Programowanie obiektowe PO PO - LAB 2 Wojciech Pieprzyca.
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 4 Wojciech Pieprzyca.
Programowanie obiektowe
Programowanie obiektowe
1 Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile.
Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca.
Wskaźniki repetytorium Wskaźniki int Y = 1, X = 2; X = 5; int *p = &X; Y X p 4 4 p = &Y; *p = 4; 5.
Klasy i obiekty.
Wzorce.
Wprowadzenie.
Static, const, volatile.
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Programowanie obiektowe w Javie
Szablony (wzorce) Przykład 1: Szablon klasy -
OOPC++ - dziedziczenie1 Uwagi VS2003 Wykłady (nie na rainbow!)
Licznik template<class Count_Type> class Count { public:
C++ wykład 6 ( ) Polimorfizm.
C++ wykład 2 ( ) Klasy i obiekty.
Czytanie, pisanie i rysowanie – cd.. Jeszcze jeden strumyk PrintStream działa jak PrintWriter, ale: Używa domyślnego (systemowego) kodowania Nie wyrzuca.
Tablice tablica jest sekwencją elementów tego samego typu (prostego lub obiektowego) w Javie tablice są obiektami, a zmienne tablicowe przechowują referencję
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT
Informatyka I Wykład 10 WSKAŹNIKI I ADRESY Jerzy F. Kotowski.
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Procedury i funkcje.
Podstawy Programowania
Programowanie obiektowe III rok EiT
Programowanie obiektowe w C++
Tworzenie aplikacji mobilnych
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład XIII.
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład IX.
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT
Java – coś na temat Klas Piotr Rosik
Programowanie obiektowe
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 7 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Programowanie obiektowe 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Kurs języka C++ – wykład 3 ( )
Kurs języka C++ – wykład 8 ( )
Kurs języka C++ – wykład 5 ( )
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++ Przeładowanie operatorów Robert Nowak.
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
K URS JĘZYKA C++ – WYKŁAD 2 ( ) Klasy i obiekty.
K URS JĘZYKA C++ – WYKŁAD 6 ( ) Polimorfizm.
Programowanie obiektowe Wykład 9 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/15 Dariusz Wardowski.
Programowanie obiektowe
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
Wykład 4 Klasa Vec, której konstruktory alokują pamięć dla obiektów 1.Przykład definicji klasy Vec 2.Definicje konstruktorów i destruktora 3.Definicja.
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Kurs języka C++ – wykład 3 ( )
Programowanie Obiektowe – Wykład 2
Założenia projektowe Javy
BYDGOSKI FESTIWAL NAUKI
Zapis prezentacji:

Programowanie obiektowe III rok EiT 2017-03-28 05:37:25 Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VII

Program wykładu Klasówka Źródła podejścia obiektowego Podstawy metody PRINCE -PRojects In Controlled Environment Podstawy metody LFA -Logical Framework Approach, składanie wniosków o grant Język C++ - gadżety języka, polimorfizm, klasy, dziedziczenie Gadżety języka C++ Przykład problemu Podstawy języka JAVA Klasówka

Literatura C++ for C programmers, Ira Pohl, The Benjamin/Cummings Publishing Company, Inc. Symfonia C++, Jerzy Grębosz, Oficyna Kallimach, Kraków 1999

Poprawiona klasa String class String // Część 1/2 { char *s; // nowy element int len; public: String(int n) { s=new char[n+1]; len=n; } String(char *p) { len=strlen(p); s=new char[len+1]; strcpy(s,p); } String() { len=255; s=new char[255];} //polimorfizm konstruktora ~String() { delete s;} // destruktor void assign(char *st) { strcpy(s,st); len=(int)strlen(st); } int lenght() { return(len); } void print() { cout << s << "\nLenght: " << len << "\n\n";} friend String operator +(String& a, String& b); }; Klasa String została wyposażona w 3 konstruktory i destruktor Konstruktory wykorzystują operator new Destruktor wykorzystuje operator delete Zniknęła linia z deklaracją const int max_len W klasie nie ma pola roboczego char s[max_len], jest tylko wskaźnik char *s Interface klasy pozostał niezmieniony

Komentarz do programu new jest nowym operatorem języka C++. Jest to operator jednoargumentowy. Jego argumentem jest nazwa typu. Może być ona użyta w kontekście z definicją tablicy: s=new char[n+1] Operator new zwraca adres do pamięci. Obszar pamięci zajęty przy pomocy operatora new nie jest automatycznie zwalniany po wyjściu z bloku. Do zwolnienia tego obszaru pamięci jest potrzebny destruktor i operator delete. Destruktor ma taką samą nazwę jak definiowana klasa. Jest poprzedzony znakiem ~ (tilde): ~String() { delete s;} Z reguły mamy do czynienia z polimorfizmem konstruktora. W przykładzie mamy do czynienia z trzema konstruktorami. Konstruktory mogą być przeciążane a destruktor nie. Konstruktory i destruktor nie zwracają nawet nic (void).

Śmiertelne niebezpieczeństwo. \. \Visual Studio Projects\test0\test0 Śmiertelne niebezpieczeństwo ..\..\Visual Studio Projects\test0\test0.sln void main(void) // Część 2/2 { String one, two("Gosia"); one=two; one.print(); two.print(); cout<<"Podstawiamy do two"<<endl; two.assign("Ela"); cout<<"Gdzie jest Gosia?"<<endl; getch(); } Zbiór dyskowy: String II.cpp Poprawiona klasa String może doprowadzić do wybuchu III wojny światowej W klasie brakuje przeciążenia operatora przypisania i jawnego konstruktora kopiującego Bez konstruktora kopiującego nie będzie działać prawidłowo przeciążony operator dodawania A przykład jest z całkiem dobrej książki…

Prototypy funkcji W odróżnieniu od klasycznego C prototypy funkcji w C++ informują jednoznacznie kompilator o typie i liczbie argumentów. Lista argumentów może opcjonalnie zawierać nazwy zmiennych int Ala() W C nic nie wiemy o argumentach funkcji Ala W c++ funkcja Ala nie ma argumentów: int Ala() Ala() Ala(void) int Ala(void) W C++ wartość argumentu jest zawsze przekształcana do typu jakiego spodziewa się wywoływana funkcja.

Unikanie preprocesora W C dyrektywa define ma 3 znaczenia #define Kwadrat #ifdef Kwadrat #define Kwadrat 10 y=Kwadrat; #define Kwadrat(x) ((x)*(x)) y=Kwadrat(2+v); inline i const są używane w celu unikania define. preprocesor nie zna !! składni języka C. słowo kluczowe inline jest życzeniem kierowanym do kompilatora aby funkcję skompilował jako macro . Kompilator może to życzenie zignorować. Modyfikator const jest specyfikatorem typu (jak extern itp.) Bez typu przez domniemanie oznacza int . Zmienna zadeklarowana jako const nie może zmieniać swojej wartości. Zmienna ze specyfikatorem const może być używana jako literał, to znaczy na przykład jako rozmiar tablicy. Obiekt const nie może być używany jako lewy argument operatora podstawiania - nie jest to lvalue . lvalue jest wyrażeniem, z którym wiąże się adres w pamięci pod którym można coś przechować. zmienna const może być inicjalizowana.

Przykład ..\..\Visual Studio Projects\test0\test0.sln // circle.cpp const float ppi=3.14159; const int True=1; inline float circum(float rad) {return (ppi*2*rad);} inline float area(float rad) {return (ppi*rad*rad);} void main(void) { float r; while(True) cout<<"\Enter radius: "; cin>>r; if(!r) break; cout<<"Area is "<<area(r); cout<<"\nCircumference is "<<circum(r)<<"\n\n"; }; }

const - przykłady const int M_size=20; na przykład do deklaracji tablicy const* p=&M_size; wskaźnik do stałej, przez domniemanie typu int char* const s="abcde"; wskaźnik typu const do zmiennej typu char const* int const cp=&M_size; stały wskaźnik do stałej Ogólne zasady: const type* identifier - wskaźnik do stałej type* const identifier - wskaźnik typu const Czyli stałe jest to czego bliżej jest słowo const

Typ wyliczeniowy enum enum types zostały dodane do C w 1980 roku Definicja typu wyliczeniowego: enum nazwa_typu {lista wyliczeniowa}; Przykład 1: enum week_day {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; week_day birth=Sun; Wartości: 0,1,2,3,4,5,6 Przykład 2: enum week_day {Sun=-1, Mon, Tue=5, Wed, Thu, Fri, Sat}; Wartości: -1,0,5,6,7,8,9 Przykład 3: enum boolean {False, True}; boolean pytanie=True; Typ wyliczeniowy stosujemy wtedy, gdy interesuje nas bardziej logiczna interpretacja zmiennej niż jej wartość liczbowa. Stosowanie typów wyliczeniowych pomaga wykryć kompilatorowi błąd w kodzie źródłowym naszego programu. Ma to miejsce na przykład wtedy gdy jakaś funkcja spodziewa się jako jednego ze swoich argumentów określonego typu wyliczeniowego a my podajemy coś innego. Jest to błąd kompilacji.

enum – przykład ..\..\Visual Studio Projects\test0\test0.sln Zbiór dyskowy: Talia kart.cpp Tasujemy talię kart do brydża card deck[52]; - tablica kart do brydża void shuffle(card d[]) - argumentem jest wskaźnik do obiektu typu card czyli do pierwszego elementu tablicy deck filozofia procedury: na i-tym miejscu ustawiamy k-tą kartę, gdzie k jest losowane. void pr_card(card& cd) - przekazanie argumentu przez referencję.

Klasa register i modyfikator volatile Użycie: register int a; volatile float b; Są to modyfikatory (J. Grębosz) Ogólnie: C++ zna następujące klasy auto register static extern register jest to prośba do kompilatora aby w miarę możliwości trzymał taki obiekt blisko, a najlepiej w jakimś rejestrze procesora. Nie można po utworzeniu takiego obiektu szukać jego adresu. Modyfikator volatile (ulotny) oznacza, że obiekt tak określony może zmieniać się poza kontrolą kompilatora. Przykład: volatile float temperatura;

Operator zakresu ..\..\Visual Studio Projects\test0\test0.sln W C++ te same nazwy mogą oznaczać różne obiekty. Wykorzystanie nazwy w wewnętrznym bloku przesłania jej zewnętrzne wykorzystanie. C++ posiada scope resolution operator ::, którego zadaniem jest odsłanianie przysłoniętych identyfikatorów globalnych. Priorytet 17 Ten operator łamie modularność programu i nie należy korzystać z niego zbyt często bo nie po to wymyślono C++. Zbiór: op_zakresu.cpp int i=1; void main(void) { int i=2; //redeklaracja cout<<"Enter inner block\n"; int n=i; int i=3; // kolejna redeklaracja cout<<i<<" i <> :: i "<<::i<<"\n"; cout<<"n = "<<n<<"\n"; } cout<<"Enter outer block\n"; getch();

Referencje Referencja == nazwa zastępcza == alias == ksywa C++ pozwala na deklaracje typu reference to. Mają one postać: type& identifier=object. Taka deklaracja deklaruje identyfikator , który jest alternatywną nazwą do obiektu wyspecyfikowanego w deklaracji. Przykłady: int n; int& nn = n; nn jest alternatywną nazwą do n double a[10]; double& last = a[9]; char& new_line = '\n'; Deklaracja reference to nie może być odwołana. Głównym zastosowaniem reference to jest bezpośrednie przekazywanie argumentów funkcjom. Nazywa się to call-by reference.

Referencje c.d. ..\..\Visual Studio Projects\test0\test0.sln // referencje.cpp int greater(int& a,int& b) { if(a>b) int temp=a; a=b; b=temp; return(1); } else return(0); void main(void) int i,j; cout <<"Pierwsza liczba calkowita: "; cin >> i; cout <<"Druga liczba calkowita: "; cin >> j; cout << "\nWprowadzone liczby: " << i << " " << j; if(greater(i,j)) // w klasycznym C trzeba tu podać adresy!! cout<<"\nLiczby zostaly zamienione miejscami."; cout << "\nWprowadzone liczby po zamianie: " << i << " " << j; else cout<<"\nLiczby nie zostaly zamienione miejscami."; getch();

Argumenty domniemane Default arguments Argumenty domniemane określa się w deklaracji funkcji czyli tam, gdzie kompilator dowiaduje się o interfejsie funkcji ze środowiskiem Argumenty domniemane można opuszczać od końca W przykładzie definicja funkcji jest równocześnie deklaracją int mult(int n,int k=2,int a=1) { if(k==2) return(a*n*n); else return(mult(n,k-1,a)*n); } Funkcja mult zwraca a*nk Przykłady użycia: mult(5); // 52 mult(5,4); // 54 mult(5,3,2); // 2*53 Zastosowanie przy tworzeniu konstruktorów

Nienazwany argument Na liście argumentów w definicji funkcji pojawia się argument bez nazwy. Przykład: void sound(int) {…} Oznacza to, że wewnątrz definicji ten argument się nie pojawia, ale funkcja jest wywoływana z tym argumentem: sound(10) Zjawisko musi wystąpić w definicji funkcji a nie w deklaracji, bo w deklaracji nazwy argumentów i tak są nieistotne. Wykorzystanie: Modyfikacja istniejących programów Niezależne przeciążanie znaczeń post i prefiksowych operatorów inkrementacji i dekrementacji.