Bibliografia [1] Jerzy Grębosz, Symfonia C++, Oficyna Kallimach, Kraków, 1999, [2] Jerzy Grębosz, Pasja C++, Oficyna Kallimach, Kraków, 1999, [3] Bjarne Stroustrup, Język C++, WNT, Warszawa, 1997, [4] Davis Chapman, Visual C++ dla każdego, Helion, Gliwice, 1999. 1
ROZDZIAŁ 1 Wstęp (1) Język C++ - język funkcji - funkcja main(). (2) Operacje we/wy. (3) Dyrektywa preprocesora #include (4) Kompilator - linker - preprocesor (5) Język wolnego formatu (6) Deklaracja - definicja 2
ROZDZIAŁ 2 Operatory (1) Operator przypisania = a = 1 (2) Operatory arytmetyczne + dodawanie - odejmowanie * mnożenie / dzielenie (3) Operator % - modulo - reszta z dzielenia np. 10%3 = 1. (4) Operatory jednoargumentowe - + i (5) Operatory inkrementacji i dekrementacji Forma przedrostkowa a = + + i b = i Forma przyrostkowa a = i + + b = i (6) Operatory logiczne Operatory logiczne < -mniejszy niż <= - mniejszy lub równy > - większy niż >= - większy lub równy == - równy! = - różny Operator negacji! Jednoargumentowy operator negacji (wykrzyknik). 3
Operatory sumy logicznej ( ) i iloczynu logicznego (&&) (7) Operatory bitowe Przeunięcie w lewo zmienna << ile miejsc bity z lewego brzegu są gubione, z prawego brzegu uzupełniane są zerami Przesunięcie w prawo zmienna >> ile miejsc - bity z prawego brzegu są gubione, a z lewego - -zależne od typu zmiennej (unsigned lub signed (ale jest to akurat liczba dodatnia) - to bity są uzupełniane zerami) - signed liczba ujemna - bity uzupełniane są 0 lub 1. & - bitowa koniunkcja - bitowa alternatywa - bitowa różnica symetryczna - bitowa negacja Przykład 2.1. Operatory bitowe m 0000 1111 0000 1111 k 0000 1111 1111 0000 m&k 0000 1111 0000 0000 m k 0000 1111 1111 1111 m 1111 0000 1111 0000 m k 0000 0000 1111 1111 (8) Pozostałe operatory przypisania 4
i+ = 2 i = i + 2 i = 2 i = i 2 i = 2 i = i 2 i/ = 2 i = i/2 i% = 2 i = i%2 i >>= 2 i = i >> 2 i <<= 2 i = i << 2 i& = 2 i = i&2 i = 2 i = i 2 i = 2 i = i 2 (9) Operator sizeof sizeof(nazwa typu) sizeof(nazwa obiektu) (10) Operator rzutowania (nazwa typu) obiekt nazwa typu (obiekt) (11) Operator przecinek a=22; b=(a,a+4,a++);//23 (12) Wyrażenie warunkowe (warunek)? wartość1 : wartość2 Przykład c=(x>y)? 5: 12; za c zostanie podstawiona wartość 5, gdy x > y lub 12 w przeciwnym razie. 5
ROZDZIAŁ 3 Instrukcje sterujące (1) Prawda fałsz. (2) Instrukcja warunkowa if if (wyrażenie) instrukcja1; if (wyrażenie) instrukcja1; else instrukcja2; if (wyrażenie) instrukcja1; else if (wyrażenie) instrukcja2; else instrukcja3; (3) Instrukcja while. while (wyrażenie) instrukcja; while (wyrażenie) { instrukcje } (4) Pętla do... while... do { instrukcje } while (wyrażenie); (5) Pętla for for (wyrażenie1; wyrażenie2; wyrażenie3) instrukcja; for (wyrażenie1; wyrażenie2; wyrażenie3) { instrukcje; } for (;;;) (6) Instrukcja switch switch (wyrażenie) {case wartość1 : instrukcja1; \\ break; case wartość2 : instrukcja2; \\break; case wartość3 : instrukcja3; 6
\\break; default : instrucja4; \\break; } (7) Instrukcja break (8) Instrukcje continue 7
ROZDZIAŁ 4 Typy (1) Typy podstawowe w języku C++. (a) Typy reprezentujące liczby całkowite short int (short) -32.767-32.767 (0-65.535) int -2miliardy - 2 miliardy long int (long). (b) Typ reprezentujący obiekty zadeklarowane jako znaki alfanumeryczne char (-128-127) (0-255). Powyższe typy mogą występować w dwóch wariantach ze znakiem (signed) - reprezentuje liczbę dodatnią lub ujemną bez znaku (unsigned) - reprezentuje liczbę dodatnią (c) Typy reprezentujące liczby zmiennoprzecinkowe - umożliwiają pracę na liczbach rzeczywistych z różną dokładnością float 1.1 10 38 3.4 10 38-6 cyfr znaczących double 2.2 10 308 1.79 10 308-15 cyfr znaczących long double 3.3 10 4932 1.1 10 4932-18 cyfr znaczących. L = mantysa 10 cecha (d) Typ pusty (void) (e) Typ wyliczeniowy enum nazwa typu {lista wyliczeniowa} ; (f) Typ logiczny (bool) - true, false. 8
(2) Zakres ważności nazwy obiektu (a) lokalny (b) blok funkcji (c) zakres pliku (3) Zasłanianie nazw (4) Modyfikator const 9
ROZDZIAŁ 5 Funkcje (1) Podprogram (2) Funkcja (3) Deklaracja a definicja funkcji (4) Przesyłanie argumentów do funkcji (przez wartość i referencję) (5) Argumenty domniemane int multi (int x, float m, int a a=4, float y= 6.55, int k=10); wywołania multi(2,3.14); multi(2,3.14,7); multi(2,3.14,7,0.3); multi(2,3.14,7,,5); - błąd multi(2,3.14,7,0.3,5); (6) Funkcje inline (7) Rekurencja Ciąg Fibonacciego a 0 = 0, a 1 = 1, a n = a n 2 + a n 1. long Fib(int N) {long t; if (N == 0) t = 0; else if (N == 1) t = 1; else t = Fib(N - 1) + Fib(N - 2); return t; } (8) Szablony funkcji template <class dowolny_typ> dowolny_typ nazwa(dowlny_typ arg) //-jeden argument 10
template <class dowolny_typ> void nazwa(dowolny_typ arg1,dowolny_typ arg2)// - dwa argumenty template <class d_typ> d_typ MAX(d_typ a, d_typ b) {return (a>b)? a:b;} (9) Funkcje biblioteczne Plik nagłówkowy math.h int abs(int); double acos(double); double asin(double); double atan(double); double cos(double); double cosh(double); double exp(double); double fabs(double); long labs(long); double log(double); double log10(double); double pow(double, double); double sin(double); double sinh(double); double tan(double); double tanh(double); double sqrt(double); (10) Przeładowanie nazw funkcji 11
ROZDZIAŁ 6 Tablice (1) Tablica typ elementów nazwa tablicy [rozmiar] (2) Inicjalizacja tablic (3) Przesyłanie tablic do funkcji (4) Tablice znakowe (5) Tablice wielowymiarowe 12
ROZDZIAŁ 7 Wskaźniki (1) Definicje wskaźników int * w; float * f; char * zn; (2) Nadawanie wartości początkowej (3) Wskaźniki a tablice (4) Zastosowanie wskaźników w argumentach funkcji int tafla[4]={1,2,3,4} void funwsk1(int *wsk, int rozmiar); void funtabl(int tab[], int rozmiar); funtab(tafla,4) funwsk1(tafla,4); (5) Rezerwacja obszarów pamięci (6) Dynamiczna alokacja tablicy (7) Cechy obiektów stworzonych operatorem new Obiekty istnieją od momentu utworzenia operatorem new do czasu skasowania operatorem delete. Obiekty nie mają nazwy. Można nim operować tylko za pomocą wskaźników. Nie obowiązują zwykłe zasady o zakresie ważności. Jeżeli istnieje choć jeden wskaźnik pokazujący na obiekt, to mamy do tego obiektu dostęp. Obiekty tworzone dynamicznie nie są inicjalizowane zerami. (8) Stałe wskaźniki, wskaźniki do stałych (9) Wskaźniki a stringi 13
ROZDZIAŁ 8 Klasy class nowy_typ { składniki klasy metody (funkcje) klasy }; (1) Składniki klasy (a) public (b) private (c) protected (2) Różnice między klasą, strukturą i unią. (3) Konstruktor - funkcja składowa, która (a) nazywa się tak samo jak klasa. (b) nie ma wyspecyfikowanego żadnego typu wartości zwracanej (po słowie return może być tylko średnik). (c) ma na celu nadać wartości początkowe składnikom klasy. (d) jest wywoływany automatycznie w chwili definicji każdego obiektu zaraz po przydziale pamięci. (e) może być przeładowana. (f) nie może być funkcją typu const, static. (4) Konstruktor domniemany. (5) Lista inicjalizacyjna konstruktora. (6) Konstruktor kopiujący. (7) Destruktor - klasy K funkcja składowa o nazwie K. Destruktor jako funkcja nie może zwracać żadnej wartości (nawet void), nie jest wywoływana z żadnymi argumentami. Funkcja ta jest wywoływana automatycznie gdy obiekt jest likwidowany. (8) Konstrukcja i destrukcja obiektu, którego składnikiem jest obiekt innej klasy. 14
(9) Składnik statyczny (10) Statyczna funkcja składowa (11) Funkcje zaprzyjaźnione (12) Konwersje Konwersje obiektu typu A na typ B Konstruktor konwertujący - określa konwersję od typu który przyjmuje do typu klasy do której należy K:K(T); T K class zespolona {public: float re,im; public: zespolona(float a,float b):re(a),im(b){}; zespolona():re(0),im(0){}; void wypisz() {cout<<re<<" "<<im<<"\n";} }; Konstruktory postaci zespolona ::zespolona(float a) :re(a){}; zespolona ::zespolona(float a, float b=0):re(a),im(0){}; określają konwersję typu float zespolona. Takie konstruktory mogą być wywoływane niejawnie (zawsze gdy wymagana jest konwersja), lub jawnie. Konwesja nie musi dotyczyć tylko typów wbudowanych Funkcja konwertująca przekształcenie odwrotne tzn. z typu swojej klasy K na innego typ T. K::operator T( ); - gdzie T- nazwa typu na który przekształcamy (nie tylko typ wbudowany) K T musi być funkcją składową klasy nie ma określenia typu rezultatu zwracanego ma pustą listę argumentów Przykład. Konwersja z klasy K na typ float 15
operator float() {return re;} Uwagi: nie można zdefiniować konstruktora dla typu wbudowanego nie można zdefiniować konstruktora dla klasy, która nie jest naszą własnością aby zapewnić konwersję na typ wbudowany należy posłużyć się funkcją konwertującą Konwersja zachodzi gdy: w wywołaniu funkcji zachodzi niezgodność typów argumentów formalnych i aktualnych, a konwersja może tę niezgodność usunąć. przy zwracaniu rezultatu przez funkcje obiekt stojący po słowie return jest innego typu niż deklarowany dla funkcji typ rezultatu. w obecności operatorów w wyrażeniach if (obiekt) switch (obiekt) while (obiekt) oczekiwane jest wyrażenie typu int w wyrażeniach inicjalizujących. 16