Download - C++
![Page 1: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/1.jpg)
C++
Paweł Rzechonek
Instytut InformatykiUniwersytetu Wrocławskiego
semestr letni 2011/2012
![Page 2: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/2.jpg)
Organizacja zajęć
Cel Nauka programowania obiektowego w języku C++. Umiejętność wykorzystania wybranych klas z
biblioteki standardowej.
Wymagania Umiejętność programowania strukturalnego w języku
ANSI C. Znajomość podstawowych struktur danych (tablice,
listy, drzewa, grafy).
![Page 3: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/3.jpg)
Organizacja zajęć
Wykład Wykładowca:
Paweł Rzechonek Kontakt mailowy:
[email protected] Materiały do wykładu i zadania laboratoryjne będzie
można znaleźć na stronie:http://ww.ii.uni.wroc.pl/~prz/2012lato/cpp/cpp.html
Zakres materiału: programowanie obiektowe w C++; szablony w C++; biblioteka STL.
![Page 4: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/4.jpg)
Organizacja zajęć
Laboratorium W semestrze będzie do zrealizowania około 12
prostych zadań. Za każde zaprogramowane zadanie będzie można
dostać do 10 punktów. Aby zaliczyć kurs należy do końca semestru
zgromadzić co najmniej 50% z możliwych do zdobycia punktów.
Zadania należy oddawać w wyznaczonym terminie. Studenci powinni osobiście prezentować swoje
programy w czasie trwania ćwiczeń laboratoryjnych.
![Page 5: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/5.jpg)
Organizacja zajęć
Literatura B.Stroustrup: Język C++. WNT, Warszawa 2000. N.M.Josuttis: C++. Biblioteka standardowa.
Podręcznik programisty. Wydawnictwo Helion, Gliwice 2003.
J.Grębosz: Symfonia C++ (tom 1, 2, 3). Oficyna Kallimach, Kraków 2002.
J.Grębosz: Pasja C++ (tom 1, 2). Oficyna Kallimach, Kraków 2003.
S.B.Lippman, J.Lajoie: Podstawy języka C++. WNT, Warszawa 2001.
C.L.Tondo, B.P.Leung: Podstawy języka C++. Ćwiczenia i rozwiązania. WNT, Warszawa 2001.
![Page 6: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/6.jpg)
Cechy języka C++
C++ jest rozszerzeniem ANSI C. C++ jest zorientowany na programowanie
obiektowe. C++ to język ogólnego przeznaczenia. Wygenerowany przez kompilator C++ kod
wynikowy jest bardzo efektywny. C++ i jego standardowe biblioteki zakładają
przenośność.
![Page 7: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/7.jpg)
Historia języka C++
Język C++ został wymyślony Bjarnea Stroustrupa. Pierwsza wersja języka, znana jako C z klasami,
pojawiła się w roku 1979 (było to obiektowe rozszerzenie języka C).
Nazwa języka C++ została zaproponowana przez Ricka Mascitti w 1983 roku.
Pierwszy standard języka C++ powstał w 1998 roku (ISO/IEC 14882:1998 "Information Technology – Programming Languages – C++").
Aktualny standard języka C++ pochodzi z roku 2003 (jest to ISO/IEC 14882:2003).
![Page 8: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/8.jpg)
C++wykład 1 (8.02.2011)
Łagodne wprowadzenie do języka C++
![Page 9: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/9.jpg)
Spis treści
Pierwsze programy w C++ Struktura programu w C++ Stałe Zmienne ulotne Referencje Napisy Typ void Standardowe wejście i wyjście Klasy, obiekty, pola, metody
![Page 10: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/10.jpg)
Pierwszy program
Oto program powitalny w języku C++:
# include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
cout<<”witaj na kursie C++”<<endl;
return 0;
}
![Page 11: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/11.jpg)
Drugi program
Oto program, który zamieni milimetry na cale:
# include <iostream>using namespace std;int main (){ cerr << "podaj długość w [mm]: "; int mm; cin >> mm; double inch = mm*25.3995; cerr << "ta sama długość w [in]: "; cout << mm << "[mm] = " << inch << "[in]"<< endl; return 0;}
![Page 12: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/12.jpg)
Struktura programu w C++ Podział na pliki:
nagłówkowe (rozszerzenie .h lub .hpp) z deklaracjami, źródłowe (rozszerzenie .cpp) z definicjami.
W plikach nagłówkowych stosujemy włączanie warunkowe:# ifndef moje_h# define moje_h/* właściwa zawartość pliku moje_h */# endif
Aby otrzymać uruchamialny plik wynikowy w jednym z plików źródłowych musi się znaleźć definicja funkcji main().
![Page 13: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/13.jpg)
Standardowe pliki nagłówkowe Pliki nagłówkowe odnoszące się do biblioteki
standardowej nie mają żadnego rozszerzenia, na przykład:# include <iostream># include <iomanip># include <string>
Nazwy odnoszące się do starych plików nagłówkowych z języka C są poprzedzone literą ”c”, na przykład:# include <cmath>
Wszystkie definicje z biblioteki standardowej są umieszczone w przestrzeni nazw std, dlatego wygodnie jest na początku (małego) programu włączyć tą przestrzeń poleceniem:using namespace std;
![Page 14: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/14.jpg)
Stałe, czyli zmienne ustalone
Stałe są oznaczone deklaratorem const w deklaracji:const TYP zmienna = wyrażenie;
Stałą należy zainicjalizować podczas deklaracji. Inicjalizacja stałego argumentu w funkcji następuje
podczas wywołania funkcji. Do stałej nie wolno w programie nic przypisać – jej
wartość określamy tylko podczas inicjalizacji.
![Page 15: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/15.jpg)
Stałe w porównaniu z makrodefinicjami
Dlaczego stałe są bezpieczniejsze od makrodefinicji? można określić zasięg nazwy stałej nazwa stałej jest znana kompilatorowi stała to komórka pamięci posiadająca swój adres łatwiejsza praca z debugerem
![Page 16: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/16.jpg)
Zmienne ulotne
Zmienne ulotne są oznaczone deklaratorem volatile w deklaracji:volatile TYP zmienna;
Obiekt ulotny może się zmieniać w sposób wymykający się spod kontroli kompilatora (na przykład w obliczeniach współbieżnych).
Kompilator nie optymalizuje kodu ze zmiennymi ulotnymi.
![Page 17: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/17.jpg)
Referencje
Operatory, które umożliwiają tworzenie typów złożonych: [] tablica * wskaźnik () funkcja & referencja
Referencja odnosi się do istniejącego w pamięci obiektu.
Referencję trzeba zainicjalizować. Referencja nie może zmienić obiektu, z którym
została związana w czasie inicjalizacji.
![Page 18: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/18.jpg)
Referencje Definicja referencji:
typ &ref = obiekt; Przykład referencji:
int x = 4;int &r = x;
Referencje mają zastosowanie głównie jako argumenty funkcji i jako wartości zwracane przez funkcje.
Przykład funkcji, która zamienia miejscami wartości zewnętrznych zmiennych:void zamiana (double &a, double &b){ double c = a; a = b; b = c;}
Referencje implementuje się jako stały wskaźnik.
![Page 19: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/19.jpg)
Napisy
C-string to napis umieszczony w tablicy typu char[] zakończony znakiem o kodzie 0 '\0'.
String to napis typu string przechowywany w obiekcie.
Stringi są zadeklarowane w pliku nagłówkowym <string>.
Stringi można ze sobą konkatenować za pomocą operatorów + i +=.
W przypadku stringów nie trzeba się martwić o miejsce na napis – zostanie ono automatycznie zaalokowane.
![Page 20: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/20.jpg)
Typ void
Typ void informuje nas o braku typu. Typ void jest typem fundamentalnym, jednak
nie wolno zadeklarować zmiennej typu void. Słowo void może wystąpić jako typ prosty w
deklaracji typu złożonego: void *ptr;
oznacza wskaźnik do pamięci na obiekt nieznanego typu;
void fun ();oznacza, że funkcja nie będzie zwracała żadnego wyniku.
![Page 21: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/21.jpg)
Stos i sterta
Stos to pamięć zarządzana przez program. Zmienne lokalne tworzone w instrukcji
blokowej są automatycznie usuwane przy wychodzeniu z bloku.
Sterta to pamięć, którą zarządza programista. Programista przydziela obszar pamięci dla
zmiennej operatorem new, ale musi pamiętać o zwolnieniu tej pamięci operatorem delete.
![Page 22: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/22.jpg)
Standardowe wejście i wyjście W bibliotece standardowej są zdefiniowane cztery obiekty
związane ze standardowym wejściem i wyjściem: cin standardowe wejście, cout standardowe wyjście, clog standardowe wyjście dla błędów, cerr niebuforowane standardowe wyjście dla błędów.
Do czytania ze strumienia wejściowego został zdefiniowany operator >>:cin >> zmienna;
Do pisania do strumieni wyjściowych został zdefiniowany operator <<:cout << wyrażenie;clog << wyrażenie;cerr << wyrażenie;
Operatory czytające >> ze strumienia i piszące << do strumienia można łączyć kaskadowo w dłuższe wyrażenia (wielokrotne czytanie albo pisanie).
![Page 23: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/23.jpg)
Klasy
Klasa to nowy typ danych (projekt). Obiekt to instancja klasy (realizacja projektu). Klasa posiada różne pola i metody:
wartości pól w obiekcie określają stan obiektu, metody determinują funkcjonalność obiektu.
Klasę definiuje się następująco:class klasa{ // definicje pól // deklaracje metod};
![Page 24: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/24.jpg)
Klasy
Przykład klasy:class Punkt{public: double x, y; Punkt (double a, double b); void przesun_x (double dx); void przesun_y (double dy); double odleglosc (Punkt p);};
![Page 25: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/25.jpg)
Klasy
Metody w klasie tylko deklarujemy (jak funkcje w plikach nagłówkowych).
Definicje metod umieszczamy poza klasą (definicje te są kwalifikowane nazwą kasy za pomocą operatora zakresu ::).
Przykład definicji metody poza klasą:void Punkt::przesun_x (double dx){ x += dx;}
![Page 26: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/26.jpg)
Konstruktor
Konstruktor to specjalna metoda uruchamiana tylko podczas inicjalizacji obiektu.
Konstruktor ma taką samą nazwę jak klasa. Konstruktor nie zwraca żadnego wyniku. Przykład konstruktora:Punkt::Punkt (double a, double b){ x = a, y = b;}
![Page 27: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/27.jpg)
Obiekty
Można utworzyć obiekt na stosie za pomocą zwykłej deklaracji połączonej z inicjalizacją.
Przykład obiektu automatycznego:Punkt a = Punkt(4,6);Punkt b(5,7);
Można też utworzyć obiekt na stercie za pomocą operatora new. Pamiętaj o usunięciu go operatorem delete, gdy będzie niepotrzebny.
Przykład obiektu w pamięci wolnej:Punkt *p = new Punkt(-2,-3);// …delete p;
![Page 28: C++](https://reader035.vdocuments.pub/reader035/viewer/2022070404/56813b48550346895da430d9/html5/thumbnails/28.jpg)
Składowe w obiekcie
Do składowych w obiekcie odwołujemy się za pomocą operatora dostępu do składowych (kropka . dla obiektów i referencji albo strzałka -> dla wskaźników).
Metoda jest wywoływana na rzecz konkretnego jednego obiektu.
Przykłady odwołania do składowych w obiekcie:Punkt a(17,23), b(20,19), *p = &p;double d = a.odleglosc(b);b.przesun_y(8);p->przesun_x(6);