Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Programowanie obiektowe
dr hab. inż. Jerzy Kisilewicz, prof. Katedra Systemów i Sieci Komputerowych C-3, pok. 107 Konsultacje w C-3, pok. 107: Wt, godz. 09:00 – 11:00 Sr, godz. 11:00 – 13:00 PO1-1 / 30
2
Wymagania Co wpływa na ocenę Uwagi Zdanie egzaminu testowego,
Zaliczenie laboratorium, Obecność na wykładach ogłoszonych jako obowiązkowe. Co wpływa na ocenę Punkty z testu egzaminacyjnego, Punkty z laboratorium, Punkty za obecności i z kartkówek na wykładach. Uwagi Nieobecność na 30% wykładów ogłoszonych jako obowiązkowe powoduje brak zaliczenia przedmiotu. Ocenę określa lokata na liście uszeregowanej według sumy punktów. Progi odcinają kolejno 10%-5, 25%-4,5, 30%-4, 25%-3,5 i 10%-3 z osób, które zaliczyły przedmiot. PO1-2 / 30
3
Literatura Literatura pomocnicza
Grębosz J., Symfonia C++ standard. Programowanie w języku C++ orientowane obiektowo, Kraków, Oficyna Kallimach, 2005 Kisilewicz J., Język C++. Programowanie obiektowe, Wrocław, OWPWr, 2005 Wileczek R., Microsoft Visual C : tworzenie aplikacji dla Windows, Gliwice, Helion, 2009 Kisilewicz J., Zaharieva-Stoyanova E., Ćwiczenia laboratoryjne w Visual C++ 6, Wrocław, OWPWr, 2007 Literatura pomocnicza Stroustrup B., Język C++, Warszawa, WNT, 2004 Mueller J.P., Język programowania Visual C++ 6 od podstaw, Poznań, Nakom, 2001 Martin J., Odell J.J., Podstawy metod obiektowych, WNT, 1997. PO1-3 / 30
4
Tematyka wykładów Podstawy C++ i cechy programowania obiektowego.
Klasa Zesp i jej hermetyzacja. System klas strumieniowych. Klasa Vec – przykład klasy z alokacją pamięci. Podział operatorów i ich przeciążanie. Definiowanie klas pochodnych, dziedziczenie. Dziedziczenie sekwencyjne i wielobazowe. Funkcje polimorficzne i klasy abstrakcyjne. Programowanie zdarzeniowe pod Windows. Aplikacje dialogowe. Aplikacje SDI. Podstawy UML – diagramy klas. Wybrane zagadnienia: obsługa wyjątków. Wzorce klas i funkcji, dyrektywy preprocesora. PO1-4 / 30
5
e-Katedra SSK http://www.kssk.pwr.wroc.pl/ Dla studentów
Materiały dydaktyczne e-KSSK Zacznij teraz od utworzenia nowego konta Zalogować się w e-Katedra SSK (system Moodle). Zapisać się na kurs „Programowanie obiektowe”, oraz „Programowanie obiektowe – laboratorium” hasło: INF2W#JK Edytować swój profil – wpisać swój adres . PO1-5 / 30
6
ePortal zdalnej edukacji
Studenci->Studia->E-learning->ePortal Politechniki Wrocławskiej Dla nowych użytkowników ePortalu PWr Zalogować się w ePortalu PWr (system Moodle). Zapisać się na kurs „Programowanie obiektowe” (w kategorii Informatyka/Programowanie), oraz „Programowanie obiektowe – laboratorium” hasło: INF2W#JK Edytować swój profil – wpisać swój adres . PO1-5 / 30
7
Rozszerzenia C++ Wykład 1 Wstęp do języka C++
Obiekty strumieniowe cin, cout, cerr Od struktury w C do klasy w C++ Podejście obiektowe PO1-6 / 30
8
Od C do C++ Wstęp do języka C++ PO1-7 / 30
9
Słowa kluczowe C++ and dynamic_cast operator true and_eq explicit or
try asm export or_eq typeid bitand false private typename bitor friend protected using bool inline public virtual catch mutable reinterpret_cast wchar_t class namespace static_cast xor compl new template xor_eq const_cast not this delete not_eq throw PO1-8 / 30
10
Rozszerzenia C++ Instrukcje deklaracyjne Zmienne referencyjne
Operatory new i delete Obiektowe operacje wejścia i wyjścia Pojęcie klasy Operator zakresu Funkcje przeciążone Argumenty domniemane Funkcje otwarte Definicje i deklaracje zmiennych mogą pojawiać się między instrukcjami. Np.: for(int i = 0; i < n; i + +) Nie wolno wykonywać skoków przez instrukcje deklaracyjne, np. if( ) int k; else double k; // niejawny skok k = // jakiego typu jest zmienna k ?! PO1-9 / 30
11
Zmienne referencyjne referencyjne argumenty funkcji
int k, &n = k; // n jest tożsame z k // Zmienna referencyjna n jest drugą nazwą zmiennej k Typy referencyjne znajdują praktyczne zastosowanie jako: referencyjne argumenty funkcji aby uniknąć kopiowania wartości argumentu, aby przekazać do funkcji zmienną, referencyjne wyniki funkcji wynikiem funkcji jest zmienna. PO1-10 / 30
12
Operatory new i delete Operator new : new typ new typ (wartość)
new typ[rozmiar] Operator delete : delete ptr; delete [ ] ptr; double *p, *q, *A; int n; cin>>n; p = new double; q = new double(5.75); A = new double[n]; delete p; delete q; delete [ ]A; PO1-11 / 30
13
Operator new - uwagi Operator new w przypadku nieudanej alokacji zgłasza wyjątek typu bad_alloc, który niewyłapany, kończy aplikację. Aby new zamiast zgłaszać wyjątek, dawał w wyniku wskaźnik pusty, należy go wywoływać z parametrem nothrow: new(nothrow) typ new(nothrow) typ (wartość) new(nothrow) typ[rozmiar] double *p, *q, *A; int n; cin>>n; p = new(nothrow) double; q = new(nothrow) double(5.75); A = new(nothrow) double[n]; PO1-12 / 30
14
Operatory << oraz >>
int k = 11; k / // int / int – dzielenie całkowite, wynik = 2 k / // int / double – dzielenie rzeczywiste, wynik = 2,75 k << 4 // int << int – bitowe przesunięcie o 4 w lewo k >> 4 // int >> int – bitowe przesunięcie o 4 w prawo Jeżeli lewy argument jest obiektem strumieniowym, to operatory << oraz >> są operatorami wyprowadzania i wprowadzania. cout << k; // ostream << int – wyprowadzenie wartości typu int cout << '\n'; // ostream << char – wyprowadzenie znaku cout << "K="; // ostream << char* – wyprowadzenie tekstu cin >> k; // istream >> int – wprowadzenie wartości typu int Pod symbolami << oraz >> kryje się wiele różnych operatorów wprowadzania i wyprowadzania – zależnie od typu prawego argumentu. PO1-13 / 30
15
Klasy i struktury Klasy i struktury w C++:
zawierają funkcje, a nie tylko zmienne, mogą ukrywać swoje zmienne i funkcje w sekcjach (private, protected, public), Domyślną sekcją struktury jest public. Domyślną sekcją klasy jest private. class Zesp { double Re, Im; // dane ukryte przed użytkownikiem public: // początek sekcji publicznej Zesp(double Re=0, double Im=0): Re(Re), Im(Im) { } // funkcja konstruktora double Realis( ) { return Re; } // funkcja Realis }; // koniec definicji klasy Przykład klasy PO1-14 / 30
16
Operatory .* oraz ->*
Nazwa_obiektu . Nazwa_komponentu Wskaźnik_na_obiekt -> Nazwa_komponentu Nazwa_obiektu .* Wskaźnik na_komponent Wskaźnik_na_obiekt ->* Wskaźnik na_komponent Zesp Z, *p=&Z; // definicja obiektu i wskaźnika na obiekt double Zesp::*r; // definicja wskaźnika na komponent klasy r=&Zesp::Re; // r wskazuje na zmienną Re w klasie Zesp Z .* r = 0; // Z . Re = 0; r=&Zesp::Im; // r wskazuje na zmienną Im w klasie Zesp p ->* r = 0; // p -> Im = 0; czyli Z . Im = 0; PO1-15 / 30
17
Operatory zakresu Operator 2-argumentowy
Nazwa_klasy :: Nazwa_stałej_zmiennej_lub_funkcji Kwalifikuje stałą, zmienną lub funkcję do podanej klasy Operator 1-argumentowy :: Nazwa_stałej_zmiennej_lub_funkcji Kwalifikuje stałą, zmienną lub funkcję jako globalną, Np. int K = 20; main( ) { int n, K = 5; n=K+::K; // n = 5+20, bo K=5, ale ::K=20 ZESP(double Re=0, double Im=0) { ZESP::Re = Re; ZESP::Im = Im; } lokalne zmienne funkcji zmienne w obiekcie klasy ZESP Stałe zdefiniowane w klasie ios: ios::in ios::out ios::left ios::showpoint Operator 2-argumentowy Nazwa_klasy :: Nazwa_stałej_zmiennej_lub_funkcji Kwalifikuje stałą, zmienną lub funkcję do podanej klasy PO1-16 / 30
18
Funkcje i argumenty Funkcje przeciążone Funkcje otwarte - inline
to funkcje o tej samej nazwie lecz o różnych parametrach. Np.: double sin(double); Zesp sin(Zesp&); // inny typ argumentu int Max(int, int, int); int Max(int, int, int, int); // inna liczba argumentów Funkcje otwarte - inline Proste funkcje mogą być definiowane jako makrodefinicje. W miejscu wywołania wpisywany jest zmodyfikowany argumentami kod funkcji Np.: inline int Suma( int a=1, int b=20, int c=30 ) { return a+b+c; } Poniższe wywołania generują instrukcje jak w komentarzach: k = Suma( ); // K= ; k = Suma( 7 ); // K= ; k = Suma( 7, 0 ); // K=7+0+30; k = Suma( 0, 2, 6 ); // K=0+2+6; Argumenty domniemane Kolejnym parametrom funkcji, poczynając od ostatniego, można nadawać wartości domyślne. Np.: int Suma( int a=1, int b=20, int c=30 ) { return a+b+c; } Powyższą funkcję można wywołać na 4 sposoby: z trzema, dwoma, jednym argumentem lub bez argumentów, np.: k = Suma( ); // K=51 k = Suma( 7 ); // K=57 k = Suma( 7, 0 ); // K=37 k = Suma( 0, 2, 6 ); // K=8 Funkcje i argumenty Instrukcje deklaracyjne Zmienne referencyjne Operatory new i delete Obiektowe operacje wejścia i wyjścia Pojęcie klasy Operator zakresu Funkcje przeciążone Argumenty domniemane Funkcje otwarte PO1-17/ 30
19
Obiekty strumieniowe Obiekty cin, cout, cerr PO1-18 / 30
20
Otoczenie programu w C++
klawiatura ekran Program fprintf(stderr,... stderr stdin cerr System opera- cyjny cin System opera- cyjny scanf(... stdout cout printf(... PO1-19 / 30
21
Przykład użycia cout i cin
Pierwiastki równania ax+b=0. #include "stdafx.h" #include "iostream.h" // Włącz opisy operatorów <<, >> void main(void) { double a, b, x; cerr << "A= "; // Zaproszenie „Podaj A” do cerr cin >> a; cerr << "B= "; // Zaproszenie „Podaj B” do cerr cin >> b; if(a==0) if(b==0) cout << "Tozsamosc, X dowolne"; // Wynik else cout << "Sprzecznosc – brak X"; // Wynik else { x= –b/a; cout << "X= " << x; // Wynik } cout << endl; // Drukuj nową linię po wyniku PO1-20 / 30
22
Obiektowe wejście i wyjście
int cout << (i+1) operator wypro-wadzania liczby całkowitej double cout << A[i] operator wypro-wadzania liczby rzeczywistej char* operator wypro-wadzania tekstu char* cout << "] = " operator wypro-wadzania tekstu char cout << '\n' operator wypro-wadzania znaku cout << "A[" << (i+1) << "] = " << A[i] << '\n'; A[1] = 5.75 PO1-21 / 30
23
Klasa i struktura PO1-22 / 30
24
Klasa i struktura w C++ Strukturę można definiować używając słowa kuczowego struct albo słowa class. Komponentami struktury (klasy) mogą być nie tylko zmienne ale też funkcje. Komponenty struktury (klasy) można ukrywać przed użytkownikiem w sekcjach: prywatnej (private:), zabezpieczonej (protected:) i publicznej (public:). class Zesp{ private: double Re, Im; public: double Realis( ) { return Re; } double modul( ) { return sqrt( Re*Re + Im*Im ); } }; Zesp z; double y; y = z . Re; y = z . Realis( ); PO1-23 / 30
25
Zmienne strukturowe Zmienne typu struktury (klasy) nazywane są obiektami. Każdy tworzony obiekt jest automatycznie inicjowany przez wywołanie do niego funkcji konstruktora. Jawne wywołanie konstruktora tworzy i inicjuje obiekt. Do usuwanego obiektu jest automatycznie wywoływana funkcja destruktora. Jawne wywołanie destruktora do obiektu nie usuwa tego obiektu. Zesp A( 2, 5 ), B; // wymaga zdefiniowania w klasie // konstruktora Zesp(double, double ); // oraz konstruktora Zesp( ); Zesp T[ ] = { Zesp( 2, 0 ), Zesp( 5.2, 0.5 ), Zesp( 2, 0.5 ), Zesp( 5.2, 0.5 ), Zesp( 1, 0 ) }; // zainicjowanie tablicy 5 obiektów PO1-24 / 30
26
Podejście obiektowe definiowanie klas, hermetyzacja danych i metod,
Najważniejsze mechanizmy programowania obiektowego to: definiowanie klas, hermetyzacja danych i metod, dziedziczenie, przeciążanie funkcji i operatorów, polimorfizm. PO1-25 / 30
27
Hermetyzacja danych i metod
Hermetyzacja danych i metod polega na ukryciu wewnętrznej struktury obiektów i wewnętrznych metod przetwarzania w sekcji prywatnej (private:) oraz w sekcji zabezpieczonej (protected:). PO1-26 / 30
28
Przykład hermetyzacji
class Zesp { private: double Re, Im; // ukryte wnętrze obiektu public: // . . . double Realis( ) const { return Re; } }; class Zesp { private: double r, fi; // ukryte wnętrze obiektu public: // . . . double Realis( ) const { return r*cos( fi ); } }; PO1-27 / 30
29
Dziedziczenie Dziedziczenie umożliwia tworzenie nowych klas na bazie klas już opracowanych bez wnikania do wnętrza klas bazowych, przejmując pożądane cechy tych klas. Klasa pochodna przejmuje z klasy bazowej zarówno dane jak i algorytmy przetwarzania tych danych. class Mac:public Vec // przejęcie zmiennych i funkcji klasy Vec { // definicje dodatkowych zmiennych i funkcji klasy Mac }; PO1-28 / 30
30
Przeciążanie funkcji i operatorów
Przeciążanie umożliwia stosowanie tradycyjnych jednakowych nazw wielu funkcji i jednakowych nazw wielu operatorów opracowanych do przetwarzania różnych obiektów. //przeciążenie funkcji sqrt Zesp sqrt(Zesp &b) { double r=sqrt(sqrt(b.Re*b.Re+b.Im*b.Im)); double fi=r ? 0.5*atan2(b.Im, b.Re) : 0; return Zesp(r*cos( fi ), r*sin( fi ) ); } //przeciążenie operatora dodawania Zesp Zesp::operator+(const Zesp &b) const { return Zesp(Re+b.Re, Im+b.Im); } PO1-29 / 30
31
Polimorfizm Polimorfizm pozwala na automatyczny wybór funkcji zależnie od aktualnych, nie zaś od formalnych, właściwości obiektów, na rzecz których te funkcje są aktywowane. ostream &operator <<(ostream &wy, const Vec &b) {//funkcję drukuj zadeklarowano w Vec jako polimorficzną b.drukuj( ); //wykonanie drukuj z klasy Vec albo Mac //zależnie od typu obiektu tożsamego z b return wy; } PO1-30 / 30
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.