Przeciążanie operatorów

Podobne dokumenty
PODSTAWY PROGRAMOWANIA

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Wstęp do programowania. Różne różności

Delphi Laboratorium 3

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie RAD Delphi

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Algorytmika i Programowanie VBA 1 - podstawy

Wstęp do programowania

typ zakres sposob zapamietania shortint integer bajty (z bitem znaku) longint byte word

Tworzenie własnych komponentów

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

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

Przeciążanie operatorów

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

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

Podstawy Programowania semestr drugi. Wykład czternasty

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

Szablony. Szablony funkcji

Podstawy Programowania 2

Planowanie eksperymentu 2 (k p) w 2 r blokach. Stanisław Jaworski, Wojciech Zieliński

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

Języki formalne i techniki translacji

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Wprowadzenie do języka Pascal

PL/SQL. Zaawansowane tematy PL/SQL

Przykład programu Rozwiązanie równania postaci:

MATERIAŁY DO ZAJĘĆ II

Zasady Programowania Strukturalnego

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Język programowania PASCAL

20. Pascal i łączenie podprogramów Pascala z programem napisanym w C

Programowanie Komputerów

Odczyt danych z klawiatury Operatory w Javie

Instrukcja standardowa Writeln

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Podstawy Kompilatorów

PODSTAWY PROGRAMOWANIA

Wstęp do programowania 2

2 Przygotował: mgr inż. Maciej Lasota

Elementy języków programowania

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Oracle PL/SQL. Paweł Rajba.

Podstawy programowania skrót z wykładów:

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

KOTLIN. Język programowania dla Androida

Język ludzki kod maszynowy

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Struktury, unie, formatowanie, wskaźniki

Ćwiczenia z wyliczania wartości funkcji

Podstawy programowania

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Część 4 życie programu

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

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

OPERACJE NA PLIKACH. Podstawowe pojęcia:

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Kiedy i czy konieczne?

1. Programowanie obiektowe. Wstęp.

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

Podstawy i języki programowania

TEMAT : KLASY DZIEDZICZENIE

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

PODSTAWY PROGRAMOWANIA

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

I - Microsoft Visual Studio C++

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Wyrażenia arytmetyczne

Kurs rozszerzony języka Python

Programowanie, część I

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

Dziedziczenie jednobazowe, poliformizm

Zmienne, stałe i operatory

Informatyka 1. Przetwarzanie tekstów

Programowanie modułowe

PODSTAWY PROGRAMOWANIA

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

PODSTAWOWE ZASADY PROGRAMOWANIA OBIEKTOWEGO NA BAZIE PAKIETU ROOT

Programowanie w języku C++

1. Operacje logiczne A B A OR B

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Wstęp do programowania 2

PASCAL. Etapy pisania programu. Analiza potrzeb i wymagań (treści zadania) Opracowanie algorytmu Kodowanie Kompilacja Testowanie Stosowanie

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Laboratorium nr 10. Temat: Funkcje cz.2.

Delphi 7 + Indy 10 Przykłady prostych aplikacji sieciowych

Transkrypt:

Przeciążanie operatorów 1. Przeciążanie operatorów - teoria W języku Delphi w ramach typów rekordowych można przeciążać pewne operatory czyli spowodować ich działanie inne niż standardowe. Poszczególne operatory mają swoje nazwy, które są odwzorowywane w odpowiednie symbole np. nazwa Substract jest odwzorowywana w symblo - (minus). W przypadku przeciążenia operatora kompilator wybiera odpowiedni sposób jego działania na podstawie kontekstu (typu wartości wyrażenia i typu parametrów użytych w wyrażeniu) Przeciążanie operatorów pozwala na dokonywanie różnych działań na obiektach klas/rekordach np. mnożenie, dzielenie, dodawania etc., tak samo jak na zmiennych i stałych. Pozwala to na uproszczenie tworzonego kodu oraz zwiększa jego przejrzystość. Np. var A, B : TMyClass; A := 20; B := A * A; Stosując powyżej operator mnożenia (*) w przypadku obiektów klas/rekordów, w rzeczywistości powodujemy wywołanie funkcji Multiply zdefiniowanej w ramach klasy/rekordu TMyClass. y, dla których dozwolone jest stosowanie przeciążeń: Nazwa a Kategoria Sygnatura deklaracyjna Oznaczenie symboliczne Implicit Konwersja Implicit(a : typ) : typ- niejawna zmiana typu Explicit Konwersja Explicit(a: typ) : typ- jawna zmiana typu Negative Negative(a: typ) : typ- - Positive Positive(a: typ): typ- + Inc Inc(a: typ) : typ- Inc Dec Dec(a: typ): typ-wyniku Dec LogicalNot LogicalNot(a: typ): typ- not

Trunc Trunc(a: typ): typ- Trunc Round Round(a: typ): typ- Round In In(a: typ; b: typ) : Boolean; in teoriomnogościowy Equal Porównanie Equal(a: typ; b: typ) : Boolean; = NotEqual Porównanie NotEqual(a: typ; b: typ): Boolean; <> GreaterThan Porównanie GreaterThan(a: typ; b: typ) Boolean; > GreaterThanOrEqual Porównanie GreaterThanOrEqual(a: typ; b: typ): >= Boolean; LessThan Porównanie LessThan(a: typ; b: typ): Boolean; < LessThanOrEqual Porównanie LessThanOrEqual(a: typ; b: typ): <= Boolean; Add Add(a: typ; b: typ): typ- + Subtract Subtract(a: typ; b: typ) : typ- - Multiply Multiply(a: typ; b: typ) : typ- * Divide Divide(a: typ; b: typ) : typ- / IntDivide IntDivide(a: typ; b: typ): typ- div Modulus Modulus(a: typ; b: typ): typ- mod LeftShift LeftShift(a: typ; b: typ): typ- shl

RightShift RightShift(a: typ; b: typ): typ- shr LogicalAnd LogicalAnd(a: typ; b: typ): typ- and LogicalOr LogicalOr(a: typ; b: typ): typ- Or LogicalXor LogicalXor(a: typ; b: typ): typ- xor BitwiseAnd BitwiseAnd(a: typ; b: typ): typ- and BitwiseOr BitwiseOr(a: typ; b: typ): typ- Or BitwiseXor BitwiseXor(a: typ; b: typ): typ- xor Deklaracja operatora przeciążonego w typie rekordowym ma postać: class operator sygnatura deklaracyjna gdzie sygnatura deklaracyjna może mieć jedną z postaci podanych w powyższej tabeli. Po definicji typu rekordowego z deklaracją operatora przeciążonego musi wystąpić deklaracja tego operatora (w tym samym programie, module lub bibliotece łączonej dynamicznie). Postać definicji operatora przeciążonego jest podobna do definicji metody, tylko, że zamiast słów procedure, function, constructor lub destructor występują słowa class operator. Definicja taka powinna określać nową funkcjonalność danego operatora. type typename = record class operator conversionop(a: type): resulttype; class operator unaryop(a: type): resulttype; class operator comparisonop(a: type; b: type): Boolean; class operator binaryop(a: type; b: type): resulttype;

Jeśli następnie zadeklarujemy zmienną (lub zmienne) danego typu rekordowego i w stosunku do tej zmiennej (lub zmiennych) posłużymy się oznaczeniem symbolicznym operatora (np. +), to zostanie wykonana operacja (może to być kilka operacji) określona w definicji. Jeśli operator zostanie zdefiniowany dla danego typu rekordowego, to zostanie on użyty tylko w przypadku, gdy w wyrażeniu co najmniej jeden z argumentów będzie tego typu rekordowego. Dla operatora jednoargumentowego zdefiniowanego w typie rekordowym albo typ argumentu, albo typ wyrażenia musi być typu rekordowego. type TMyRecord = record // Addition of two operands of type TMyRecord class operator Add(a, b: TMyRecord): TMyRecord; // Subtraction of type TMyRecord class operator Subtract(a, b: TMyRecord): TMyRecord; // Implicit conversion of an Integer to type TMyRecord class operator Implicit(a: Integer): TMyRecord; // Implicit conversion of TMyRecordto Integer class operator Implicit(a: TMyRecord): Integer; // Explicit conversion of a Double to TMyRecord class operator Explicit(a: Double): TMyRecord; // Example implementation of Add class operator TMyRecord.Add(a, b: TMyRecord): TMyRecord; //... var x, y: TMyRecord; x := 12; // Implicit conversion from an Integer y := x + x; // Calls TMyRecord.Add(a, b: TMyRecord): TMyRecord b := b + 100; // Calls TMyRecord.Add(b, TMyRecord.Implicit(100)) 2. Przykład Zdefiniujmy typ rekordowy dod_mod5 z deklaracjami operatorów przeciążonych: type dod_mod5 = record var w : Integer; class operator Add(x, y: dod_mod5):integer; class operator Implicit(x: Integer):dod_mod5;

class operator Explicit(x: dod_mod5):integer; // definicje operatorów przeciążonych muszą wystąpić po definicji typu rekordowego dod_mod5 // dodanie do pierwszego argumentu wartości drugiego argumentu modulo 5. Wynik operacji jest // typu Integer class operator dod_mod5.add(x, y: dod_mod5):integer; Result := a.w + b.w mod 5; // Oznacza niejawną konwersję wartości typu Integer na typ dod_mod5, a dokładniej przypisanie // tej wartości polu w rekordzie typu dod_mod5 class operator dod_mod5.implicit(x: Integer):dod_mod5; Result.w := a; // Określa jawną konwersję wartości typu rekordowego dod_mod5 na typ Integer i oznacza, że w // przypadku zmiany typu, czyli zastosowaniu konstrukcji Integer(x), gdzie x oznacza rekord // typu dod_mod5, odpowiednia wartość ma być pobrana z pola tego rekordu. class operator dod_mod5.explicit(x: dod_mod5):integer; Result := a.w; var x, y: dod_mod5; a, b: Integer; a := 20; b := 12; Writeln(a + b mod 5); // na ekranie pojawi się 22 x := a; // niejawna zmiana typu, równoważne x.w := a; y := b; // niejawna zmiana typu, równoważne y.w := b; Writeln(x + y); // na ekranie pojawi się 22 // wykorzystanie operatora jawnej zmiany typu z dod_mod5 na Integer Writeln(Integer(x)); // na ekranie pojawi się 20 Writeln(Integer(y)); // na ekranie pojawi się 12 end. 3. Uwagi W pakiecie Embarcadero Delphi XE2 znajduje się przykładowy program Win32Overload, w którym przedstawiono zastosowanie operatorów przeciążonych do wykonywania operacji na liczbach zespolonych. Program ten wykorzystuje moduł o

nazwie VassBotn.Vcl.Complex, w którym zdefiniowano działania na liczbach zespolonych i funkcje standardowe dla argumentów zespolonych.