Zaawansowane programowanie w C++ (PCP)
Wykład 1 - sprawy organizacyjne i wprowadzenie.
dr in˙z. Robert Nowak
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
Cel i zakres przedmiotu
Umiej ˛etno´s´c programowania to umiej ˛etno´s´c rozwi ˛ azania problemów przy pomocy komputera.
Czy ten problem mo˙ze by´c rozwi ˛ azany przy pomocy komputera?
Czy ten problem powinien by´c rozwi ˛ azany przy pomocy komputera?
Komputer = „głupi automat”.
zapoznanie słuchaczy z zagadnieniami tworzenia oprogramowania w C++
współcze´snie stosowane techniki i biblioteki
Zakładana jest znajomo ´s ´c programowania strukturalnego
» Cel i zakres przedmiotu
Sprawy organizacyjne
» Podstawowe dane o przedmiocie
» Zaj ˛ecia
» Literatura
» Zaliczenie przedmiotu
» Wymaganie oprogramowanie
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
Podstawowe dane o przedmiocie
Miejsce spotka ´ n:
Pi ˛ atki 8 15 − 10 00 , sala N7 (wykład)
Pi ˛ atki 8 15 − 10 00 , sala N102 (laboratorium) Prowadz ˛ acy:
dr in˙z. Robert Nowak, Zakład Sztucznej Inteligencji, Wydział Elektroniki i Technik Informacyjnych, Politechnika Warszawska.
e-mail:
r.m.nowak@elka.pw.edu.pl strona przedmiotu:
http://staff.elka.pw.edu.pl/˜rnowak2/pcp2007L
» Cel i zakres przedmiotu
Sprawy organizacyjne
» Podstawowe dane o przedmiocie
» Zaj ˛ecia
» Literatura
» Zaliczenie przedmiotu
» Wymaganie oprogramowanie
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
Zaj ˛ecia
1 Klasy autonomiczne, cykl ˙zycia obiektów.
2 Agregacja i dziedziczenie, polimorfizm, klasy abstrakcyjne.
3 Laboratorium 1: funkcje wirtualne, hierarchia klas.
4 Wzorce projektowe.
5 Obsługa bł ˛edów, mechanizm wyj ˛ atków, sprytne wska´zniki.
6 Laboratorium 2: wyj ˛ atki. Rozdanie zada ´n projektowych.
7 Rola projektowania i testowania, repozytorium.
8 Szablony, wst ˛ep do biblioteki standardowej, strumienie.
9 Biblioteka standardowa: kontenery, algorytmy.
10 Laboratorium 4: Kolokwium.
11 Laboratorium 5: realizacja projektu 12 Laboratorium 6: realizacja projektu
13 Aplikacje wielow ˛ atkowe, synchronizacja, boost::thread.
» Cel i zakres przedmiotu
Sprawy organizacyjne
» Podstawowe dane o przedmiocie
» Zaj ˛ecia
» Literatura
» Zaliczenie przedmiotu
» Wymaganie oprogramowanie
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
Literatura
Bjarne Stroustrup, J ˛ezyk 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, Je¸zyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk, Helion, 2005.
B. Karlsson, Wie¸cej ni˙z C++. Wprowadzenie do bibliotek Boost, Helion, 2006.
S. Meyers, 50 efektywnych sposobów na udoskonalenie
Twoich programów, Helion, 2003.
» Cel i zakres przedmiotu
Sprawy organizacyjne
» Podstawowe dane o przedmiocie
» Zaj ˛ecia
» Literatura
» Zaliczenie przedmiotu
» Wymaganie oprogramowanie
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
Zaliczenie przedmiotu
Podział punktów:
kolokwium 0 – 30pkt
´cwicze ´n laboratoryjnych 0 – 40pkt
projektów 0 – 30pkt
Warunkiem zaliczenia jest uzyskanie przynajmniej 51 pkt.
Ocena:
91 – 100 punktów ocena 5
81 – 90 pkt. ocena 4 1 2
71 – 80 pkt. ocena 4
61 – 70 pkt. ocena 3 1 2
51 – 60 pkt. ocena 3
0 – 50 pkt. ocena 2
» Cel i zakres przedmiotu
Sprawy organizacyjne
» Podstawowe dane o przedmiocie
» Zaj ˛ecia
» Literatura
» Zaliczenie przedmiotu
» Wymaganie oprogramowanie
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
Wymaganie oprogramowanie
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
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
» Sposób, aby zosta´c dobrym programist ˛a
» zasady dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
Sposób, aby zosta ´c dobrym programist ˛ a
Czyta´c kod innych.
My´sle´c!
Programowa´c.
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
» Sposób, aby zosta´c dobrym programist ˛a
» zasady dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
zasady dobrego stylu programowania
Wykrywanie bł ˛edów w programach:
Wykorzystywa´c kompilator.
Zawsze doprowadzi´c do czystej kompilacji (bez ˙zadnych ostrze˙ze ´n) na najwy˙zszym poziomie.
Rozumie´c ka˙zde ostrze˙zenie.
Stosowa´c standardy kodowania:
pliki ´zródłowe,
nazewnictwo,
formatowanie kodu ´zródłowego,
stosowa´c konsekwentnie ten sam styl kodowania.
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Typy wbudowane
logiczny: bool , true , false
całkowite: int , long , ...
rzeczywiste: double , ...
znakowe: char , wchar_t
typ wyliczeniowy
enum Kolory { RED = 1, GREEN = 2, BLUE = 4};
void - oznacza brak informacji
typy wska´znikowe
typy tablicowe
typy referencyjne
typedef
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Czas ˙zycia obiektów
l-warto´ s´ c : odnosi si ˛e do „czego´s” co istnieje w pami ˛eci.
Automatyczne:
tworzone w chwili napotkania definicji
s ˛ a niszczone w momencie wyj´scia z zasi ˛egu (np. z bloku)
definicja powinna by ´c wtedy gdy mo˙zna zainicjowa ´c
Statyczne (globalne i zadeklarowane jako static )
tworzone tylko raz
s ˛ a niszczone po zako ´nczeniu programu
dynamiczne (tworzone na stercie)
operatory new i delete (uwaga! oddzielna wersja dla tablic),
programista steruje czasem ˙zycia obiektów (tworzy je i usuwa),
Nie u˙zywamy funkcji z <stdlib.h> , czyli malloc , free
itp.
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Wykorzystywanie stałych
Stałe definiuje si ˛e za pomoc ˛ a słowa kluczowego const .
const int NUM = 34;
const int WZROST[] = { 174, 185, 193, 168 };
unika si ˛e „magicznych” liczb w kodzie,
pokazuje si ˛e, ˙ze funkcja nie zmienia argumentów,
pozwala si ˛e kompilatorowi na optymalizacje.
Systematycznie korzysta´c ze stałych symbolicznych!
int i = 2, j = 3;
const int* p = &i;
p = &j;
*p = 4;
int* const q = &i;
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Konwersja typów
Nie u˙zywa si ˛e rzutowania w stylu ’C’!
nie u˙zywa si ˛e void*
unika´c konwersji typów Operatory rzutowania:
static_cast - umo˙zliwia konwersj ˛e pomi ˛edzy
„spokrewnionymi” typami
const_cast - znosi kwalifikator const
reinterpret_cast - dowolna konwersja (tak jak w C)
dynamic_cast - rzutowanie w gór ˛e hierarchii klas
double d = 3.2;
int i = static_cast<int>(d);
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Instrukcje steruj ˛ ace
Instrukcje warunkowe:
if ... else ...
switch
Iteracja:
for
while
do ... while
Wołanie funkcji, rekurencja.
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Przeci ˛ a˙zanie nazw funkcji
Funkcje mog ˛ a mie´c te same nazwy.
bada si ˛e zgodno´s´c typów parametrów formalnych i aktualnych,
znajdowania wła´sciwej wersji funkcji:
1. ´scisła zgodno´s´c;
2. promowanie w zakresie typów całkowitych(np.
bool → int );
3. standardowe konwersje (np. int → double );
4. konwersje zdefiniowane przez u˙zytkownika,
5. wielokropek w deklaracji funkcji (wiele argumentów).
Je˙zeli znajdzie si ˛e dwie pasuj ˛ ace deklaracje: zgłaszany jest
bł ˛ ad kompilacji.
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Przeci ˛ a˙zanie nazw (przykład)
Przykład:
void print(double);
void print(long);
print(1L);////print(long) print(1.0);////print(double) print(1);////bł ˛ ad - niezgodno´ s´ c
nie mo˙zna przeci ˛ a˙za´c ze wzgl ˛edu na zwracan ˛ a warto´s´c;
jest to ułatwienie notacyjne (to programista decyduje, ˙ze funkcje o tych samych nazwach wykonuj ˛ a podobne
operacje);
stosowane np. dla ró˙znych konstruktorów.
r ˛eczne usuwanie niejednoznaczno´sci: jawna konwersja
typu, np. static_cast .
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Argumenty domy ´slne
Warto´s´c wstawiana, gdy nie dostarczono argumentu.
class Point { public:
Point(int x = 0, int y = 0);
private:
int x_;
int y_;
};
Point::Point(int x, int y) //Nie powtarza´ c arg. domy´ slnych : x_(x), y_(y) { }
Point p, r(1), s(1,2);
Przeci ˛ a˙zanie - gdy ró˙zny kod.
Argumenty domy´slne - gdy wiele argumentów, a niektóre
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Preprocesor
Preprocesora nale˙zy u˙zywa´c 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 wi ˛ecej!
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Wykorzystanie biblioteki standardowej C
Wszystkie nagłówki z C zostały obudowane, aby mo˙zna było je wykorzystywa´c w C++. Zmieniono ich nazwy.
<cassert> - asercje (niezmienniki);
<cctype> - klasyfikacja znaków ( isalpha , isspace , ... );
<cfloat> - ograniczenia reprezentacji zmiennopozycyjnej (np. DBL_MAX );
<climits> - stałe ograniczaj ˛ ace zakresy typów wbudowanych (np. INT_MAX );
<cmath> - funkcje matematyczne.
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
» Typy wbudowane
» Czas ˙zycia obiektów
» Wykorzystywanie stałych
» Konwersja typów
» Instrukcje steruj ˛ace
» Przeci ˛a˙zanie nazw funkcji
» Przeci ˛a˙zanie nazw (przykład)
» Argumenty domy´slne
» Preprocesor
» Wykorzystanie biblioteki standardowej C
» Projektowanie modułów, rola testowania
Klasy i obiekty
Projektowanie modułów, rola testowania
Moduł zawiera interfejs (nagłówek) oraz implementacj ˛e.
U˙zywaj przestrzni nazw (jedna przestrze ´n nazw na bibliotek˛e - zbiór powi ˛ azanych modułów).
Ka˙zdy moduł powinien mie´c swój test.
Test powinien wykonywa´c si ˛e automatycznie (nie powinien komunikowa´c si ˛e z człowiekiem).
Wykorzystywa´c asercje do testowania.
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
» Programowanie obiektowe
» Funkcje składowe (metody)
» Konstruktor
» Destruktor
» Konstrukcja i destrukcja
» Tworzenie kopii obiektu
» Konstruktor kopiuj ˛acy
Programowanie obiektowe
Wszystkie byty w programie s ˛ a obiektami.
Program to zbiór obiektów, które si ˛e ze sob ˛ a komunikuj ˛ a.
ka˙zdy obiekt posiada typ i to˙zsamo´s´c.
Mo˙zliwo´s´c definiowania typów przez u˙zytkownika:
struct
class
struct X {private: ... to to samo co
class X {... , ale konwencje ...
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
» Programowanie obiektowe
» Funkcje składowe (metody)
» Konstruktor
» Destruktor
» Konstrukcja i destrukcja
» Tworzenie kopii obiektu
» Konstruktor kopiuj ˛acy
Funkcje składowe (metody)
dost ˛ep do składowych
niejawny argument - wska´znik this
odwołania do this mo˙zna pomin ˛ a´c (skrócenie zapisu)
metody stałe
metody inline
Sekcje (kontrola dost ˛epu) - dziel ˛ a klas ˛e na interfejs i implementacj ˛e.
class Prostokat { public:
Prostokat(const Punkt& a, const Punkt& b);
private:
Punkt leftup;
Punkt rightdown;
};
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
» Programowanie obiektowe
» Funkcje składowe (metody)
» Konstruktor
» Destruktor
» Konstrukcja i destrukcja
» Tworzenie kopii obiektu
» Konstruktor kopiuj ˛acy
Konstruktor
Specjalna metoda, która jest wołana, gdy jest tworzony obiekt danej klasy.
zawsze wołany - programista nie zapomni zainicjowa´c składowych,
mo˙zliwo´s´c inicjacji prywatnych składowych,
elegancki zapis inicjacji obiektów.
struct Punkt { int x;
int y;
//konstruktor domy´ slny Punkt() { x = 0; y = 0; } //konstruktor
Punkt(int wx, int wy) { x = wx; y = wy; } };
Punkt p; //Tworzy punkt, wywołuje konstruktor domy´ slny
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
» Programowanie obiektowe
» Funkcje składowe (metody)
» Konstruktor
» Destruktor
» Konstrukcja i destrukcja
» Tworzenie kopii obiektu
» Konstruktor kopiuj ˛acy
Destruktor
Je˙zeli obiekt klasy ma przydzielane zasoby, to powinno si ˛e je zwalnia´c.
Destruktor - metoda wołana gdy niszczony jest obiekt.
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;
};
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
» Programowanie obiektowe
» Funkcje składowe (metody)
» Konstruktor
» Destruktor
» Konstrukcja i destrukcja
» Tworzenie kopii obiektu
» Konstruktor kopiuj ˛acy
Konstrukcja i destrukcja
tworzenie usuwanie
obiekt automatyczny (nazwany)
deklaracja (za ka˙z- dym razem)
opuszcza si ˛e blok obiekt na stercie operator new operator delete składowa (niesta-
tyczna)
tworzenie obiektu nadrz˛ednego
niszczenie obiektu nadrz˛ednego
lokalny obiekt sta- tyczny
deklaracja (za pierwszym razem!)
koniec programu obiekt globalny, skła-
dowa statyczna
pocz ˛ atek programu koniec programu obiekt tymczasowy podczas warto´scio-
wania wyra˙zenia
po doj´sciu do
ko ´nca wyra˙zenia
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
» Programowanie obiektowe
» Funkcje składowe (metody)
» Konstruktor
» Destruktor
» Konstrukcja i destrukcja
» Tworzenie kopii obiektu
» Konstruktor kopiuj ˛acy
Tworzenie kopii obiektu
Tworzenie kopii:
jawne Foo a; Foo b(a);
jawne Foo c = a;
przekazywanie wyniku przez warto´s´c;
Foo get();
Foo d = get();
przekazywanie argumentu przez warto´s´c;
void put(Foo x);
put(a) ;
class Foo { public:
//Deklaracja konstruktora kopiuj ˛ acego Foo(const Foo&);
...
» Cel i zakres przedmiotu
Sprawy organizacyjne
Kilka podstawowych zasad dobrego stylu programowania
C++ jako j ˛ezyk strukturalny
Klasy i obiekty
» Programowanie obiektowe
» Funkcje składowe (metody)
» Konstruktor
» Destruktor
» Konstrukcja i destrukcja
» Tworzenie kopii obiektu
» Konstruktor kopiuj ˛acy