Programowanie obiektowe w C++ Wykład 12

Podobne dokumenty
Składnia C++ Programowanie Obiektowe Mateusz Cicheński

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie 2. Język C++. Wykład 3.

Programowanie obiektowe w C++ Wykład 1

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

PARADYGMATY PROGRAMOWANIA Wykład 4

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Plik klasy. h deklaracje klas

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

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 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Wstęp do Programowania 2

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

TEMAT : KLASY POLIMORFIZM

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Programowanie obiektowe w języku

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Wstęp do Programowania 2

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Programowanie, część I

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

TEMAT : KLASY DZIEDZICZENIE

Programowanie, część I

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie Obiektowe i C++

Język C++ wykład VIII

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Programowanie 2. Język C++. Wykład 9.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Konstruktor kopiujacy

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Dziedziczenie. Ogólna postać dziedziczenia klas:

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wprowadzenie do programowanie obiektowego w języku C++

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

dr inż. Jarosław Forenc

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Mechanizm dziedziczenia

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe i C++ dla matematyków

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Podstawy Programowania Obiektowego

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Dziedziczenie jednobazowe, poliformizm

Techniki Programowania wskaźniki

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

PARADYGMATY PROGRAMOWANIA Wykład 2

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Zaawansowane programowanie w języku C++ Klasy w C++

Techniki Programowania wskaźniki 2

Projektowanie klas c.d. Projektowanie klas przykład

Język C++ zajęcia nr 2

Materiały do zajęć VII

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Nowoczesny C++ Rafał Wasilewski 1

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Wykład 5: Klasy cz. 3

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Abstrakcyjny typ danych

Obsługa wyjątków. Język C++ WW12

Programowanie obiektowe w C++ Wykład 03 Temat wiodący: Konstruktory i deskruktory. Konstruktory i Destruktory

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Rzutowanie i konwersje

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Wyliczanie wyrażenia obiekty tymczasowe

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wstęp do programowania. Dariusz Wardecki, wyk. X

Szablony funkcji i szablony klas

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Szablony klas, zastosowanie szablonów w programach

Transkrypt:

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) cout << x << ", "; double tab[5] {1.12,2.23,3.33,4.12,5.22 for(double &x: tab) x = x * 2; vector<int> A(5); for(auto &a: A) a = rand()%26; for(auto a: A) cout << a << ", "; L. Stępień (AJD) 2 / 22

Klasyczna referencja Klasyczna referencja (referencja do l-wartości) jest wyrażeniem reprezentującym dane, dla których da się ustalić adres w pamięci. int n; int *pn = new int; const int b = 123; int &rn = n; const int &rb = b; int &rpn = *pn; Pierwotne znaczenie l-wartości wiąże się z możliwością występowania po lewej stronie operatora przypisania. Wyjątkiem jest klasa wyrażeń związana z modyfikatorem const, które nie mogą występować po lewej stronie operatora przypisania, ale są adresowalne i są l-wartościami. L. Stępień (AJD) 3 / 22

Referencje r-wartościowe C + +11 wprowadza referencję r-wartościową (oznaczoną symbolem &&). Można je wiązać z r-wartościami,tzn. litarałami stałych (poza literałem napisowym), wyrażeniami w rodzaju x + y, czy funkcjami zwracającymi wartości, ale nie zwracającymi referencji. int x = 10; int y = 20; int && r1 = 13; int && r2 = x + y; int && r3 = sqrt(4.0); UWAGI: r2 - związana jest z obliczoną wartością wyrażenia x + y w momencie tworzenia referencji. Późniejsze zmiany x i y nie zmieniają wartości r2. Związanie r-wartości w referencji r-wartościowej oznacza przechowanie tej wartości w miejscu, dla którego da się określić adres. L. Stępień (AJD) 4 / 22

Przykład 1 # include<iostream> using namespace std; inline int F(char z) {return (int) z; int main(){ int x = 10; int y = 20; int && r1 = 13; int && r2 = x + y; int && r3 = sqrt(4.0); int && r4 = F( a ); cout << "wartosc: " << r1 << " adres: " << &r1 << endl; cout << "wartosc: " << r2 << " adres: " << &r2 << endl; cout << "wartosc: " << r3 << " adres: " << &r3 << endl; cout << "wartosc: " << r4 << " adres: " << &r4 << endl; L. Stępień (AJD) 5 / 22

Semantyka przeniesienia (ang. move semantics) vector<string> str; // Tworzymy wektor 20000 łańcuchów, każdy po 1000 znaków. vector<string> str_copy(str); vector<string> upper(const vector<string> &vs) { vector<string> temp;... return temp; vector<string> str2(upper(str)); L. Stępień (AJD) 6 / 22

Przykład 2 class X{ private: int n; char *s; static int ile; void Pokaz() const; public: X(); explicit X(int); X(int, char); X(const X&); X(X&&); ~X(); X operator+(const X&) const; void Wypisz() const; ; L. Stępień (AJD) 7 / 22

int X::ile = 0; X::X() { ++ile; n = 0; s = nullptr; cout << "Konstruktor domyslny: " << ile << endl; Pokaz(); X::X(int n) : n(n) { ++ile; cout << Konstruktor (int): " << ile << endl; s = new char[n]; Pokaz(); L. Stępień (AJD) 8 / 22

X::X(int n, char z) : n(n) { ++ile; cout << "Konstruktor (int, char): " << ile << endl; s = new char[n]; for(int i=0; i < n; ++i) s[i] = z; Pokaz(); X::~X(){ cout << "Destruktor: " << --ile <<endl; cout << "Usunieto obiekt" << endl; Pokaz(); delete []s; s = nullptr; L. Stępień (AJD) 9 / 22

X::X(const X &ob) : n(ob.n) { ++ile; cout << "Konstruktor (const X&): " << ile << endl; s = new char[n]; for(int i=0; i < n; ++i) s[i] = ob.s[i]; Pokaz(); X::X(X && ob) : n(ob.n) { ++ile; cout << "Konstruktor (X&&): " << ile << endl; s = ob.s; // przechwycenie adresu ob.s = nullptr; ob.n = 0; Pokaz(); L. Stępień (AJD) 10 / 22

X X::operator+(const X& ob){ X temp = X(n+ob.n); for(int i = 0; i < n; ++i) temp[i] = s[i]; for(int i = n, j=0; i < temp.n; ++i) temp[i] = ob.s[j]; return temp; void X::Pokaz() const{ cout << "n = " << n; cout << ", adres 0-wego el: " << (void*) s << endl; void Wypisz() const{ if(n == 0)cout << "Pusty obiekt" << endl; else for(int i = 0; i < n; ++i)cout << s[i] << ", "; cout <<endl; L. Stępień (AJD) 11 / 22

int main(){ X jeden(10, x ); X dwa = jeden; X trzy(20, a ); X cztery(jeden + trzy); cout << "1: " ; jeden.wypisz(); cout << "2: " ; dwa.wypisz(); cout << "3: " ; trzy.wypisz(); cout << "4: " ; cztery.wypisz(); L. Stępień (AJD) 12 / 22

Wnioski Stosowanie referencji r-wartościowych umożliwia semantykę przeniesienia, ale jeszcze jej nie gwarantuje. X dwa = jeden; X cztery(jeden + trzy); Ponieważ wartością wyrazenia jeden + trzy jest r-wartość, może być argumentem konstruktora przenoszącego tworzacego obiekt cztery. Zatem w klasie musi być zdefiniowany konstruktor przenoszący. Obiekty inicjalizowane l-wartościami są inicjalizowane za pośrednictwem konstruktora kopiującego. Obiekty inicjalizowane r-wartościami są inicjalizowane za pośrednictwem konstruktora przenoszącego. L. Stępień (AJD) 13 / 22

Operator przypisania X& X::operator=(const X& ob) { if (this == &ob) return *this; delete []s; n = ob.n; s = new char[n]; for(int i = 0; i < n; ++i) s[i] = ob.s[i]; return *this; X& X::operator=(X&& ob) { if (this == &ob) return *this; delete []s; n = ob.n; s = ob.s; ob.n = 0; ob.s = nullptr; return *this; L. Stępień (AJD) 14 / 22

Metody domyślne C++11 daje programiście możliwość wymuszenia na kompilatorze syntezy pewnych metod specjalnych (konstruktor domyślny, konstruktor kopiujący, operator przypisania, destruktor, konstruktor przenoszący, przenoszący operator przypisania) poprzez jawne zadeklarowanie tych metod jako wersji domyślnych. class X{ public: X(X&&); X() = default; X(const X &) = default; X& operator=(const X &) = default; ; L. Stępień (AJD) 15 / 22

Metody usunięte C++11 daje programiście możliwość wymuszenia na kompilatorze zablokowania (usuwania) dowolnej metody w tym metod specjalnych. Próba wywołania metody zablokowanej, spowoduje błąd kompilacji. class X{ public: X(X&&); X() = default; X(const X &) = delete; X& operator=(const X &) = delete; X(X&&) = default; X& operator=(x&&) = default; ; L. Stępień (AJD) 16 / 22

Delegowanie konstruktorów C++11 pozwala na użycie istniejącego konstruktora jako elementu składowego definicji innego konstruktora - jest to mechanizm zwany delegowaniem. Do zapisu wykorzystuje się wariantu składni listy inicjalizacyjnej konstruktora, np. class X{ int a; double b; string s; public: X(); X(int); X(int, double); X(int, double, string); ; L. Stępień (AJD) 17 / 22

Delegowanie konstruktorów X::X(int a, double b, string s) : a(a), b(b), c(c) { X::X() : X(0, 0.1, "Ala"){ X::X(int a) : X(a, 0.1, "Ala"){ X::X(int a, double b) : X(a, b, "Ala"){ L. Stępień (AJD) 18 / 22

Dziedziczenie konstruktorów Klasa pochodna może wciągnąć do swojego zasięgu wszystkie konstruktory klasy bazowej poza konstruktorem domyślnym, konstruktorem kopiującym i konstruktorem przenoszącym. Konstruktory klasy bazowej o prototypie identycznym z konstruktorami klasy pochodnej nie będą wykorzystywane. class Baza{ int a; double b; public: Baza(): a(0), b(0) { Baza(int k) : a(k), b(0) { Baza(double b) : a(-1), b(b) { Baza(int k, double b) : a(a), b(b) { void Wypisz() const {cout << a << ", " << b << endl; ; L. Stępień (AJD) 19 / 22

Dziedziczenie konstruktorów class Pochodna{ short c; public: using Baza::Baza; Pochodna() : c(10){ Pochodna(double x) : Baza(2*x), c((int)x){ Pochodna(int a): j(-1), Baza(a, 0.5*a){ void Wypisz() const { cout << j << ", "; Baza::Wypisz(); ; int main(){ Pochodna o1; Pochodna o2(2.12); Pochodna o3(3,1.14); L. Stępień (AJD) 20 / 22

Zarządzanie metodami wirtualnymi: final Specyfikator final blokuje wywołania wirtualne danej metody w kolejnych klasach pochodnych. Uniemożliwia to zmianę definicji metody z klasy bazowej w klasach pochodnych. virtual void F(char c) const final { cout << c << endl; L. Stępień (AJD) 21 / 22