Przeciążanie operatorów

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

Zaawansowane programowanie w języku C++ Przeciążanie operatorów

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

PARADYGMATY PROGRAMOWANIA Wykład 3

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

Przeciążenie operatorów

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

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

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

TEMAT : KLASY DZIEDZICZENIE

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

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

Programowanie Komputerów

Programowanie Obiektowe i C++

Język C zajęcia nr 11. Funkcje

Podstawy algorytmiki i programowania - wykład 4 C-struktury

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

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

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

Szablony funkcji i szablony klas

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

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

Zmienne, stałe i operatory

Programowanie w języku C++

Laboratorium nr 10. Temat: Funkcje cz.2.

Wykład 8: klasy cz. 4

Zadanie 2: Arytmetyka symboli

Szablony funkcji i klas (templates)

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

Język ludzki kod maszynowy

Wyjątki (exceptions)

Podstawy Programowania Obiektowego

Podstawy Programowania Obiektowego

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

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

Wykład 5: Klasy cz. 3

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Szablony klas, zastosowanie szablonów w programach

Paradygmaty programowania

Podstawy programowania w języku C i C++

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

Wstęp do programowania

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

Język C++ Programowanie obiektowe

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

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 4. Karol Tarnowski A-1 p.

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

2 Przygotował: mgr inż. Maciej Lasota

C-struktury wykład. Dorota Pylak

PARADYGMATY PROGRAMOWANIA Wykład 4

Struktury Struktura polami struct struct struct struct

Programowanie strukturalne i obiektowe. Funkcje

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

11.6 Klasa do obsługi liczb wymiernych

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

Spis treści PROGRAMOWANIE OBIEKTOWE W JĘZYKU C++: FUNKCJE ZAPRZYJAŹNIONE Z KLASĄ, PRZEŁADOWANIE OPERATORÓW. Informatyka 2

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

Języki i techniki programowania Ćwiczenia 2

Programowanie obiektowe - zadania

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

Programowanie Obiektowe i C++

Interfejsy i klasy wewnętrzne

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

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

Podstawy Programowania Obiektowego

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

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

ROZDZIAŁ 2. Operatory

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Odczyt danych z klawiatury Operatory w Javie

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

Wykład 2 Składnia języka C# (cz. 1)

C-struktury wykład. Dorota Pylak

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Zaawansowane programowanie w C++ (PCP)

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

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

Programowanie w języku C++

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

MATERIAŁY DO ZAJĘĆ II

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Podstawy i języki programowania

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Laboratorium nr 5: Mnożenie wektorów i macierzy

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Dziedziczenie. Tomasz Borzyszkowski

Języki i paradygmaty programowania

Programowanie komputerowe. Zajęcia 7

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

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

Wprowadzenie do biblioteki klas C++

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

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

Wstęp do Programowania 2

Wprowadzenie do szablonów szablony funkcji

Transkrypt:

Instrukcja laboratoryjna nr 4 Programowanie w języku C 2 (C++ poziom zaawansowany) Przeciążanie operatorów dr inż. Wilk-Jakubowski Jacek mgr inż. Lasota Maciej dr inż. Kaczmarek Tomasz

Wprowadzenie Oprócz słów kluczowych i typów, operatory stanowią podstawowy element każdego języka programowania wysokiego poziomu (Python, Haskel czy C++). Korzystając z języka programowania C++ użytkownik ma do dyspozycji typy wbudowane (int, float, unsigned, itd.), jak również może utworzyć własne typy przechowujące różne typy danych (struktury, klasy). O ile w specyfikacji standardu C++ zdefiniowano zestaw operatorów, o tyle tworzenie nowych operatorów w przeciwieństwie do nowych typów nie jest możliwe. Istnieje jednak możliwość przeciążania operatorów już istniejących dla czynności realizowanych na obiektach typu klasa, co umożliwia w razie potrzeby odmienne od typowego działanie operatorów. Operatory można zatem przeciążać, podobnie jak inne funkcje i metody języka C++. Przeciążanie operatorów (ang. operator overloading), nazywane zamiennie również przeładowaniem, pozwala nadawać operatorom nowe znaczenie, dzięki czemu mogą być one wykorzystane w odniesieniu do obiektów zdefiniowanych klas (implementacja klasy przechowującej złożony typ danych z przeciążonymi operatorami). Przeciążania operatora można dokonać na dwa sposoby. Pierwszym jest wykorzystanie niezależnej funkcji (na ogół zaprzyjaźnionej z jedną lub większą liczbą klas). Przykładowo dla operatora dwuargumentowego o nazwie przeciazenie otrzymujemy: x przeciazenie y Wyrażenie to jest tożsame z wywołaniem: operator przeciazenie (x, y). Drugi ze sposobów opiera się na użyciu funkcji składowej, co odpowiada wywołaniu: x.operator przeciazenie (y) Aby funkcja globalna posiadała dostęp do danych prywatnych klasy, funkcja operatorowa musi być zadeklarowana jako funkcja zaprzyjaźniona z klasa np.: friend nazwa_funkcji operator * (liczba_1, liczba_2 )

W tym celu konieczne jest umieszczenie prototypu funkcji w definicji klasy, który poprzedzony jest słowem kluczowym friend. Jako że do funkcji zaprzyjaźnionych nie jest przekazywany wskaźnik this, konieczne staje się przekazanie operandów w sposób jawny, co wymusza przekazanie dwóch argumentów dla funkcji operatorowej dwuargumentowej, w odróżnieniu od przeładowania za pomocą zwykłej funkcji składowej klasy. Zgodnie ze standardem C++, w sytuacji gdy operator dwuargumentowy przeładowany jest za pomocą funkcji składowej klasy, jawnie należy przekazać do niego tylko jeden argument. Drugi z argumentów przekazywany jest w sposób niejawny poprzez wskaźnik this. Operatory przeciąża się poprzez uprzednie zdefiniowanie funkcji operatorowej. Jako argumentów operatorów używa się typów zadeklarowanych zewnętrznie (class, enum, struct, union). Istnieje zasada, że obiekt, który spowodował wywołanie funkcji operatora zawsze umiejscowiony jest po lewej stronie operacji, zaś obiekt występujący po prawej stronie przekazywany jest do funkcji w postaci argumentu. W przypadku gdy operator modyfikuje operandy należy go zdefiniować jako funkcję składową klasy. Jako przykład można podać operatory: =, +=, -=, ++, itp. W innym przypadku operator powinien być zdefiniowany jako funkcja globalna lub zaprzyjaźniona. Jako przykład można podać m.in. operatory: +, -, ==. Przykładowa implementacja przeciążenia operatora mnożenia liczb ułamkowych z użyciem operatorowej funkcji składowej klasy ma postać: ulamek ulamek :: operator * (ulamek a) {ulamek wynik; wynik.licznik = licznik * a.licznik; wynik.mianownik = mianownik * a.mianownik; return wynik;}

Wykaz operatorów możliwych do przeciążenia Tab. 1. Wykaz operatorów możliwych do przeładowania

Oprócz wskazanych powyżej operatorów przeciążyć jeszcze można operator wywołania funkcji (ang. Function call): () ; operator elementu tablicy (ang. Array element): [] oraz operator przecinka (ang. Comma):,. W ten sposób, przedstawiony w instrukcji zbiór operatorów do przeciążenia jest zbiorem kompletnym. O ile każdy z wymienionych wyżej operatorów można przeciążyć (przeładować) w dowolny sposób, tak aby realizował inną operację, o tyle istnieją pewne pisane reguły mówiące o tym, że operator jednoargumentowy musi pozostać operatorem unarnym (związanym z jednym operandem), zaś operator dwuargumentowy operatorem binarnym (związanym z dwoma operandami). W praktyce nie wszystkie operatory można przeciążyć. Jako przykład można podać: operator kropki., operator zasięgu ::, operator wyłuskania wskaźnika do składowej.*, operator rozmiaru sizeof czy operator warunkowy?:. Poza tym standard C++ uniemożliwia tworzenie nowych symboli operatorów, modyfikowanie łączności i kolejności operatorów. Ponadto operator musi być zdefiniowany w taki sposób, aby co najmniej jeden członek klasy stanowił jego operand, albo też operator był członkiem klasy.

Zadania 1. Napisać program z wykorzystaniem dwóch funkcji operatora jako funkcji składowych klasy, będących odpowiednio przeciążonym operatorem dodawania i odejmowania. Program powinien umożliwić operacje dodawania i odejmowania składowych dwóch wektorów dwuwymiarowych. Jako wynik użytkownik powinien uzyskać dwa nowe wektory o współrzędnych wynikających odpowiednio z dodawania i odejmowania składowych poszczególnych wektorów. 2. Napisać program z wykorzystaniem funkcji operatora jako funkcji składowej klasy, będącej przeciążonym operatorem mnożenia. Program powinien umożliwić mnożenie dwóch dowolnych ułamków oraz zwracać ułamek będący iloczynem tych ułamków. 3. Zrealizować zadanie 2 z wykorzystaniem przeciążonego operatora mnożenia jako niezależnej operatorowej funkcji globalnej (zaprzyjaźnionej z klasą). 4. Napisać program służący do porównywania dwóch wektorów o trzech składowych (x, y, z) z wykorzystaniem mechanizmu przeciążania operatorów == oraz!=. Program powinien zrealizować przeciążenia jako funkcje składowe danej klasy. 5. Napisać analogiczny program do zadania 4 z wykorzystaniem przeciążeń jako niezależnych operatorowych funkcji globalnych (zaprzyjaźnionych z daną klasą). 6. Napisać program z wykorzystaniem operatora przypisania =, wyświetlający informacje na temat czasu (godzina, minuta, sekunda) z wykorzystaniem klasy nie posiadającej operatorowej funkcji przypisania (przypisanie danych składowych ma nastąpić z wykorzystaniem przeciążenia automatycznie wygenerowanego przez kompilator memberwise assignment). 7. Napisać analogiczny program do zadania 6 z wykorzystaniem przeciążonego operatora przypisania = (przeciążenie jako funkcja składowa danej klasy). UWAGA! Ponieważ funkcja operatorowa przypisania nie może być funkcją zaprzyjaźnioną, musi stanowić funkcję składową danej klasy.