Wykład 4 Klasa Vec, której konstruktory alokują pamięć dla obiektów 1.Przykład definicji klasy Vec 2.Definicje konstruktorów i destruktora 3.Definicja.

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 4 Wojciech Pieprzyca.
Programowanie obiektowe
1 Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile.
Metody wirtualne.
Wzorce.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Prowadzący: mgr inż. Elżbieta Majka
Static, const, volatile.
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Szablony (wzorce) Przykład 1: Szablon klasy -
Współprogramy III Ten wykład ma na celu pokazanie kolejnej ciekawej możliwości, którą oferują współprogramy. Wspólprogramy reprezentujące wyrażenia regularne.
Licznik template<class Count_Type> class Count { public:
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
Repetitio est mater studiorum
Wskaźniki. Definiowanie wskaźników Wskaźnik może wskazywać na obiekt dowolnego typu. int * w; char * Wsk_Znak; float * Wskaz_Real; Przykłady: Wskaźnik.
Tablice.
C++ wykład 2 ( ) Klasy i obiekty.
Typy prywatne 1 Typy prywatne W Adzie typy prywatne (private types) służą do bezpiecznego udostępniania danych zdefiniowanych w pakiecie, z którego korzysta.
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Podstawy programowania PP – LAB5 Wojciech Pieprzyca.
Programowanie obiektowe III rok EiT
Podstawy informatyki (4)
Podstawy informatyki 2013/2014
Wskaźnik może wskazywać na obiekt dowolnego typu. int * w; char * Wsk_Znak; float * Wskaz_Float; Przykład: Wskaźnik przechowuje adres obiektu wskazanego.
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Podstawy informatyki 2013/2014
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Kurs języka C++ – wykład 3 ( )
Kurs języka C++ – wykład 9 ( )
Kurs języka C++ – wykład 4 ( )
Modele pamięci Tiny - mikroskopijny do 64 K zmienne inicjalizowane kod programu zmienne nie inicjalizowane HEAP (sterta) obszar wolny STACK (stos) Model.
K URS JĘZYKA C++ – WYKŁAD 2 ( ) Klasy i obiekty.
Konstruktory i Destruktory. Konstruktor Konstruktor — co to? Konstruktor — co to? jest metodą służącą do inicjowania obiektów danej klasy jest metodą.
This, friend, operatory. this dostępny w każdej niestatycznej metodzie dostępny w każdej niestatycznej metodzie jest to wskaźnik do obiektu na rzecz którego.
Programowanie obiektowe
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Wykład 2 Klasa Zesp i jej hermetyzacja 1.Przykład definicji klasy Zesp 2.Zmiana definicji klasy 3.Zmienne i funkcje statyczne PO2-1 / 28.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Wykład 8 Polimorfizm 1.Funkcje polimorficzne 2.Czyste funkcje wirtualne i klasy abstrakcyjne PO8-1 / 38.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Podstawy informatyki Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki Funkcje Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki Struktury Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Kurs języka C++ – wykład 3 ( )
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Kurs języka C++ – wykład 4 ( )
Programowanie obiektowe
Przykładowy algorytm geometryczny (geometria płaska)
Dane, zmienne, instrukcje
Język C++ Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

Wykład 4 Klasa Vec, której konstruktory alokują pamięć dla obiektów 1.Przykład definicji klasy Vec 2.Definicje konstruktorów i destruktora 3.Definicja operatora przypisania 4.Definicje wybranych operatorów PO4-1 / 28

Klasa wektorów Przykład definicji klasy Vec PO4-2 / 28

Przykład klasy Propozycja budowy obiektu n Rozmiar tablicy naz Nazwa tablicy A Wskaźnik na tablicę A[0]A[1]...A[i]...A[n–1] Alokowany dla obiektu obszar pamięci na tablicę n zmiennych X Pr Zmienne wspólne wszystkim obiektom tej klasy Obiekt PO4-3 / 28

Definicja klasy class Vec { private: int n; // rozmiar tablicy char naz[8]; // tablica na nazwę do 7 znaków double *A; // wskaźnik na tablicę static int Pr; static double X; public: void Nazwa(const char*); // funkcja // konstruktory Vec(char *t=0); // konstruktor bezargumentowy Vec(double a, char *t=0); Vec(int n, double *y, char *t=0); Vec(const Vec &); // konstruktor kopiujący // destruktor ~Vec(); // destruktor... PO4-4 / 28

Definicja klasy c.d.... // przeciążone operatory Vec &operator=(const Vec&); // przypisanie Vec operator+(const Vec&)const; double operator*(const Vec&)const; Vec operator*(double)const; friend Vec operator*(double, const Vec&); double &operator[](int)const; double operator()(double)const; operator double()const; // konwerter Vec -> double friend ostream &operator<<(ostream&,const Vec&); friend istream &operator>>(istream&, Vec&); }; PO4-5 / 28

Metoda Nazwa void Vec::Nazwa(const char *p) { naz[0]='\0'; if(p) strncat(naz, p, 7); } Służy do wpisania nazwy wektora do obiektu PO4-6 / 28

Definicje konstruktorów Przykładowe konstruktory i destruktor PO4-7 / 28

Konstruktor bezparametrowy Konstruktor bezparametrowy ma postać Vec::Vec(char *t):n(0), A(0) { Nazwa(t); } W klasie Vec zadeklarowano konstruktor Klasa() { } Vec(char *t =0); Można go wywołać bez parametrów, jest on zatem konstruktorem bezparametrowym. Jego definicja poza klasą może być następująca PO4-8 / 28

Konwersja konstruktorowa Konstruktor typu Vec::Vec(double a, char *t): n(1), A(new(nothrow) double[1]) { Nazwa(t); if(A) A[0]=a; else n=0; } W klasie Vec zadeklarowano konstruktor Klasa(Typ) {...} definiuje konwersję z typu Typ do typu klasy Vec(double a, char *t=0); Można go wywołać tylko z parametrem a, definiuje on zatem konwersję z typu double do typu Vec. PO4-9 / 28

Konstruktor wieloparametrowy Vec::Vec(int n, double *y, char *t): n(n), A(new(nothrow) double[n]) { Nazwa(t); if(A) for(int i=0; i<n; i++) A[i]=y[i]; else Vec::n=0; } W klasie Vec zadeklarowano konstruktor Vec(int n, double *y, char *t=0); Tworzy on obiekt z tablicy n zmiennych typu double. PO4-10 / 28

Konstruktor kopiujący Konstruktor kopiujący może mieć postać Vec::Vec(const Vec &v): n(v.n), A(v.A?new(nothrow) double[n]:0) { Nazwa(v.naz); if(A) for(int i=0; i<n; i++) A[i]=v.A[i]; else n=0; } W klasie Vec zadeklarowano konstruktor Klasa(Klasa&) {... } Klasa(const Klasa&) {... } Vec(const Vec &); PO4-11 / 28

Domyślny konstruktor kopiujący n naz A n A VW PO4-12 / 28

Przeciążony konstruktor kopiujący n naz A n A VW PO4-13 / 28

Destruktor Destruktor może mieć postać Vec::~Vec() { delete []A; A=0; // Konieczne, aby nie było możliwości // ponownego usunięcia tej pamięci. n=0; } W klasie Vec zadeklarowano destruktor ~Vec(); Jego zadaniem jest usunąć pamięć wskazywaną przez A. ~Klasa( ) {... } PO4-14 / 28

Operator przypisania Przykład definicji operatora przypisania PO4-15 / 28

Operator przypisania Razem z konstruktorem kopiującym należy zdefiniować operator przypisania o postaci Vec &Vec::operator=(const Vec &v) { if(&v = = this) return *this; // gdy X=X; delete []A; n=v.n; A=new(nothrow) double[n]; if(A) for(int i=0; i<n; i++) A[i]=v.A[i]; else n=0; return *this; } W klasie Vec zadeklarowano operator Vec &operator=(const Vec &); Klasa &operator=(const Klasa&) {... } PO4-16 / 28

Domyślne przypisanie V=W n naz A n A VW PO4-17 / 28

Zdefiniowane przypisanie V=W n naz A n A VW PO4-18 / 28

Operatory Przykłady przeciążania wybranych operatorów PO4-19 / 28

Dodawanie wektorów - przykład PO4-20 / 28 Oś 1 Oś 2 Y X x1x1 x2x2 y1y1 y2y2 y1y1 y2y2 Y x 1 +y 1 X+Y x 2 +y 2

Dodawanie wektorów X x1x1 x2x2 x3x3... xnxn Y y1y1 y2y2 y3y3 ynyn X +Y x 1 + y 1 x 2 + y 2 x 3 + y 3... x n + y n Niech będą dane wektory X i Y o współrzędnych: X=[x 1, x 2, x 3,..., x n ], Y=[y 1, y 2, y 3,..., y n ], Suma X+Y jest wektorem o współrzędnych X+Y=[x 1 +y 1, x 2 +y 2, x 3 +y 3,..., x n +y n ]. PO4-21 / 28

Dodawanie Vec Vec::operator+(const Vec &v)const {Vec s; s.n = n >v.n ? n : v.n; s.A = new(nothrow) double[s.n]; if(s.A) {int i; for(i=0; i<n; i++) s.A[i]=A[i]; for( ; i<v.n; i++) s.A[i]=0; for(i=0; i<v.n; i++) s.A[i]+=v.A[i]; } else s.n=0; return s; } A v.A s.A PO4-22 / 28

Iloczym skalarny wektorów Niech będą dane wektory X i Y o współrzędnych: X=[x 1, x 2, x 3,..., x n ], Y=[y 1, y 2, y 3,..., y n ], Iloczyn skalarny jest liczbą o wartości = x 1 y 1 + x 2 y 2 + x 3 y x n y n. PO4-23 / 28

Iloczyn skalarny A v.A double Vec::operator*(const Vec &v)const {double s=0; int k = n <v.n ? n : v.n; for(int i=0; i<k; i++) s += v.A[i]*A[i]; return s; } Przykład double y; Vec v,w;... y = v*w; PO4-24 / 28

Mnożenie wektora przez skalar X x1x1 x2x2 x3x3... xnxn aXaX a x1a x1 a x2a x2 a x3a x3 a xna xn Niech będzie dana liczba rzeczywista a oraz wektor X o współrzędnych: X=[x 1, x 2, x 3,..., x n ]. Iloczyn aX oraz Xa jest wektorem o współrzędnych aX = Xa = [a x 1, a x 2, a x 3,..., a x n ]. PO4-25 / 28

Iloczyn przez stałą Vec Vec::operator*(double a)const {Vec v(*this); for(int i=0; i<v.n; i++) v.A[i]*=a; return v; } Vec operator*(double a, const Vec &v) {return v*a; // v.operator*(a) } Przykład 1 Vec v,w;... v = w*12.0; Przykład 2 Vec v,w;... v = 12.0*w; PO4-26 / 28

Uwagi 1 Przykład 1 Vec v,w;... v = w*12.0; Przykład 2 Vec v,w;... v = 12.0*w; PO4-27 / 28 v = w.operator*(12.0); v = operator*(12.0, w); Nie ma funkcji v = 12.0.operator*(w);

Uwagi 2 Przykład 3 Vec v,w;... v = w+12.0; Przykład 4 Vec v,w;... v = 12.0+w; PO4-28 / 28 v = w.operator+(12.0); Wyrażenie v = operator+(12.0, w); wymaga, aby obok metody operator+ istniała funkcja Vec operator+(double, const Vec&); albo w miejsce obu istniała jedna funkcja Vec operator+(const Vec&, const Vec&); Nie ma funkcji v = w.operator+(double); ale jest konwersja konstruktorowa Vec(double); v = w.operator+(Vec(12.0)); Nie ma funkcji v = 12.0.operator+(w);