Zaawansowane programowanie w C++ (PCP)
Transkrypt
Zaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 1 - sprawy organizacyjne i wprowadzenie. dr inż. Robert Nowak - p. 1/27 Cel i zakres przedmiotu » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Umiejetność ˛ programowania to umiejetność ˛ rozwiazania ˛ problemów przy pomocy komputera. Czy ten problem może być rozwiazany ˛ przy pomocy komputera? Czy ten problem powinien być rozwiazany ˛ przy pomocy komputera? Komputer = „głupi automat”. Klasy i obiekty zapoznanie słuchaczy z zagadnieniami tworzenia oprogramowania w C++ współcześnie stosowane techniki i biblioteki Zakładana jest znajomość programowania strukturalnego i obiektowego oraz praktyczna znajomość jezyka ˛ C++. - p. 2/27 Podstawowe dane o przedmiocie » Cel i zakres przedmiotu Sprawy organizacyjne » Podstawowe dane o przedmiocie » Zajecia ˛ » Literatura Miejsce spotkań: Piatki ˛ 815 − 1000 , sala N7 (wykład) Piatki ˛ 815 − 1000 , sala N102 (laboratorium) » Zaliczenie przedmiotu » Wymaganie oprogramowanie Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Prowadzacy: ˛ dr inż. Robert Nowak, Zakład Sztucznej Inteligencji, Wydział Elektroniki i Technik Informacyjnych, Politechnika Warszawska. Klasy i obiekty e-mail: [email protected] strona przedmiotu: http://staff.elka.pw.edu.pl/˜rnowak2/pcp2007L - p. 3/27 Zajecia ˛ » Cel i zakres przedmiotu Sprawy organizacyjne » Podstawowe dane o przedmiocie » Zajecia ˛ » Literatura » Zaliczenie przedmiotu » Wymaganie oprogramowanie Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Klasy i obiekty 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Klasy autonomiczne, cykl życia obiektów. Agregacja i dziedziczenie, polimorfizm, klasy abstrakcyjne. Laboratorium 1: funkcje wirtualne, hierarchia klas. Wzorce projektowe. Obsługa błedów, ˛ mechanizm wyjatków, ˛ sprytne wskaźniki. Laboratorium 2: wyjatki. ˛ Rozdanie zadań projektowych. Rola projektowania i testowania, repozytorium. Szablony, wstep ˛ do biblioteki standardowej, strumienie. Biblioteka standardowa: kontenery, algorytmy. Laboratorium 4: Kolokwium. Laboratorium 5: realizacja projektu Laboratorium 6: realizacja projektu Aplikacje wielowatkowe, ˛ synchronizacja, boost::thread. Laboratorium 7: aplikacje wielowatkowe. ˛ - p. 4/27 Literatura » Cel i zakres przedmiotu Sprawy organizacyjne » Podstawowe dane o przedmiocie » Zajecia ˛ » Literatura » Zaliczenie przedmiotu » Wymaganie oprogramowanie Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Klasy i obiekty Bjarne Stroustrup, Jezyk ˛ C++, WNT 2002. Bruce Eckel, Thinking in C++, Helion 2002. E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Wzorce projektowe, WNT, 2005. A. Alexandrescu, Nowoczesne projektowanie w C++, WNT, 2005. A. Alexandrescu and H. Sutter, Jȩzyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk, Helion, 2005. B. Karlsson, Wiȩcej niż C++. Wprowadzenie do bibliotek Boost, Helion, 2006. S. Meyers, 50 efektywnych sposobów na udoskonalenie Twoich programów, Helion, 2003. - p. 5/27 Zaliczenie przedmiotu » Cel i zakres przedmiotu Sprawy organizacyjne » Podstawowe dane o przedmiocie » Zajecia ˛ » Literatura kolokwium Podział punktów: ćwiczeń laboratoryjnych projektów 0 – 30pkt 0 – 40pkt 0 – 30pkt » Zaliczenie przedmiotu » Wymaganie oprogramowanie Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Klasy i obiekty Warunkiem zaliczenia jest uzyskanie przynajmniej 51 pkt. 91 – 100 punktów 81 – 90 pkt. 71 – 80 pkt. Ocena: 61 – 70 pkt. 51 – 60 pkt. 0 – 50 pkt. ocena 5 ocena 4 21 ocena 4 ocena 3 21 ocena 3 ocena 2 - p. 6/27 Wymaganie oprogramowanie » Cel i zakres przedmiotu Sprawy organizacyjne » Podstawowe dane o przedmiocie » Zajecia ˛ » Literatura » Zaliczenie przedmiotu » Wymaganie oprogramowanie Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Klasy i obiekty kompilatory: the GNU Compiler Collection Microsoft Visual Studio 2005 biblioteki: stl boost - http://www.boost.org inne: repozytorium - http://subversion.tigris.org edytor tekstu debugger - p. 7/27 Sposób, aby zostać dobrym programista˛ Czytać kod innych. Kilka podstawowych zasad Myśleć! dobrego stylu programowania » Sposób, aby zostać dobrym programista˛ » zasady dobrego stylu programowania Programować. » Cel i zakres przedmiotu Sprawy organizacyjne C++ jako jezyk ˛ strukturalny Klasy i obiekty - p. 8/27 zasady dobrego stylu programowania » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania » Sposób, aby zostać dobrym programista˛ » zasady dobrego stylu programowania C++ jako jezyk ˛ strukturalny Wykrywanie błedów ˛ w programach: Wykorzystywać kompilator. Zawsze doprowadzić do czystej kompilacji (bez żadnych ostrzeżeń) na najwyższym poziomie. Rozumieć każde ostrzeżenie. Klasy i obiekty Stosować standardy kodowania: pliki źródłowe, nazewnictwo, formatowanie kodu źródłowego, stosować konsekwentnie ten sam styl kodowania. - p. 9/27 Typy wbudowane » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny » Typy wbudowane logiczny: bool, true, false całkowite: int, long, ... rzeczywiste: double, ... znakowe: char, wchar_t » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty typ wyliczeniowy enum Kolory { RED = 1, GREEN = 2, BLUE = 4}; void - oznacza brak informacji typy wskaźnikowe typy tablicowe typy referencyjne typedef - p. 10/27 Czas życia obiektów » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty l-wartość: odnosi sie˛ do „czegoś” co istnieje w pamieci. ˛ Automatyczne: tworzone w chwili napotkania definicji sa˛ niszczone w momencie wyjścia z zasiegu ˛ (np. z bloku) definicja powinna być wtedy gdy można zainicjować Statyczne (globalne i zadeklarowane jako static) tworzone tylko raz sa˛ niszczone po zakończeniu programu dynamiczne (tworzone na stercie) operatory new i delete (uwaga! oddzielna wersja dla tablic), programista steruje czasem życia obiektów (tworzy je i usuwa), Nie używamy funkcji z <stdlib.h>, czyli malloc, free itp. - p. 11/27 Wykorzystywanie stałych » Cel i zakres przedmiotu Stałe definiuje sie˛ za pomoca˛ słowa kluczowego const. Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania const int NUM = 34; const int WZROST[] = { 174, 185, 193, 168 }; C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) unika sie˛ „magicznych” liczb w kodzie, pokazuje sie, ˛ że funkcja nie zmienia argumentów, pozwala sie˛ kompilatorowi na optymalizacje. » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki Systematycznie korzystać ze stałych symbolicznych! standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty int i = 2, j = 3; const int* p = &i; p = &j; *p = 4; int* const q = &i; q = &j; *q = 4; - p. 12/27 Konwersja typów » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania Nie używa sie˛ rzutowania w stylu ’C’! nie używa sie˛ void* unikać konwersji typów C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty Operatory rzutowania: static_cast - umożliwia konwersje ˛ pomiedzy ˛ „spokrewnionymi” typami const_cast - znosi kwalifikator const reinterpret_cast - dowolna konwersja (tak jak w C) dynamic_cast - rzutowanie w góre ˛ hierarchii klas double d = 3.2; int i = static_cast<int>(d); - p. 13/27 Instrukcje sterujace ˛ » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne Instrukcje warunkowe: if ... else ... switch Iteracja: for while do ... while Wołanie funkcji, rekurencja. » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty - p. 14/27 Przeciażanie ˛ nazw funkcji Funkcje moga˛ mieć te same nazwy. » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty bada sie˛ zgodność typów parametrów formalnych i aktualnych, znajdowania właściwej wersji funkcji: 1. ścisła zgodność; 2. promowanie w zakresie typów całkowitych(np. bool→int ); 3. standardowe konwersje (np. int → double); 4. konwersje zdefiniowane przez użytkownika, 5. wielokropek w deklaracji funkcji (wiele argumentów). Jeżeli znajdzie sie˛ dwie pasujace ˛ deklaracje: zgłaszany jest bład ˛ kompilacji. - p. 15/27 Przeciażanie ˛ nazw (przykład) » Cel i zakres przedmiotu Przykład: Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania void print(double); void print(long); C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ print(1L);////print(long) print(1.0);////print(double) print(1);////bład ˛ - niezgodność » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty nie można przeciażać ˛ ze wzgledu ˛ na zwracana˛ wartość; jest to ułatwienie notacyjne (to programista decyduje, że funkcje o tych samych nazwach wykonuja˛ podobne operacje); stosowane np. dla różnych konstruktorów. reczne ˛ usuwanie niejednoznaczności: jawna konwersja typu, np. static_cast. - p. 16/27 Argumenty domyślne » Cel i zakres przedmiotu Wartość wstawiana, gdy nie dostarczono argumentu. Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty class Point { public: Point(int x = 0, int y = 0); private: int x_; int y_; }; Point::Point(int x, int y) //Nie powtarzać arg. domyślnych : x_(x), y_(y) { } Point p, r(1), s(1,2); Przeciażanie ˛ - gdy różny kod. Argumenty domyślne - gdy wiele argumentów, a niektóre maja˛ typowe wartości. Domyślne moga˛ być tylko końcowe argumenty. - p. 17/27 Preprocesor » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki Preprocesora należy używać do: dołaczania ˛ plików nagłówkowych; #include <nazwa> #include ¨nazwa¨ zabezpieczania plików nagłówkowych przed wielokrotnym dołaczaniem; ˛ kompilacji warunkowej. I do niczego wiecej! ˛ standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty - p. 18/27 Wykorzystanie biblioteki standardowej C » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Wszystkie nagłówki z C zostały obudowane, aby można było je wykorzystywać w C++. Zmieniono ich nazwy. <cassert> - asercje (niezmienniki); <cctype> - klasyfikacja znaków (isalpha, isspace, ... ); <cfloat> - ograniczenia reprezentacji zmiennopozycyjnej (np. DBL_MAX); <climits> - stałe ograniczajace ˛ zakresy typów wbudowanych (np. INT_MAX); <cmath> - funkcje matematyczne. Klasy i obiekty - p. 19/27 Projektowanie modułów, rola testowania » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny » Typy wbudowane » Czas życia obiektów » Wykorzystywanie stałych » Konwersja typów » Instrukcje sterujace ˛ » Przeciażanie ˛ nazw funkcji » Przeciażanie ˛ nazw (przykład) Moduł zawiera interfejs (nagłówek) oraz implementacje. ˛ Używaj przestrzni nazw (jedna przestrzeń nazw na bibliotek˛e - zbiór powiazanych ˛ modułów). Każdy moduł powinien mieć swój test. Test powinien wykonywać sie˛ automatycznie (nie powinien komunikować sie˛ z człowiekiem). Wykorzystywać asercje do testowania. » Argumenty domyślne » Preprocesor » Wykorzystanie biblioteki standardowej C » Projektowanie modułów, rola testowania Klasy i obiekty - p. 20/27 Programowanie obiektowe » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Wszystkie byty w programie sa˛ obiektami. Program to zbiór obiektów, które sie˛ ze soba˛ komunikuja. ˛ każdy obiekt posiada typ i tożsamość. Klasy i obiekty » Programowanie obiektowe » Funkcje składowe (metody) » Konstruktor » Destruktor » Konstrukcja i destrukcja » Tworzenie kopii obiektu Możliwość definiowania typów przez użytkownika: struct class » Konstruktor kopiujacy ˛ struct X {private: ... to to samo co class X {..., ale konwencje ... - p. 21/27 Funkcje składowe (metody) » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Klasy i obiekty » Programowanie obiektowe dostep ˛ do składowych niejawny argument - wskaźnik this odwołania do this można pominać ˛ (skrócenie zapisu) metody stałe metody inline » Funkcje składowe (metody) » Konstruktor » Destruktor » Konstrukcja i destrukcja » Tworzenie kopii obiektu » Konstruktor kopiujacy ˛ Sekcje (kontrola dostepu) ˛ - dziela˛ klase˛ na interfejs i implementacje. ˛ class Prostokat { public: Prostokat(const Punkt& a, const Punkt& b); private: Punkt leftup; Punkt rightdown; }; - p. 22/27 Konstruktor Specjalna metoda, która jest wołana, gdy jest tworzony obiekt danej klasy. » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Klasy i obiekty » Programowanie obiektowe » Funkcje składowe (metody) » Konstruktor » Destruktor zawsze wołany - programista nie zapomni zainicjować składowych, możliwość inicjacji prywatnych składowych, elegancki zapis inicjacji obiektów. » Konstrukcja i destrukcja » Tworzenie kopii obiektu » Konstruktor kopiujacy ˛ struct Punkt { int x; int y; //konstruktor domyślny Punkt() { x = 0; y = 0; } //konstruktor Punkt(int wx, int wy) { x = wx; y = wy; } }; Punkt p; //Tworzy punkt, wywołuje konstruktor domyślny Punkt r(1,2); //Tworzy punkt o współrz˛ ednych x == 1, y == 2 - p. 23/27 Punkt* pr = new Punkt(1,2); //To samo, ale obiekt na stercie delete pr; Destruktor » Cel i zakres przedmiotu Sprawy organizacyjne Jeżeli obiekt klasy ma przydzielane zasoby, to powinno sie˛ je zwalniać. Kilka podstawowych zasad dobrego stylu programowania Destruktor - metoda wołana gdy niszczony jest obiekt. C++ jako jezyk ˛ strukturalny Klasy i obiekty » Programowanie obiektowe » Funkcje składowe (metody) » Konstruktor » Destruktor » Konstrukcja i destrukcja » Tworzenie kopii obiektu » Konstruktor kopiujacy ˛ class PunktN { public: PunktN(int n) { wsp = new int[n]; for(int i=0;i<n;++i) wsp[i] = 0; } ˜PunktN() { delete wsp; } private: int* wsp; }; - p. 24/27 Konstrukcja i destrukcja » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Klasy i obiekty » Programowanie obiektowe » Funkcje składowe (metody) » Konstruktor » Destruktor » Konstrukcja i destrukcja » Tworzenie kopii obiektu » Konstruktor kopiujacy ˛ obiekt automatyczny (nazwany) obiekt na stercie składowa (niestatyczna) lokalny obiekt statyczny obiekt globalny, składowa statyczna obiekt tymczasowy tworzenie deklaracja (za każdym razem) operator new tworzenie obiektu nadrz˛ednego deklaracja (za pierwszym razem!) poczatek ˛ programu usuwanie opuszcza sie˛ blok podczas wartościowania wyrażenia po dojściu do końca wyrażenia operator delete niszczenie obiektu nadrz˛ednego koniec programu koniec programu - p. 25/27 Tworzenie kopii obiektu » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Klasy i obiekty » Programowanie obiektowe » Funkcje składowe (metody) » Konstruktor » Destruktor » Konstrukcja i destrukcja » Tworzenie kopii obiektu » Konstruktor kopiujacy ˛ Tworzenie kopii: jawne Foo a; Foo b(a); jawne Foo c = a; przekazywanie wyniku przez wartość; Foo get(); Foo d = get(); przekazywanie argumentu przez wartość; void put(Foo x); put(a); class Foo { public: //Deklaracja konstruktora kopiujacego ˛ Foo(const Foo&); ... }; - p. 26/27 Konstruktor kopiujacy ˛ » Cel i zakres przedmiotu Sprawy organizacyjne Kilka podstawowych zasad dobrego stylu programowania C++ jako jezyk ˛ strukturalny Jeżeli brak definicji konstruktora kopiujacego, ˛ to zostanie on wygenerowany Obiekt może być przekazywany przez wartość, gdy konstruktor kopiujacy ˛ bedzie ˛ prywatny. Klasy i obiekty » Programowanie obiektowe » Funkcje składowe (metody) » Konstruktor » Destruktor » Konstrukcja i destrukcja » Tworzenie kopii obiektu » Konstruktor kopiujacy ˛ Zawsze definiować (dla klas autonomicznych): konstruktor (lub konstruktory) konstruktor kopiujacy ˛ destruktor operator przypisania (operator=) - p. 27/27