Programowanie obiektowe C++
|
|
- Julian Madej
- 8 lat temu
- Przeglądów:
Transkrypt
1 Programowanie obiektowe C++ Programowanie zorientowane obiektowo Wykład 4 Witold Dyrka witold.dyrka@pwr.wroc.pl 29/10/2012
2 Prawa autorskie itp. Dzisiejszy wykładu powstał głównie w oparciu o slajdy Bjarne Stroustrupa do kursu Foundations of Engineering II (C++) prowadzonego w Texas A&M University
3 Program wykładów 1. Wprowadzenie. Obsługa błędów. Klasy (8/10) 2. Abstrakcja i enkapsulacja: klasy i struktury. (15/10) 3. Polimorfizm: przeładowanie funkcji i operatorów. Konwersje (22/10) 4. Zarządzanie pamięcią: konstruktor, destruktor, przypisanie (29/10) 5. Dziedziczenie. Polimorfizm dynamiczny (5/11) 6. Programowanie uogólnione: szablony (12/11)
4 Materiały Literatura Bjarne Stroustrup. Programowanie: Teoria i praktyka z wykorzystaniem C++. Helion (2010) Jerzy Grębosz. Symfonia C++ standard. Edition 2000 (2008) Dowolny podręcznik programowania zorientowanego obiektowo w języku C++ w standardzie ISO 98
5 Plan na dziś Zarządzanie pamięcią w klasie na przykładzie vector-a Pamięć wolna i jej wyciekanie Kopiowanie obiektów Konstruktor kopiujący Operator przypisania Zarządzanie zasobami przez zakres Gwarancje bezpieczeństwa wyjątków
6 Przyjrzymy się implementacji vector-a vector jest najbardziej użytecznym kontenerem STL prosty zwarty sposób przechowywania elementów danego typu efektywny dostęp do elementów przechowywanie dowolnej (zmiennej) liczby elementów opcjonalnie sprawdzanie zakresu vector jest domyślnym kontenerem języka C++ stosuj go zawsze (np. do przechowywania tablicy) chyba, że masz dobry powód by wybrać coś innego
7 vector a pisanie kodu od podstaw Sprzęt zapewnia pamięć i adresowanie tzw. niski poziom brak typów danych, fragmenty pamięci o stałym rozmiarze żadnego sprawdzania, ale tak szybko jak architektura pozwala Twórca aplikacji potrzebuje czegoś takiego jak vector operacje wysokiego poziomu kontrola typów i zmienny rozmiar pamięci sprawdzanie zakresu w czasie działania prawie optymalna szybkość
8 vector a pisanie kodu od podstaw (2) Tam, blisko sprzętu, życie jest proste i brutalne musisz zaprogramować wszystko sam nie pomoże Ci kontrola typów błędy w czasie działania poznaje się po tym, że dane uległy uszkodzeniu lub program się wysypał O nie, chcemy się wyrwać stamtąd tak szybko jak się da chcemy być produktywni i pisać niezawodne programy chcemy używać języka odpowiedniego dla ludzi Dlatego używamy wektorów itp. ale chcemy też poznać techniki tworzenia nowych klas służących do pracy ze strukturami danych
9 Po co przyglądać się implementacji vector-a? Ilustracja kilku ważnych koncepcji: Wolna pamięć (sterta) Kopiowanie obiektów Dynamicznie rosnące struktury danych Demonstracja technik: bezpośredniego zarządzania pamięcią porządnego projektowania i kodowania klas
10 Projektujemy typ vector (1) Założenia reprezentuje pojęcie tablicy jednowymiarowej może przechowywać dowolną i zmienną liczbę elementów typu double zapewnia inicjowanie elementów oraz dostęp do nich v: 5 elementy v: v[0] v[1] v[2] v[3] v[4]
11 Projektujemy typ vector (2) Założenia reprezentuje pojęcie tablicy jednowymiarowej może przechowywać dowolną i zmienną liczbę elementów typu double zapewnia inicjowanie elementów oraz dostęp do nich Gdzie przechowywać tablicę dowolnego, tzn. nieustalonego w czasie kompilacji, rozmiaru? w pamięci wolnej
12 Pamięć komputera tak jak widzi ją program: Statyczna alokacja pamięci Dynamiczna alokacja pamięci Kod programu Pamięć statyczna Pamięć wolna (sterta, ang. heap) Stos (ang. stack) zmienne statyczne, zmienne globalne nienazwane obiekty - alokowane dynamicznie zmienne automatyczne - tzn. zadeklarowane lokalnie, parametry funkcji
13 Pamięć wolna Do tworzenie obiektu (alokacja) w pamięci wolnej służy operator new który zwraca wskaźnik do zaalokownego fragmentu pamięci np. int* p = new int; // alokuje pamięć na 1 liczbę całkowitą // int* oznacza wskaźnik do int int* q = new int[7]; double* pd = new double[n]; // alokuje pamięć na 7 liczb całkowitych // tj. tablicę siedmiu int-ów // alokuje pamięć na n liczb rzeczywist. operator new nie inicjalizuje obiektów p: q:
14 Dostęp do obiektów w pamięci wolnej p1: p2:??? 5 Do odczytania wartośći obiektu w pamięci wolnej służy operator *, czyli operator dereferencji (wyłuskania), np. int* p1 = new int; // alokuje nowego niezainicjowanego int-a int* p2 = new int(5); // alokuje nowego int-a i inicjuje go wartością 5 int x = *p2; // odczytuje wartość wskazywaną przez p2 (x wynosi 5) int y = *p1; // wynik niezdefiniowany, lepiej tego nie robić
15 Dostęp do tablic w pamięci wolnej p3: 7 9 Do odczytania wartośći obiektu w pamięci wolnej służą operator dostępu [ ] oraz operator wyłuskania *, np. int* p3 = new int[5]; // alokuje 5 niezainicjowanych int-ów p3[0] = 7; p3[1] = 9; int x2 = p3[0]; int x3 = p3[1]; // zapis 1-go elementu p3 // odczyt 1-go elementu p3 // odczyt 2-go elementu p3
16 Dostęp do tablic w pamięci wolnej p3: 7 9 Do odczytania wartośći obiektu w pamięci wolnej służą operator dostępu [ ] oraz operator wyłuskania *, np. int* p3 = new int[5]; // alokuje 5 niezainicjowanych int-ów *p3 = 7; // zapis 1-go elementu p3 *(p3+1) = 9; int x2 = *p3; // odczyt 1-go elementu p3 int x3 = *(p3+1);// odczyt 2-go elementu p3
17 Fir0002/Flagstaffotos Wskaźniki Wskaźniki są adresami pamięci można je traktować jak pewne wartości całkowite pierwszy bajt pamięci ma adres 0, kolejny 1 itd p2 *p2 2^ Wskaźnik wskazuje obiekt określonego typu (np. int *p3) typ wskaźnika definiuje sposób korzystania z pamięci na którą wskazuje typ wskaźnika pozwala określić adres kolejnego elementu w pamięci, np. *(p3+1) (==p3[1]), w zależności ile pamięci zajmuje element wskaźnik nie wie na ile elementów wskazuje!
18 Fir0002/Flagstaffotos Wskaźniki Wskaźniki są adresami pamięci można je traktować jak pewne wartości całkowite pierwszy bajt pamięci ma adres 0, kolejny 1 itd p2 *p2 2^ Wartości wskaźników można wyświetlić (ale rzadko się to przydaje) char c1 = 'c'; char* p1 = &c1; int* p2 = new int(7); // wskaźnik do obiektu na stosie // wskaźnik do obiektu w pamięci wolnej cout << "p1==" << p1 << " *p1==" << *p1 << "\n"; // p1==??? *p1=='c' cout << "p2==" << p2 << " *p2==" << *p2 << "\n"; // p2==??? *p2=7
19 Wskaźnik a referencja czy znasz różnicę?
20 Dealokacja Obiekty w pamięci wolnej dealokuje operator delete delete (dla pojedynczych obiektów) i delete[ ] (dla tablic) zwalnia pamięć zaalokowaną przez new int* pi = new int; char* pc = new char('a'); // inicjacja domyślna (nieokreślona dla int) // inicjacja jawna double* pd = new double[10]; // alokacja tablicy (niezainicjowanej ) delete pi; delete pc; delete[ ] pd; // dealokuje pojedyńczy obiekt // dealokuje pojedyńczy obiekt // dealokuje tablicę Dealokacja wskaźnika o adresie 0 (czyli null) niczego nie robi char* p = 0; delete p; // nieszkodliwe
21 Po co stosować pamięć wolną? Aby tworzyć obiekty o zmiennym rozmiarze (np. wektor, kolejka, drzewo...) Aby tworzyć obiekty, które będą żyły dłużej niż zakres w którym są tworzone, np. double* make(int n) { return new double[n]; // alokuje n int-ów
22 Problem wycieków pamięci double* calc(int result_size, int max) { double* p = new double[max]; // alokuj max obiektów double, tzn. zajmij // przestrzeń na max double-i w pamięci wolnej // oraz zapisz wskaźnik do pamięci w p double* result = new double[result_size]; // analogicznie dla result // użyj p do policzenia wyników, które zostaną umieszczone w pamięci // wskazywanej przez result return result; double* r = calc(200,100); // ups! Zapomnieliśmy oddać pamięć zaalokowaną // dla p z powrotem na stertę Niby nic się nie stało, program zrobił swoje... A jednak brak dealokacji (czyli wyciek pamięci) może być powodem poważnych kłopotów w prawdziwym programie szczególnie gdy program działa bardzo długo i wycieki się zbierają
23 Problem wycieków pamięci (2) double* calc(int result_size, int max) { double* p = new double[max]; // alokuj max obiektów double, tzn. zajmij // przestrzeń na max double-i w pamięci wolnej // oraz zapisz wskaźnik do pamięci w p double* result = new double[result_size]; // analogicznie dla result // użyj p do policzenia wyników, które zostaną umieszczone w pamięci // wskazywanej przez result delete[ ] p; return result; double* r = calc(200,100); // korzystamy z r... delete[ ] r; // dealokuje (zwalnia pamięć) // oddaje ją z powrotem na stertę // ups! Zapomnieliśmy oddać pamięć zaalokowaną // dla p z powrotem na stertę // łatwe do zapomnienia
24 Wycieki pamięci Jeszcze jeden pomysł na wyciek pamięci pierwsza wartość void f() p: { double* p = new double[27]; // p = new double[42]; // delete[] p; druga wartość // pierwsza tablica (27 liczb double) wyciekła... Stroustrup/PPP Oct'11 24
25 O wyciekach pamięci Program, który chodzi w nieskończoność, nie może sobie pozwolić na żaden wyciek, np. system operacyjny Jeśli z funkcji wycieka 8 bajtów z każdym wywołaniem po wywołań stracimy 1 megabajt Cała pamięć jest zwracana systemowi operacyjnemu po zakończeniu programu (w Windowsie, Linuksie itp.) Dlatego często wycieki przechodzą niezauważone ale w określonych okolicznościach mogą być bardzo groźne Gdy piszemy funkcję lub klasę nie wiemy, kto i w jaki sposób będzie z niej korzystał dlatego musimy zawsze pilnować wycieków pamięci
26 Wskaźniki, tablice i vector Uwaga Używając wskaźników i tablic dotykasz sprzętu przy minimalnym wsparciu języka Stąd przy korzystaniu z nich łatwo o poważny i trudny do znalezienia błąd Należy z nich korzystać tylko wtedy kiedy naprawdę są potrzebne vector jest jednym ze rozwiązań by zachowując prawie całą elastyczność i wydajność tablic skorzystać z większego wsparcia języka (czytaj: mniej błędów, szybsze odrobaczanie)
27 Projektujemy vector Założenia reprezentuje pojęcie tablicy jednowymiarowej może przechowywać dowolną i zmienną liczbę elementów typu double zapewnia inicjowanie elementów oraz dostęp do nich // bardzo uproszczony vector liczb rzeczywistych typu double (por. vector<double>): class vector { int sz; // liczba elementów ( rozmiar, ang. size) double* elem; // wskaźnik na pierwszy element public: vector(int s); ; // konstruktor: alokuj s elementów, // niech elem wskazuje na nie // zapisz s w sz int size() const { return sz; // zwróć bieżący rozmiar
28 Konstruktor vector-a // bardzo uproszczony vector liczb rzeczywistych typu double (por. vector<double>): class vector { int sz; // liczba elementów ( rozmiar, ang. size) double* elem; // wskaźnik na pierwszy element public: vector(int s); ; // konstruktor: alokuj s elementów, // niech elem wskazuje na nie // zapisz s w sz int size() const { return sz; // zwróć bieżący rozmiar vector::vector(int s) // konstruktor wektora :sz(s), // zapisuje rozmiar s w sz elem(new double[s]) // alokuje s liczb typu double w wolnej pamięci // zapisuje wskaźnik na te double w elem { // Operator new alokuje pamięć wolną i zwraca wskaźnik do zaalokowanej pamięci. // Uwaga: new nie inicjuje elementów (prawdziwy standardowy wektor inicjuje)
29 Konstruktor vector-a // bardzo uproszczony vector liczb rzeczywistych typu double (por. vector<double>): class vector { int sz; // liczba elementów ( rozmiar, ang. size) double* elem; // wskaźnik na pierwszy element public: vector(int s); ; // konstruktor: alokuj s elementów, // niech elem wskazuje na nie // zapisz s w sz int size() const { return sz; // zwróć bieżący rozmiar vector::vector(int s) { // konstruktor wektora sz = s; // zapisuje rozmiar s w sz elem = new double[s];// alokuje s liczb typu double w wolnej pamięci // zapisuje wskaźnik na te double w elem // Operator new alokuje pamięć wolną i zwraca wskaźnik do zaalokowanej pamięci. // Uwaga: new nie inicjuje elementów (prawdziwy standardowy wektor inicjuje)
30 void f(int x) { vector v(x); // używaj v // zdefiniuj vector v // (który alokuje x double-i na stercie) // oddaj pamięć zaalokowaną przez v z powrotem na stertę // ale jak? (zmienna elem vector'a jest składową prywatną) STOS v sz = x elem STERTA sz...
31 void f(int x) { vector v(x); // używaj v // zdefiniuj vector v // (który alokuje x double-i na stercie) // oddaj pamięć zaalokowaną przez v z powrotem na stertę // ale jak? (zmienna elem vector'a jest składową prywatną) STOS v sz elem STERTA sz...
32 void f(int x) { vector v(x); // używaj v // zdefiniuj vector v // (który alokuje x double-i na stercie) // oddaj pamięć zaalokowaną przez v z powrotem na stertę // ale jak? (zmienna elem vector'a jest składową prywatną) STOS v sz elem STERTA sz...
33 Problem: wyciek pamięci void f(int x) { vector v(x); // używaj v // zdefiniuj vector v // (który alokuje x double-i na stercie) // oddaj pamięć zaalokowaną przez v z powrotem na stertę // ale jak? (zmienna elem vector'a jest składową prywatną) STERTA sz...!
34 Destruktor vector-a // bardzo uproszczony vector liczb rzeczywistych typu double class vector { int sz; // rozmiar double* elem; // wskaźnik na tablicę elementów public: vector(int s) // konstruktor: alokuj/zajmuje pamięć :sz(s), elem(new double[s]) { ~vector() // destruktor: dealokuje/zwalnia pamięć { delete[ ] elem; //... ; To jest przykład ogólnej i ważnej techniki konstruktor zajmuje zasoby destruktor zwalnia je Przykłady zasobów: pamięć, pliki, blokady, wątki, gniazda
35 Unikanie wycieków pamięci przy użyciu vectora void f(int x) { vector v(x); // zdefiniuj vector v // (który alokuje x double-ów na stercie) // używaj v... // pamięć alokowana przez v jest niejawnie czyszczona przez destruktor vectora STOS v sz elem STERTA sz...
36 Unikanie wycieków pamięci przy użyciu vectora void f(int x) { vector v(x); Podejście z delete wygląda brzydko i rozwlekle jak uniknąć zapomnienia delete[ ] p? doświadczenie uczy, że zapomina się często Lepiej, gdy delete jest w destruktorze // zdefiniuj vector v // (który alokuje x double-ów na stercie) // używaj v... // pamięć alokowana przez v jest niejawnie czyszczona przez destruktor vectora void f(int x) { double* p = new double[x]; // alokuj x double-ów // używaj p... delete[ ] p; // dealokacja tablicy wskazywanej przez p
37 Kopiowanie void f(int n) { vector v(n); vector v2 = v; vector v3; v3 = v; // // definiuje vector // co dzieje się tutaj? // a co byśmy chcieli żeby się działo? // co dzieje się tutaj? // a co byśmy chcieli żeby się działo? Idealnie: v2 i v3 powinny stać się kopiami v (czyli chcemy aby operator = wykonywał kopię) A cała pamięć powinna zostać zwrócona na stertę w chwili opuszczenia f() Tak działa vector w bibliotece standardowej a jak działa nasz wciąż zbyt uproszczony wektor?
38 Domyślna inicjacja kopii jest naiwna void f(int n) { vector v1(n); vector v2 = v1; v1: 3 // inicjacja: // domyślnie kopiowane są składowe klasy // czyli kopiowane są sz i elem STOS STERTA v2: 3 Kiedy wyjdziemy z funkcji f() czeka nas katastrofa! - elementy wektora v1 są dwukrotnie usuwane przez destruktor
39 Musimy wykonać kopię elementów: tworzymy konstruktor kopiujący class vector { int sz; double* elem; public: vector(const vector&) ; // ; // konstruktor kopiujący klasy vector vector::vector(const vector& a) :sz(a.sz), elem(new double[a.sz]) // alokuje przestrzeń na elementy wektora, potem inicjuje je przez kopiowanie { for (int i = 0; i<sz; ++i) elem[i] = a.elem[i];
40 void f(int n) { vector v1(n); vector v2 = v1; Kopiowanie z użyciem konstruktora kopiującego // kopiowanie z użyciem konstruktora kopiującego // pętla for kopiuje każdą wartość v1 do v2 STOS STERTA v1: 3 v2: 3 Destruktor poprawnie usuwa wszystkie elementy
41 Domyślny operator przypisania jest naiwny void f(int n) { vector v1(n); vector v2(4); v2 = v1; // przypisanie : // domyślnie podmieniane są składowe klasy // czyli podmieniane są sz i elem STOS STERTA v1: 3 v2: 4 3 potem najpierw Kiedy wyjdziemy z funkcji f() czeka nas katastrofa! - elementy wektora v1 są dwukrotnie usuwane przez destruktor - oryginalne elementy wektora v2 nie są w ogóle usuwane
42 Operator przypisania koncepcja class vector { int sz; double* elem; public: vector& operator=(const vector& a); // ; a: 3 x=a; x: 4 3 najpierw // operator przypisania potem Wyciek pamięci? (nie) Operator = musi kopiować elementy a do x Stroustrup/Programming Apr'10 42
43 Operator przypisania implementacja vector& vector::operator=(const vector& a) // podobny do konstruktora kopiującego, ale musi coś zrobić ze starymi elementami // wykonuje kopię a, potem zamienia bieżący sz i elem z tymi z a { double* p = new double[a.sz]; // alokuje nową przestrzeń for (int i = 0; i<a.sz; ++i) p[i] = a.elem[i]; // kopiuje elementy delete[ ] elem; // dealokuje starą przestrzeń sz = a.sz; // ustawia nowy rozmiar elem = p; // ustawia nowe elementy return *this; a: x:
44 Operator przypisania implementacja vector& vector::operator=(const vector& a) // podobny do konstruktora kopiującego, ale musi coś zrobić ze starymi elementami // wykonuje kopię a, potem zamienia bieżący sz i elem z tymi z a { double* p = new double[a.sz]; // alokuje nową przestrzeń for (int i = 0; i<a.sz; ++i) p[i] = a.elem[i]; // kopiuje elementy delete[ ] elem; // dealokuje starą przestrzeń sz = a.sz; // ustawia nowy rozmiar elem = p; // ustawia nowe elementy return *this; Na marginesie zwracamy referencję do lewej strony przypisania umożliwia sekwencję przypisań, jak dla typów wbudowanych, np. int a, b, c, d, e; a = b = c = d = e = 153; // Interpretowane jako: a = (b = (c = (d = (e = 153))));
45 Kopiowanie przez przypisanie void f(int n) { vector v1(n); vector v2(4); v2 = v1; // przypisanie a: x: 4 3 najpierw potem Usunięte przez operator= Nie ma wycieku pamięci
46 Terminologia kopiowania Płytka kopia (ang. shallow copy): kopiuje tylko wskaźnik, w efekcie dwa wskaźniki odnoszą się do tego samego obiektu tak działa kopiowanie wskaźników i referencji Głęboka kopia (ang. deep copy) kopiuje to na co wskazuje wskaźnik i przestawia wskaźnik, w efekcie dwa wskaźniki odnoszą się do dwóch osobnych obiektów tak działa kopiowanie vector-ów, string-ów itp. Wymaga konstruktora kopiującego i operatora przypisania x: 0x008f kopia x: 0x008f x: 0x008f x: 0x009b kopia STERTA: 0x008f: 5 0x008f: 5 0x009b: 5 Płytka kopia Głęboka kopia
47 Sprawdzanie zakresu // prawie prawdziwy fragment implementacji vectora: struct out_of_range { /* */ ; class vector { // double& operator[ ](int n); double& at(int n); // ; // operator dostępu // funkcja dostępu ze sprawdzaniem zakresu double& vector::operator[ ](int n) { // nie sprawdza zakresu, więc trochę szybsze return elem[n]; // tam gdzie liczy się optymalna wydajność // np. urządzenia czasu rzeczywistego // nie stosujemy obsługi wyjątków double& vector::at(int n) { // średnio 3% gorsza wydajność if (n<0 sz<=n) throw out_of_range(); return elem[n];
48 Obsługa wyjątków (prymitywna) // czasami zapewnienie porządku po błędzie wymaga trochę pracy void fill_vec(vector& v, int n); vector* some_function() // tworzy wypełniony vector { vector* p = new vector; // alokuje na stercie // ktoś musi dealokować try { fill_vec(*p,10); // return p; // wypełnianie poszło dobrze, zwracamy pełny wektor catch ( ) { // coś poszło źle: delete p; // robimy lokalny porządek throw; // ponownie zgłaszamy wyjątek, aby funkcja wywołująca // mogła dokończyć rozwiązywanie problemu
49 Obsługa wyjątków (prostsza i bardziej czytelna) // Kiedy używamy zmiennych w zakresie, porządek jest robiony automatycznie void fill_vec(vector& v, int n); vector some_other_function() // tworzy wypełniony vector { vector v; // uwaga: vector obsługuje dealokację elementów fill_vec(v,10); // użycie v return v; Wniosek: jeśli czujesz, że potrzebujesz bloku try-block: pomyśl być może możesz sobie poradzić (lepiej) bez tego
50 Zarządzanie zasobami przez zakres czyli zajęcie zasobów jest inicjacją vector zajmuje pamięć na elementy w swoim konstruktorze zarządza nią (zmiana rozmiaru, kontrola dostępu itp.) zwalnia pamięć w destruktorze To przypadek szczególny ogólnej strategii zarządzania pamięcią zwanej RAII, czyli Resource Acquisition Is Initialization zwanej także zarządzaniem zasobami przez zakres używaj je zawsze, gdy to możliwe prostsze i oszczędniejsze niż cokolwiek innego świetnie współpracuje z obsługą błędów przez wyjątki
51 Sprytny wskaźnik unique_ptr (C++11) // Kiedy używamy zmiennych w zakresie, porządek jest robiony automatycznie #include <memory> void fill_vec(vector& v, int n) ; vector* another_other_function() { // tworzy wypełniony vector std::unique_ptr<vector> p(new vector); // umieszcza wektor na stercie // tworzy do niego sprytny wskaźnik fill_vec(*p,10); // użycie p return p.release(); // zwraca zwykły wskaźnik do wektora // jednak jeśli operator new, funkcja fill_vec // lub cokolwiek innego zgłosi wyjątek, // to sprytny wskaźnik zostanie usunięty z pamięci // razem z wektorem Sprytny wskaźnik to klasa symulująca zwykły wskaźnik m.in. poprzez przeładowanie operatorów -> oraz * plus dodatkowa funkcjonalność, np. odśmiecanie albo kontrola zakresów możesz pisać swoje własne sprytne wskaźniki
52 Dalej oglądamy vector Zasadniczy problem chcemy by wektor zmieniał rozmiar, gdy zmieniamy liczbę elementów ale w pamięci komputera wszystko musi mieć określony rozmiar jak stworzyć iluzję, że rozmiar się zmienia? Mając vector v(n); // v.size()==n możemy zmienić jego rozmiar na trzy sposoby: v.resize(10); // v ma teraz 10 elementów v.push_back(7); v = v2; // dodaje element o wartości 7 na koniec v // v.sz zwiększa się o 1 // v jest teraz kopią v2 // v.size() jest teraz równe v2.size()
53 Obserwacja: Reprezentacja wektora jeśli zmieniasz rozmiar (resize() lub push_back()) raz, zapewne zrobisz to powtórnie przygotujmy się na to rezerwując trochę wolnej przestrzeni na przyszłość class vector { int sz; double* elem; int space; public: // ; // liczba elementów plus wolna przestrzeń // (czyli liczba komórek na nowe elementy) sz elem space 0 sz-1: elementy (zainicjowane) space-1: wolna przestrzeń (niezainicjowane)
54 Zacznijmy od rezerwacji pamięci Zauważ: rezerwacja nie zmienia rozmiaru wektora ani wartości jego elementów definicja funkcji reserve() gwarantuje, że w razie wystąpienia wyjątku (operator new) stan obiektu pozostanie niezmieniony i nie wycieknie żadna pamięć. Jest to tzw. silna gwarancja void vector::reserve(int newalloc) // tworzy wektor który ma przestrzeń na newalloc elementów { if (newalloc<=space) return; // nigdy nie zmniejsza alokacji double* p = new double[newalloc]; // alokuje nową przestrzeń for (int i=0; i<sz; ++i) p[i]=elem[i]; // kopiuje elementy delete[ ] elem; // de-alokuje starą przestrzeń elem = p; space = newalloc;
55 Teraz zmiana rozmiaru jest prosta reserve() zajmuje się alokacją przestrzeni resize() zajmuje się wartościami elementów Znów otrzymujemy silną gwarancję bezpieczeństwa wyjątków void vector::resize(int newsize) // tworzy wektor, który ma newsize elementów // inicjuje każdy nowy element domyślną wartością 0.0 { reserve(newsize); // upewnia się, że mamy dość przestrzeni for(int i = sz; i<newsize; ++i) elem[i] = 0.0; // inicjuje nowe elementy sz = newsize;
56 Dodawanie na koniec też jest proste reserve() zajmuje się alokacją przestrzeni push_back() tylko dodaj jedną wartość Znów otrzymujemy silną gwarancję bezpieczeństwa wyjątków void vector::push_back(double d) // zwiększa rozmiar wektora o 1 // inicjuje nowy element wartością d { if (sz==0) // wektor pusty: zaalokuj trochę przestrzeni reserve(8); else if (sz==space) // brakuje przestrzeni: zaalokuj trochę więcej reserve(2*space); elem[sz] = d; // dodaj d na koniec ++sz; // i zwiększ rozmiar
57 resize() and push_back() class vector { // an almost real vector of doubles int sz; // the size double* elem; // a pointer to the elements int space; // size+free_space public: vector() : sz(0), elem(0), space(0) { // default constructor explicit vector(int s) :sz(s), elem(new double[s]), space(s) { // constructor vector(const vector&); // copy constructor vector& operator=(const vector&); // copy assignment ~vector() { delete[ ] elem; // destructor double& operator[ ](int n) { return elem[n]; // access: return reference int size() const { return sz; // current size void resize(int newsize); // grow (or shrink) void push_back(double d); // add element void reserve(int newalloc); // get more space int capacity() const { return space; // current available space ; Stroustrup/Programming Apr'10 57
58 Operator przypisania Stosujemy ogólną technikę kopiuj i zamień Mamy silną gwarancję bezpieczeństwa wyjątków vector& vector::operator=(const vector& a) // podobny do konstruktora kopiującego, ale musi coś zrobić ze starymi elementami // wykonuje kopię a, potem zamienia bieżący sz i elem z tymi z a { double* p = new double[a.sz]; // alokuje nową przestrzeń for (int i = 0; i<a.sz; ++i) p[i] = a.elem[i]; // kopiuje elementy delete[ ] elem; // dealokuje starą przestrzeń sz = a.sz; // ustawia nowy rozmiar space = a.sz; // ustawia nową pojemność elem = p; // ustawia nowe elementy return *this;
59 Operator przypisania zoptymalizowany Jeśli dość miejsca na przypisywany wektor nie trzeba alokować nowej pamięci Tracimy jednak silną gwarancję bezpieczeństwa wyjątków wyjątek w trakcie kopiowania spowoduje, że stan obiektu będzie pośredni między początkowym a docelowym ale będzie poprawny, nie nastąpi też wyciek pamięci (tzw. podstawowa gwarancja) vector& vector::operator=(const vector& a) { if (this==&a) return *this; // czy nie ma autoprzypisania if (a.sz<=space) { // dość miejsca, nie trzeba alokować for (int i = 0; i<a.sz; ++i) elem[i] = a.elem[i]; // kopiuje elementy space += sz-a.sz; // zwiększa licznik wolnej przestrzeni sz = a.sz; // ustawia nowy rozmiar return *this; double* p = new double[a.sz]; // alokuje nową przestrzeń for (int i = 0; i<a.sz; ++i) p[i] = a.elem[i]; // kopiuje elementy delete[ ] elem; // dealokuje starą przestrzeń sz = a.sz; // ustawia nowy rozmiar space = a.sz; // nową pojemność elem = p; // nowe elementy return *this;
60 Dziś najważniejsze było... Unikamy bezpośredniej pracy z pamięcią wolną Kopia płytka i głęboka a obiekty z dynamicznie alokowaną pamięcią Technika zarządzania zasobami przez zakres (RAII) Dla zaawansowanych Gwarancje bezpieczeństwa wyjątków więcej: lub:
61 Gdzie żyją obiekty Sprawdź czy rozumiesz! vector glob(10); vector* some_fct(int n) { vector v(n); vector* p = new vector(n); // return p; // vector globalny żyje zawsze // vector lokalny żyje do końca zakresu // vector na stercie żyje aż nie usunięty przez delete void f() { vector* pp = some_fct(17); // delete pp; // dealokacja vectora w wolnej pamięci, zaalokowanego przez some_fct() łatwo zapomnieć usunąć obiekt zaalokowany w pamięci wolnej unikaj new/delete jeśli możesz
62 Dziedziczenie A za 2 tygodnie...
63 vector<double> v = { 1, 2, 3.456, ; template<class E> class vector { public: vector (std::initializer_list<e> s) // initializer-list constructor { reserve(s.size()); // get the right amount of space uninitialized_copy(s.begin(), s.end(), elem); // initialize elements (in elem[0:s.size())) sz = s.size(); // set vector size Listy inicjacyjne C++11 Dla ciekawych ; //... as before vector<double> v1(7); v1 = 9; vector<double> v2 = 9; // ok: v1 has 7 elements // error: no conversion from int to vector // error: no conversion from int to vector vector<double> v1{7; // ok: v1 has 1 element (with its value 7) v1 = {9; // ok v1 now has 1 element (with its value 9) vector<double> v2 = {9; // ok: v2 has 1 element (with its value 9) int x0 {7.3; int x1 = {7.3; // error: narrowing // error: narrowing; the = is optional double d = 7; int x2{d; char x3{7; vector<int> vi = { 1, 2.3, 4, 5.6 ; // error: narrowing (double to int) // ok: even though 7 is an int, this is not narrowing // error: double to int narrowing
Programowanie obiektowe C++
Programowanie obiektowe C++ Programowanie zorientowane obiektowo Wykład 3 Witold Dyrka witold.dyrka@pwr.wroc.pl 21/11/2011 Prawa autorskie itp. Wiele slajdów do tego wykładu powstało w oparciu o: slajdy
Języki programowania
Języki programowania Nowoczesne techniki programowania Wykład 6 Witold Dyrka witold.dyrka@pwr.wroc.pl 11/01/2012 Prawa autorskie Slajdy do dzisiejszego wykładu powstały w oparciu o: C++ Language Tutorial
Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula
Programowanie i struktury danych Wykład 4 Dr Piotr ybula Typ wska ź nikowy int* pointer; //wskaźnik do zmiennych typu int pozwala na dostęp do dowolnego miejsca pamięci (zmienne
2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne
Tematyka wykładów 1. Wprowadzenie. Klasy cz. 1 - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
Programowanie obiektowe C++
Programowanie obiektowe C++ Programowanie zorientowane obiektowo Wykład 6 Witold Dyrka witold.dyrka@pwr.wroc.pl 12/11/2012 Prawa autorskie itp. Wiele slajdów do tego wykładu powstało w oparciu o slajdy
Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:
Program przedmiotu Programowanie Obiektowe (język C++) Wykład 1. Definiowanie prostych klas. Przykłady. Przypomnienie: typy referencyjne, domyślne wartości argumentów, przeciąŝanie funkcji. Konstruktory,
Wykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:
Program przedmiotu Programowanie (język C++) Wykład 1. Język C a C++. Definiowanie prostych klas. Typy referencyjne. Domyślne wartości argumentów. PrzeciąŜanie funkcji. Konstruktory, destruktory. Definiowanie
Programowanie obiektowe C++
Programowanie obiektowe C++ Programowanie zorientowane obiektowo Wykład 5 Witold Dyrka witold.dyrka@pwr.wroc.pl 19/12/2011 Prawa autorskie itp. Wiele slajdów do tego wykładu powstało w oparciu o slajdy
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie
Podstawy programowania obiektowego
Podstawy programowania obiektowego Technologie internetowe Wykład 5 Program wykładu Podejście obiektowe kontra strukturalne do tworzenie programu Pojęcie klasy i obiektu Składowe klasy: pola i metody Tworzenie
Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:
Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie
Szablony klas, zastosowanie szablonów w programach
Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do
Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).
Zarządzanie pamięcią Pamięć: stos i sterta Statyczny i dynamiczny przydział pamięci Funkcje ANSI C do zarządzania pamięcią Przykłady: Dynamiczna tablica jednowymiarowa Dynamiczna tablica dwuwymiarowa 154
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 12 Katarzyna Grzelak 28 maja 2018 K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27 Klasy cd K.Grzelak (Wykład 12) Programowanie w C++ 2 / 27 Klasy - powtórzenie Klasy typy definiowane
DYNAMICZNE PRZYDZIELANIE PAMIECI
DYNAMICZNE PRZYDZIELANIE PAMIECI Pamięć komputera, dostępna dla programu, dzieli się na cztery obszary: kod programu, dane statyczne ( np. stałe i zmienne globalne programu), dane automatyczne zmienne
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.
Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice
Wykład 5: Klasy cz. 3
Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu
Programowanie obiektowe i C++ dla matematyków
Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 22 XI 2011 Uwaga! Ponieważ już sobie powiedzieliśmy np. o wskaźnikach i referencjach, przez które nie chcemy przegrzebywać
Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30
Programowanie w C++ Wykład 11 Katarzyna Grzelak 13 maja 2019 K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30 Klasy cd K.Grzelak (Wykład 11) Programowanie w C++ 2 / 30 Klasy - powtórzenie Klasy typy definiowane
Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43
Programowanie w C++ Wykład 6 Katarzyna Grzelak 1 kwietnia 2019 K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43 Pojęcia z poprzednich wykładów Tablica to ciag obiektów tego samego typu, zajmujacy ciagły
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)
Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.) Kontenery - - wektor vector - - lista list - - kolejka queue - - stos stack Kontener asocjacyjny map 2016-01-08 Bazy danych-1 W5 1 Kontenery W programowaniu
Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 14 Katarzyna Grzelak 3 czerwca 2019 K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27 Na ostatnim wykładzie: Konstruktor standardowy (domyślny) to taki, który nie ma żadnych argumentów
Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt
Programowanie obiektowe Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt Operator new, new[] Operator new oraz new[] służy do rezerwacji obszarów z zapasie pamięci
PARADYGMATY PROGRAMOWANIA Wykład 3
PARADYGMATY PROGRAMOWANIA Wykład 3 Definiowanie operatorów i ich przeciążanie Przykłady zastosowania operatorów: a) operator podstawienia ( = ) obiektów o złożonej strukturze, b) operatory działania na
Wykład 3 Składnia języka C# (cz. 2)
Wizualne systemy programowania Wykład 3 Składnia języka C# (cz. 2) 1 dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD Wizualne systemy programowania Metody 2 Metody W C# nie jest
Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory
Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile Semafory 1 Klasa string Przetwarzanie tekstów jest powszechną dziedziną zastosowań komputerów W języku
Programowanie w języku C++
Programowanie w języku C++ Część siódma Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi
Wykład 1: Wskaźniki i zmienne dynamiczne
Programowanie obiektowe Wykład 1: Wskaźniki i zmienne dynamiczne 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD Podstawy programowania w C++ Wskaźniki 2 dr Artur Bartoszewski - Programowanie
Zaawansowane programowanie w języku C++ Klasy w C++
Zaawansowane programowanie w języku C++ Klasy w C++ Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka bez ograniczeń
Programowanie, część I
11 marca 2010 Kontakt Wstęp Informacje organizacyjne Materiał na ćwiczenia Plan wykładu http://www.fuw.edu.pl/~rwys/prog rwys@fuw.edu.pl tel. 22 55 32 263 Materiał na ćwiczenia Informacje organizacyjne
Programowanie 2. Język C++. Wykład 3.
3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane
> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki
> C++ dynamiczna alokacja/rezerwacja/przydział pamięci Dane: Iwona Polak iwona.polak@us.edu.pl Uniwersytet Śląski Instytut Informatyki 1429536600 > Dzisiejsze zajęcia sponsorują słówka: new oraz delete
C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :
Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;
Podstawy programowania w języku C++
Podstawy programowania w języku C++ Część ósma Zmienne wskaźnikowe koncepcja, podstawowe zastosowania Wersja skrócona, tylko C++ Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski
Operator przypisania. Jest czym innym niż konstruktor kopiujący!
Operator przypisania Jest czym innym niż konstruktor kopiujący! Domyślnie jest zdefiniowany jako przypisanie składowa po składowej (zatem niekoniecznie bajt po bajcie). Dla klasy X definiuje się jako X&
Programowanie obiektowe w C++ Wykład 12
Programowanie obiektowe w C++ Wykład 12 dr Lidia Stępień Akademia im. Jana Długosza w Częstochowie L. Stępień (AJD) 1 / 22 Zakresowe pętle for double tab[5] {1.12,2.23,3.33,4.12,5.22 for(double x: tab)
Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np
Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami
TEMAT : KLASY DZIEDZICZENIE
TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą
Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21
Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Przydzielanie pamięci Poniżej przedstawiono w C++ dwie klasy obrazujące sposób rezerwacji pamięci. class Osoba char imie[30];
Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40
Programowanie w C++ Wykład 6 Katarzyna Grzelak kwiecień 2019 K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40 STL - powtórzenie STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki:
Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31
Programowanie w C++ Wykład 8 Katarzyna Grzelak 7 maja 2018 K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31 STL - powtórzenie STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki:
PARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
Język C++ wykład VIII
Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie,
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),
Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których
Programowanie Obiektowe i C++
Programowanie Obiektowe i C++ Marcin Benke Instytut Informatyki UW 6.11.2006 Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 1 / 138 Operator przypisania Jest czym innym niż konstruktor kopiujacy!
Zaawansowane programowanie w C++ (PCP)
Wykład 9 - powtórzenie. 11 maja 2007 Powtórzenie materiału obiekty automatyczne, statyczne, tymczasowe, dynamiczne dziedziczenie, agregacja polimorfizm, funkcje wirtualne wzorce projektowe (strukturalne,
Stos liczb całkowitych
Stos liczb całkowitych class StosInt int* tab; unsigned size ; StosInt(unsigned s=10) tab=new int[size=s];top=0; ~StosInt()delete[] tab; void push(int i)tab[top++]=i; int pop(void) return tab[--top]; int
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY
Inicjalizacja obiektu KONSTRUKTORY Inicjalizacja Przyczyną wielu błędów w programach jest nieprawidłowe zainicjalizowanie zmiennych na początku działania programu. Obiekt zawiera z reguły szereg pól ich
Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki
Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Konwersje liczba napis Ćwiczenia 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12,
Programowanie i struktury danych
Programowanie i struktury danych 1 / 30 STL Standard Template Library, STL (ang. = Standardowa Biblioteka Wzorców) biblioteka C++ zawierająca szablony (wzorce), które umożliwiają wielokrotne użycie. Główne
Konstruktor kopiujacy
Konstruktor kopiujacy Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony
Języki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU
Inicjalizacja agregatowa zmiennej tablicowej int a[5] = 1,2,3,4,5 INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU Struktury są również agregatami, dlatego: struct X double f; char c; X x1 = 1, 2.2, 'c' Ale
Programowanie obiektowe C++
Programowanie obiektowe C++ Programowanie zorientowane obiektowo Wykład 5 Witold Dyrka witold.dyrka@pwr.wroc.pl 5/11/2012 Prawa autorskie itp. Niektóre slajdy do tego wykładu powstało w oparciu o: książkę
Dziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
Obsługa wyjątków. Język C++ WW12
Obsługa wyjątków Pozwala zarządzać błędami wykonania w uporządkowany sposób. Umożliwia automatyczne wywołanie części kodu, funkcji, metod klas, który trzeba wykonać przy powstaniu błędów. try //blok try
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
Podstawy programowania komputerów
Podstawy programowania komputerów Wykład 10: Sterowanie pamięcią w C Pamięć na stosie!każdy program napisany w języku C ma dostęp do dwóch obszarów pamięci - stosu i sterty, w których może być przechowywana
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:
Prawa dostępu do składowych klasy PRAWA PRZYJACIÓŁ KLASY 91 Dostęp z zewnątrz: double limit; ; water_temp T; T.limit = 100; Dostęp z wewnątrz: double set_temp(double nt) { if (nt0) ; water_temp
Zaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki int getmax (int a, int b) { return (a > b? a : b); float getmax (float a, float b) { return (a > b? a : b); long getmax (long a, long b)
Programowanie obiektowe C++
Programowanie obiektowe C++ Programowanie zorientowane obiektowo Wykład 1 Witold Dyrka witold.dyrka@pwr.wroc.pl 10/10/2011 Prawa autorskie itp. Wiele slajdów do tego wykładu powstało w oparciu o: slajdy
Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje
Podstawy informatyki Informatyka stosowana - studia niestacjonarne - Zajęcia nr 4 Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w
PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec
PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane
Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 5 Katarzyna Grzelak 16 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27 Pojęcia z poprzednich wykładów Tablica to ciag obiektów tego samego typu, zajmujacy ciagły
Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40
Programowanie w C++ Wykład 7 Katarzyna Grzelak 23 kwietnia 2018 K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40 Standard Template Library (STL) K.Grzelak (Wykład 7) Programowanie w C++ 2 / 40 C++ Templates
Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki
Typy wyliczeniowe Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Typy wyliczeniowe Służą do łatwiejszej kontroli nad stałymi Ustawianie parametrów o ściśle określonym zbiorze wartości
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki zaprojektowany jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych jest to język pozwalający na programowanie zarówno proceduralne
// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.
Wykład 10 Przykłady różnych funkcji (cd) - przetwarzanie tablicy tablic (tablicy "dwuwymiarowej") - sortowanie przez "selekcję" Dynamiczna alokacja pamięci 1 // Liczy srednie w wierszach i kolumnach tablicy
Szablon klasy std::vector
Szablon klasy std::vector Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat
Programowanie obiektowe
Programowanie obiektowe Wykład 2 Marcin Młotkowski 4 marca 2015 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 47 Krótki opis C Obiektowy, z kontrolą typów; automatyczne odśmiecanie;
Języki programowania
Języki programowania Nowoczesne techniki programowania Wykład 3 Witold Dyrka witold.dyrka@pwr.wroc.pl 19/10/2012 Kolokwium I termin piątek, 30/11/2012 (w terminie wykładu) II termin środa, 5/12/2012, godz.
Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska
Bogdan Kreczmer bogdan.kreczmer@pwr.edu.pl Katedra Cybernetyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2018 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania
Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:
Laboratorium nr 9 Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium: wskaźniki referencje zastosowanie wskaźników wobec tablic dynamiczny przydział pamięci,
Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++
Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++ Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
Szablony funkcji i klas (templates)
Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp
C++ Przeładowanie operatorów i wzorce w klasach
C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje
Wskaźniki. Informatyka
Materiały Wskaźniki Informatyka Wskaźnik z punktu widzenia programisty jest grupą komórek pamięci (rozmiar wskaźnika zależy od architektury procesora, najczęściej są to dwa lub cztery bajty ), które mogą
Wyjątki (exceptions)
Instrukcja laboratoryjna nr 6 Programowanie w języku C 2 (C++ poziom zaawansowany) Wyjątki (exceptions) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp Wyjątki (ang.
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33
Programowanie w C++ Wykład 8 Katarzyna Grzelak 15 kwietnia 2019 K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe