PARADYGMATY PROGRAMOWANIA Wykład 3



Podobne dokumenty
Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie:

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

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

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

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

Przeciążanie operatorów

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Przeciążenie operatorów

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

PARADYGMATY PROGRAMOWANIA Wykład 2

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

Wstęp do Programowania 2

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

TEMAT : KLASY DZIEDZICZENIE

Konstruktor kopiujacy

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

Wyliczanie wyrażenia obiekty tymczasowe

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

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

Programowanie obiektowe i C++ dla matematyków

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

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

Programowanie Obiektowe i C++

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

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

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

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

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

Wstęp do Programowania 2

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

Programowanie w języku C++

Podstawy Programowania

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

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

Operatory na rzecz typu TString

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

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

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

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

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

Programowanie obiektowe w C++ Wykład 12

C++ Przeładowanie operatorów i wzorce w klasach

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.

Projektowanie klas c.d. Projektowanie klas przykład

dr inż. Jarosław Forenc

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 obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie, część I

Szablony klas, zastosowanie szablonów w programach

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

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

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

Wykład 8: klasy cz. 4

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

Programowanie Obiektowe i C++

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

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

Podstawy Programowania Obiektowego

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

ŁAŃCUCHY W JĘZYKU C/C++

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

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

Plik klasy. h deklaracje klas

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

ALGORYTMY I STRUKTURY DANYCH

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

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

Szablon klasy std::list

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.

Referencje do zmiennych i obiektów

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Definiowanie własnych klas

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

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)

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Wykład :37 PP2_W9

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

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

Podstawy Programowania Obiektowego

TEMAT : KLASY POLIMORFIZM

Podstawy programowania obiektowego

KLASY cz4. Dorota Pylak. destruktory składowe statyczne przeciążanie operatorów. wskaźniki

dr inż. Jarosław Forenc

Zaawansowane programowanie w C++ (PCP)

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Zwracanie obiektu. Funkcja może zwracać obiekty: #include"stdafx.h #include <iostream> using namespace std; class samp { inti; public:

Język C++ zajęcia nr 2

Część 4 życie programu

Programowanie w języku C++

Programowanie obiektowe

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

Podstawy Programowania Obiektowego

Transkrypt:

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 łańcuchach: + konkatenacja - wycięcie z łańcucha podanego innego łańcucha, ^ powtórzenie łańcucha zadaną ilość razy, ==, <=, >= <>... - relacje porządku leksykograficznego dat, c) operatory do operacji na macierzach + dodawanie macierzy * mnożenie macierzy ^ mnożenie macierzy określoną ilość razy przez siebie d) operacje na datach: + dodawanie liczby do daty - odejmowanie liczby od daty - wynik: nowa data - odejmowanie dat - wynik: liczba dni dzieląca daty ==, <=, >= <>... - relacje pomiędzy datami e) operacje na zbiorach: + dodawanie zbiorów, - odejmowanie zbiorów (operator dwuragumentowy) - dopełnianie zbioru (operator jednoargumentowy) * wyliczanie części wspólnej ==, <=, >= <>... - relacje pomiędzy zbiorami Ponieważ do zdefiniowania nowych operatorów używamy tych samych symboli już zdefiniowanych na poziomie języka (predefiniowanych) to mówimy o przeciążaniu operatorów. Dlaczego istnieje potrzeba przedefiniowywania operatora podstawienia: class String

String( char *_stg ); ~String() private: char *stg; int length; String::String( char *_stg ) len = strlen( _stg ); stg = new char[ len + 1 ]; strcpy( stg, _stg ); ~String() delete [] stg;... String s1("ala ma kota"); String s2("to kot Ali");... s2 = s1; //??? - co z zaalokowaną pamięcią w s2... //??? - jak wykonuje się destruktor Operatory a metody wykonywane na obiektach obiekt_1 operator obiekt_2 => obiekt_3 obiekty mogą być dowolnych typów - niekoniecznie takich samych obiekt_2 lub obiekt_3 może być typu prostego (np. int, BOOL, float, double char) każdemu operatorowi odpowiada funkcja wykonująca odpowiednią operację, zapis w postaci infiksowej lub prefiksowej jest równoważny - zwykliśmy jednak stosować zapis infiksowy, np: (a * (b + 10) + 15) / (b + 6) jest równoważny div( add( mul( a, add( b, 10 )), 15 ), add( b, 6 )) Operatory podlegające przeciążaniu + - * / % ^ & ~! = < > += -= *= /= %= ^= &=

!= << >> <<= >>= == = <= >= && ++ -- ->*, -> [] new delete Zasady przeciążania: nie można zmieniać liczby operandów operatora, priorytety operatorów oraz zasady ich łączności nie podlegają zmianie, nie można modyfikować znaczenia operatorów wobec typów predefiniowanych języka( int, float, char...) Składnia deklaracji i definicji operatorów przeciążanych <typ wyniku operacji> operator <symbol_operatora> ( <specyfikacja_parametru> ); Przykład: class String String( char *_stg ); String& operator=( const String& _stg ) private: char *str; int length; String& String::operator= (const String &_stg ) if (this == &_stg) if ( _stg.length > length ) delete [] str; length = _stg.length; str = new char [length + 1]; strcpy( str, _stg.str); String& String::operator= ( char *_stg ) if (this->str == &_stg) if ( strlen( _stg) > length )

delete [] str; length = strlen( _stg); str = new char [length + 1]; strcpy( str, _stg ); Przeciążony operator przypisania a konstruktor kopiujący: konstruktor kopiujący - automatycznie tworzony konstruktor o prototypie X (const X&) gdzie: X - identyfikator klasy Wołany przy: Inicjalizacji innym obiektem tej samej klasy, przekazaniu obiektu do funkcji przez wartość, zwracaniu przez funkcję obiektu. Różnice pomiędzy operatorem przypisania a konstruktorem kopiującym: nie ma potrzeby zwalniania składowych obiektu do którego następuje przypisanie, nie ma potrzeby zabezpieczania się przed kopiowaniem na samego siebie, nie ma potrzeby zwracania referencji na obiekty docelowy. String::String( const String& _stg ) length = _stg.length; str = new char[ length + 1]; strcpy( str, _stg.str ); String::String( char *_stg ) length = strlen( _stg); str = new char[ length + 1]; strcpy( str, _stg ); Przykłady implementacji operatorów łańcuchowych: bool String::operator==( const String& _stg ) return ( strcmp( str, _stg.str ) == 0 );

bool String::operator!=( const String& _stg ) return (strcmp( str, _stg.str )!= 0); char& String::operator[]( int index ) if ((index >= 0) && (index < lengtgh)) return str[ index ]; else return str[0]; #if 0 String& String::operator+=( const String& _stg )... //??? #endif String String::operator+( const String& _stg )... //??? String& operator+=( String& left, const String &right ) String tymcz; tymcz = left; tymcz = tymcz + right; left = tymcz; return left; String operator+( const String& left, const String &right ) String tymcz; tymcz = left; tymcz += right; return tymcz;

Przykłady użycia: String s1, s2, s3; s1 = "Jan"; // s1 = String( Jan ); s2 = "Anna"; s2 += "Kowalska"; s3 = s1 + s2; if (s2!= s1) s3 = (s2 + " ") + "Nowak"; s3 = "Nowak" + s2; // BŁĄD; s3 = String("Nowak") + s2; // OK Przykład - realizacja operacji na wektorach: wektor.h: class Wektor protected: int liczba; int *pocz; Wektor(int); Wektor(const Wektor &x); ~Wektor(); int Podaj(int); void Wpisz(int, int); void Mnoz(int); void Dodaj(Wektor); ; class WektorR : public Wektor private: int przekroczenie; WektorR(int); int & operator [] (int i); void Sprawdz(); WektorR & operator += (WektorR); WektorR & operator *= (int); WektorR & operator = (WektorR &); WektorR & operator -(); WektorR & operator -= (WektorR); int operator == (WektorR &); WektorR & operator ++ ();

; WektorR & operator -- (); wektor.cpp: #include "wektor.h" Wektor::Wektor(int n) pocz = new int[liczba = n]; pocz[i] = 0; Wektor::Wektor(const Wektor &x) pocz = new int[liczba = x.liczba]; pocz[i] = x.pocz[i]; Wektor::~Wektor() delete [liczba] pocz; int Wektor::Podaj(int k) if ((k < liczba) && (k >= 0)) return pocz[k]; else return pocz[0]; void Wektor::Wpisz(int x, int k) if (k < liczba && k >= 0) pocz[k] = x; void Wektor::Dodaj(Wektor b) int i; for (i=0; i<liczba; i++) pocz[i] += b.pocz[i]; void Wektor::Mnoz(int k)

for (int i=0; i< liczba; i++) pocz[i] = pocz[i]*k; WektorR::WektorR(int n):wektor(n) przekroczenie = 0; int WektorR::Sprawdz() return (przekroczenie); int & WektorR::operator [] (int i) if ( i<0 ) i = 0; przekroczenie = 1; if ( i>=liczba) i = liczba-1; przekroczenie = 1; return pocz[i]; WektorR & WektorR::operator += (WektorR b) int i; if (liczba <= b.liczba) for (i=0; i<liczba; i++) pocz[i] += b.pocz[i]; void WektorR::operator *= (int k) for (int i=0; i< liczba; i++) pocz[i] = pocz[i]*k; WektorR & WektorR::operator = (WektorR &b) if (this!= &b) if (liczba!= b.liczba) delete [liczba] pocz; pocz = new int[liczba = b.liczba];

pocz[i] = b.pocz[i]; WektorR & WektorR::operator -() pocz[i] = -pocz[i]; WektorR & WektorR::operator -= (WektorR b) pocz[i] -= b.pocz[i]; int WektorR:: operator == (WektorR &b) int i; if (liczba!= b.liczba) return 0; else for (i=0; i<liczba; i++) if (pocz[i]!= b.pocz[i]) return 0; return 1; WektorR & WektorR:: operator ++ () pocz[i]++; WektorR & WektorR:: operator -- () pocz[i]--; mian()

WektorR a, b, c; a[5] = 10; x = a[5]; a = ++b; a += b; b = -a; a = (b = c); a = b = c; Przeciążanie operatorów poza klasami: void operator += (Wektor &a, Wektor &b) for (int i=0; i < a.liczba; i++) a.pocz[i] += b.pocz[i]; Stosujemy gdy lewy operand nie jest obiektem klasy. W pozostałych przypadkach zaleca się stosowanie operatora jako metody Operator () Przykład: Jako jedyny pozwala przekazać większą niż dwa liczbę argumentów (NIEMOŻLIWE np. Z WYKORZYSTANIEM OPERATORA [] ) class Tablica protected: int m; // liczba wierszy int n; // liczba kolumn int *pocz; Tablica(int, int); ~Tablica(); int & operator() (int ind_w, int ind_k); ; Tablica::Tablica(int liczbaw, int liczbak) m = liczbaw; n = liczbak;

pocz = new int[m*n]; for (int i = 0; i < m*n; i++) pocz[i] = 0; Tablica::~Tablica() delete [m*n] pocz; int & Tablica::operator() (int i, int j) if ( i< 0 i >= m) i = 0; if (j < 0 j >= n) j = 0; return pocz[i * n + j]; void main(void) Tablica t(10, 10); t(0,0) = 10; t(5,7) = 100; Funkcje i klasy zaprzyjaźnione Stosujemy gdy funkcja nie będąca metodą danej klasy powinna mieć dostęp do jej składowych prywatnych lub chronionych. Informację o zaprzyjaźnieniu umieszczamy na początku deklaracji klasy, do której dostęp otwieramy: Udostępnienie danych pojedynczej funkcji: friend <typ funkcji> <ident.funkcji> ( <parametry> ) Udostępnienie danych funkcji przeciążającej operator: friend <typ wyniku> operator <symbol operatora> ( <parametry> ) Udostępnienie danych pojedynczej metodzie innej klasy friend <typ metody> <ident.klasy>::<ident.metody> ( <parametry> ) Udostępnienie danych całej innej klasie X: friend class X;

Przykład - porównywanie zawartości wektorów i tablic: class Tabl3; class Wekt3 friend void Sprawdz(const Wekt3 &, const Tabl3 &); private: int w[3]; Wekt3(); void Wczytaj(); void Drukuj(); ; class Tabl3 friend void Sprawdz(const Wekt3 &, const Tabl3 &); private: int t[3][3]; Tabl3(); void Wczytaj(); void Drukuj(); ; void Sprawdz(const Wekt3 & x, const Tabl3 & y) int i, j, ident; for (i=0; i<3; i++) ident = 1; for (j=0; j<3; j++) if (x.w[j]!= y.t[i][j]) ident = 0; if (ident == 1) cout << "Wiersz " << i << " jest identyczny" << endl;