Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wprowadzenie. PK3 Dr inż. Roman Starosolski Pokój nr 527 (konsultacje etc.) regulaminy.

Podobne prezentacje


Prezentacja na temat: "Wprowadzenie. PK3 Dr inż. Roman Starosolski Pokój nr 527 (konsultacje etc.) regulaminy."— Zapis prezentacji:

1 Wprowadzenie

2 PK3 Dr inż. Roman Starosolski Pokój nr 527 (konsultacje etc.) regulaminy regulaminy materiały materiały zasoby zasoby

3 Plan wykładów 1. Wprowadzenie 2. Rozszerzenia nieobiektowe 3. Paradygmat obiektowy, klasa 4. Konstruktor, destruktor 5. Operatory 6. static, const i volatile 7. Dziedziczenie, klasy pochodne 8. Metody wirtualne 9. Dziedziczenie wielobazowe 10. Wzorce 11. Obsługa wyjątków 12. Biblioteki

4 C++ historia C++ wywodzi się z C (oba nadal rozwijane) C++ wywodzi się z C (oba nadal rozwijane) C wywodzi się z BCPL (martwy) C wywodzi się z BCPL (martwy) nie było języka A nie było języka A

5 C++ C z klasami narzędzie abstrakcji danych narzędzie abstrakcji danych język programowania obiektowego język programowania obiektowego ulepszony C ulepszony C

6 Książki o C++ Bjarne Stroustrup Język C++ WNT W-wa Bjarne Stroustrup Język C++ WNT W-wa International Standard for Information SystemsProgramming Language C+ + (draft), ANSI

7 Książki o C++ Stroustrup B.: Projektowanie i rozwój języka C++. WNT, Warszawa Stroustrup B.: Projektowanie i rozwój języka C++. WNT, Warszawa Plauger P.J., Biblioteka standardowa C ++. WNT, Warszawa Plauger P.J., Biblioteka standardowa C ++. WNT, Warszawa

8 Książki o C++ Lippman S.B., Lajoie J.: Podstawy języka C++. WNT, Warszawa Lippman S.B., Lajoie J.: Podstawy języka C++. WNT, Warszawa Tondo C. L., Leung B. P.: Podstawy języka C++. Ćwiczenia i rozwiązania. WNT, Warszawa Tondo C. L., Leung B. P.: Podstawy języka C++. Ćwiczenia i rozwiązania. WNT, Warszawa Grębosz J.: Symfonia C++. RM, W-wa, wyd. 4. Grębosz J.: Symfonia C++. RM, W-wa, wyd. 4. Grębosz J.: Pasja C++. RM, W-wa, wyd. 2. Grębosz J.: Pasja C++. RM, W-wa, wyd. 2.

9 Nieobiektowe rozszerzenia C++

10 Komentarz /* komentarz C, stosowany również w C++, wielowierszowy */ // jednowierszowy komentarz C++ // od // do końca wiersza

11 Komentarz Nadal można używać preprocesora do wyłączania większych fragmentów kodu źródłowego #if 0 /* komentarz C, stosowany również w C++, wielowierszowy */ // jednowierszowy komentarz C++ #endif

12 Komentarz /* do komentarzy wielowierszowych używaj komentarza z C lub z C++ */ // lecz ich nie mieszaj !!! void foo()// tutaj użyj komentarza z C++ { return; // wygodniejszy i bezpieczniejszy }

13 Standardowe wejście i wyjście Nadal możemy używać funkcji C z Nadal możemy używać funkcji C z Powinniśmy używać operatorów strumieniowych z C++ (biblioteka ) Powinniśmy używać operatorów strumieniowych z C++ (biblioteka ) #include #include int a,b,c,d; cout << input a and b \n ; cin >> a; cin >> b; cout << input c and d \n cin >> c >> d;

14 Standardowe wejście i wyjście Strumienie nie są tak podatne na błędy, jak funkcje z (vide scanf() ) Strumienie nie są tak podatne na błędy, jak funkcje z (vide scanf() ) Strumienie Strumienie cin - std. input cin - std. input cout- std. output cout- std. output cerr- std. error output cerr- std. error output Manipulowanie łańcuchami, określanie precyzji, kontrola stanu, etc. – równie funkcjonalne jak w Manipulowanie łańcuchami, określanie precyzji, kontrola stanu, etc. – równie funkcjonalne jak w nie należy mieszać operatorów C++ z funkcjami C z nie należy mieszać operatorów C++ z funkcjami C z

15 Deklaracja jest instrukcją deklaracja wewnątrz bloku jest instrukcją deklaracja wewnątrz bloku jest instrukcją może być umieszczona po innych instrukcjach może być umieszczona po innych instrukcjach{ int i=12; cout << statement; int j=i; for (int k=0; k<20; k++) j+=k;}

16 Deklaracja wewnątrz for int i = 42; int a[10]; for (int i = 0; i < 10; i++) a[i] = i; int j = i; // j = 42

17 Deklaracja wewnątrz for for ( forinitstatement; condition; expression ) is equivalent to { forinitstatement while ( condition ) { statement expression ; }

18 goto ograniczenia w stosunku do C: ograniczenia w stosunku do C: tylko wewnątrz bloku tylko wewnątrz bloku skok nie może pominąć inicjalizacji skok nie może pominąć inicjalizacji

19 goto a: int foo() {b: goto b; int i=7; c: return i; }d: void foofoo() {e:return;}

20 Typy silna kontrola typów (w porównaniu do C) – aby umożliwić kontrolę błędów silna kontrola typów (w porównaniu do C) – aby umożliwić kontrolę błędów automatyczna konwersja typów – gdy nie prowadzi do niejednoznaczności automatyczna konwersja typów – gdy nie prowadzi do niejednoznaczności gdy to tylko możliwe, konwersja bez utraty precyzji/informacji (nie gwarantowane dla wszystkich konwersji: char/short/int/long/single/float/double/signed/u nsigned) gdy to tylko możliwe, konwersja bez utraty precyzji/informacji (nie gwarantowane dla wszystkich konwersji: char/short/int/long/single/float/double/signed/u nsigned)

21 Typy gdy nie określono typu, przyjmuje się int gdy nie określono typu, przyjmuje się int unsigned u; const a; static i; zaleca się jawne określanie typu int zaleca się jawne określanie typu int

22 Typ void * nie ma automatycznej konwersji do innych typów wskaźnikowych nie ma automatycznej konwersji do innych typów wskaźnikowych void *malloc(size_t size); char *str; int *pi; str = (char *) malloc(10); pi = (int *)malloc(100);

23 Typ void * nie ma automatycznej konwersji do innych typów wskaźnikowych nie ma automatycznej konwersji do innych typów wskaźnikowych void free(void *block); free(str); free(pi);

24 const nazwane stałe mają zastąpić definiowane stałe z C nazwane stałe mają zastąpić definiowane stałe z C const five = 5; void fooj(const int ci); const – prawdziwe zmienne, z rozmiarem, adresem, operatorami, ale nie wolno ich modyfikować const – prawdziwe zmienne, z rozmiarem, adresem, operatorami, ale nie wolno ich modyfikować ochrona przed błędami programisty ochrona przed błędami programisty umożliwienie optymalizacji przez kompilator umożliwienie optymalizacji przez kompilator

25 const a wskaźniki wskaźnik na stałą: const char *pc=asdf (lub: char const *pc=asdf) wskaźnik na stałą: const char *pc=asdf (lub: char const *pc=asdf) stały wskaźnik: char * const cp=asdcf; stały wskaźnik: char * const cp=asdcf; stały wskaźnik na stałą : const char * const cpc=asdcf; stały wskaźnik na stałą : const char * const cpc=asdcf; błędy: pc[1]=2; cp++; cpc[1]=b; cpc--; wskaźnikowi na stałą można przypisać adres zmiennej, odwrotnie nie wskaźnikowi na stałą można przypisać adres zmiennej, odwrotnie nie

26 enum enum numbers {ZERO, ONE, FIVE=5, SIX}; numbers to opcjonalna nazwa nowego typu numbers to opcjonalna nazwa nowego typu konwersja automatyczna z enum na int konwersja automatyczna z enum na int dlaczego enum nie jest popularne? dlaczego enum nie jest popularne?

27 Referencje referencja (reference) do typu T: T& wskaźnik, który wygląda jak zmienna wskaźnik, który wygląda jak zmienna int i=7, // zmienna int & iref=i;// referencja – musi być zainicjalizowana // tj. skojarzona ze zmienną (i) iref++;// teraz i==8

28 Referencje void swap(int &i1, int &i2); int a=2, b=3; swap(a,b); void swap(int &i1, int &i2) { int i3; i3=i1;i1=i2;i2=i3;} i1i2i3ab ?

29 Referencje – problemy problem: gdy parametr aktualny jest innego typu niż formalny, lub jest wyrażeniem problem: gdy parametr aktualny jest innego typu niż formalny, lub jest wyrażeniem char c; swap(a+20, c); argumenty będą konwertowane do to const (const int), kompilator oczekuje int (nie const), powinien wygenerować błąd, zazwyczaj wygeneruje tylko ostrzerzeni. wywołanie swap() nie odniesie skutku

30 Referencje – problemy // int &ir=7; ERROR! 7 to stała const int &ir1=7, // OK &ir2=i+f; // OK /* ir1 i ir2 – referencje do stałych obiektów tymczasowych, żyjących tak długo jak ir1 i ir2 */

31 Referencje – przykład użyteczny int & min(int &i1, int &i2) { return i1

32 Referencje mogą wprowadzać w błąd mogą wprowadzać w błąd unikaj funkcji modyfikującej swoje argumenty unikaj funkcji modyfikującej swoje argumenty używaj referencji, gdy ich rzeczywiście potrzebujesz używaj referencji, gdy ich rzeczywiście potrzebujesz dla oszczędzania pamięci dla oszczędzania pamięci dla oszczędzania czasu dla oszczędzania czasu do zwracania obiektów, które będą dalej przetwarzane do zwracania obiektów, które będą dalej przetwarzane używaj stałych referencji (optymalizacja, bezpieczeństwo) używaj stałych referencji (optymalizacja, bezpieczeństwo)

33 Funkcje – Prototypy C++ wymaga prototypów funkcji!!! (wartość zwracana, nazwa, argumenty) #include foo_prototypes.h #include foo_prototypes.h void foo(); void foo(); void foo() {}; void foo() {};

34 Funkcje – inline inline int sum(int a, int b) { return a+b; } zastępstwo makrodefinicji zastępstwo makrodefinicji inline to tylko zalecenie dla kompilatorainline to tylko zalecenie dla kompilatora automatyczne rozwijanie inline funkcji automatyczne rozwijanie inline funkcji funkcja rozwinięta inline nie ma adresu funkcja rozwinięta inline nie ma adresu

35 Funkcje przeciążone (overloaded) wiele funkcji o tej samej nazwie, OK. w C++ wiele funkcji o tej samej nazwie, OK. w C++ int f(int, int); int f(int); int f(long);

36 Funkcje przeciążone Adres funkcji przeciążonej – kompilator wymaga przesłanek wyboru wariantu funkcji Adres funkcji przeciążonej – kompilator wymaga przesłanek wyboru wariantu funkcji int (*pd)(long);//OK pd=f; void *pf; // pf=f;// ERROR!

37 Funkcje przeciążone Parametry funkcji przeciążonej muszą się różnić, Parametry funkcji przeciążonej muszą się różnić, Typ zwracany nie służy do rozróżniania funkcji przeciążonych, jest istotny gdy funkcja jest wywoływana Typ zwracany nie służy do rozróżniania funkcji przeciążonych, jest istotny gdy funkcja jest wywoływana int f(int, int); int f(int); int f(long); // OK // int f(int); double f(int); ERROR int ff(int); int ff(double); // OK. // ff(1L) ERROR! niejednoznaczność // void *p=ff(1) ERROR! typ zwracany

38 Dopasowywanie funkcji przeciążonych nie więcej niż jedna konwersja każdego argumentu wybierany najniższy poziom z możliwym dopasowaniem, niejednoznaczność to błąd dopasowania 1. T 1. ścisła zgodność; bez konwersji lub tylko: nazwa tablicy na wskaźnik, nazwa funkcji na wskaźnik, T na const T zgodność przy promocjach w zakresie typów całkowitych: char na int, short na int, poprzednie dla typów bez znaku, float na double konwersje standardowe: int double, pochodna* na podstawowa*, unsigned int int 1) 1) konwersje zdef. przez użytkownika 2) 2) zgodność przy zastosowaniu wielokropka (…)

39 Dopasowywanie funkcji przeciążonych int f(int); double f(double) void f(); int i1=f(1); // OK int i2=f(1.0); // OK, wywołanie double f(double), // konwersja wyniku int //int i3=f(Hi); ERROR! nie ma konwersji //char * do int ani do double

40 Funkcje przeciążone wygodne rozszerzenie konwersji automatycznych i jawnych wygodne rozszerzenie konwersji automatycznych i jawnych int cmp (double a, double b) { return a – b; } int cmp (char *a, char *b) { return strcmp(a,b); }

41 Funkcje przeciążone nadal korzystamy z konwersji automatycznych nadal korzystamy z konwersji automatycznych cmp (1, 2);//OK., konwersja do double przed //wywołaniem cmp (double a, double b) można zoptymalizować kod można zoptymalizować kod int cmp (int a, int b)// teraz cmp(1, 2) bez konwersji { return a – b; }

42 Domyślne argumenty funkcji void line(int len, char c=*) { for (int i=0; i

43 Domyślne argumenty funkcji int fun(int i1, int i2=20, int i3=30); po pierwszym domyślnym wszystkie następne muszą być domyślne po pierwszym domyślnym wszystkie następne muszą być domyślne funkcja taka nie jest przeciążona, funkcja taka nie jest przeciążona, &fun(int) == &fun(int, int) możemy niezależnie stosować przeciążanie: możemy niezależnie stosować przeciążanie: int fun(int i1, int i2); //deklaracja nie jest niejednoznaczna, //ale wywołanie fun (int, int) jest!

44 Domyślne argumenty funkcji uwaga na type * = po * spacja uwaga na type * = po * spacja argumenty domyślne można zdefiniować tylko raz (formalnie albo w prototypie, albo w definicji). argumenty domyślne można zdefiniować tylko raz (formalnie albo w prototypie, albo w definicji). Argumenty domyślne definiuj w pliku nagłówkowym!

45 Zmienna liczba argumentów funkcji w C pisaliśmy: w C pisaliśmy: int printf(char *, …); w C++ jest prościej: w C++ jest prościej: int printf(char * …); // można pominąć przecinek przed …, // ale tylko wtedy, gdy zmienna poprzedzająca … // nie ma wartości domyślnej. // ma // ma w C++ jest prościej: w C++ jest prościej: funkcje można przeciążać

46 Zarządzanie pamięcią przydział pamięci: operator new przydział pamięci: operator new składnia: new Typ int * pi = new int; // pi = (int*)malloc(sizeof(int)) zwolnienie: operator delete zwolnienie: operator delete składnia: delete pointer delete pi;// operator delete nie zmienia wartości // swojego argumentu

47 Zarządzanie pamięcią zarządzanie wektorami (tablicami) zarządzanie wektorami (tablicami) int * pai = new int [x]; delete [] pai; programista sam decyduje, którą wersję operatora delete użyć (kompilator tego nie sprawdzi i nie ostrzeże) programista sam decyduje, którą wersję operatora delete użyć (kompilator tego nie sprawdzi i nie ostrzeże) wielowymiarowe tablice: wielowymiarowe tablice: int *pmai = new int[x][20][30] // wszystkie wymiary, za wyjątkem pierwszego, // muszą być znane już podczas kompilacji delete [] pmai;

48 Zarządzanie pamięcią można zadeklarować funkcję (new_handler), będzie wywołana gdy zabraknie pamięci można zadeklarować funkcję (new_handler), będzie wywołana gdy zabraknie pamięci set_new_handler(); // set_new_handler(); // gdy nie zdefiniowano new_handler, new zwraca 0 (NULL) gdy nie zdefiniowano new_handler, new zwraca 0 (NULL) delete NULL; nie robi nic delete NULL; nie robi nic nie mieszaj new/delete z malloc/free nie mieszaj new/delete z malloc/free

49 Inne rozszerzenia Szablony (Templates) Szablony (Templates) Wyjątki (Exceptions) Wyjątki (Exceptions) Namespace Namespace


Pobierz ppt "Wprowadzenie. PK3 Dr inż. Roman Starosolski Pokój nr 527 (konsultacje etc.) regulaminy."

Podobne prezentacje


Reklamy Google