Referencje do zmiennych i obiektów

Podobne dokumenty
Pola i metody statyczne

Wyliczanie wyrażenia obiekty tymczasowe

Wartości domyślne, przeciażenia funkcji

Wartości domyślne, przeciażenia funkcji

Szablon klasy std::vector

Obiekty i metody stałe

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Przesłanianie nazw, przestrzenie nazw

Konstruktor kopiujacy

Szablon klasy std::list

Lista dwukierunkowa - przykład implementacji destruktorów

Operacje wejścia/wyjścia (odsłona druga) - pliki

Rzutowanie i konwersje

Operacje wejścia/wyjścia odsłona pierwsza

Klasa, metody, rozwijanie w linii

Klasa, metody, rozwijanie w linii

Szablony funkcji i szablony klas

Geneza powstania języka C++

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

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Geneza powstania języka C++

Style programowania - krótki przeglad

Język C++ zajęcia nr 2

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Języki i techniki programowania Ćwiczenia 2

Wprowadzenie do szablonów klas

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

Style programowania - krótki przeglad

TEMAT : KLASY DZIEDZICZENIE

Lab 9 Podstawy Programowania

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Wykład 8: klasy cz. 4

Podejście obiektowe - podstawowe pojęcia

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

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

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

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

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

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

W dowolnym momencie można zmienić typ wskaźnika.

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

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie, część I

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie Obiektowe i C++

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

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

Podstawy Programowania Obiektowego

DYNAMICZNE PRZYDZIELANIE PAMIECI

Podstawy programowania w języku C++

Wykład 5: Klasy cz. 3

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

Wykład 4: Klasy i Metody

Techniki Programowania wskaźniki

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

Qt sygnały i designer

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

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

Hermetyzacja oraz pola i metody statyczne

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

Przestrzenie nazw. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Wprowadzenie do programowanie obiektowego w języku C++

Wykład nr 3. Temat: Wskaźniki i referencje. Edward Morgan Forster

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Podstawy programowania w języku C++

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Programowanie i struktury danych

Szablony klas, zastosowanie szablonów w programach

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

Laboratorium nr 10. Temat: Funkcje cz.2.

Programowanie obiektowe

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

Programowanie obiektowe

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

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

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

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

Programowanie obiektowe i C++ dla matematyków

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

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

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

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

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

Praca z aplikacją designer

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

Przykład zastosowania przeciażeń operatorów i metod stałych - szukanie punktu przecięcia z wielobokiem

Wstęp do Programowania 2

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

TEMAT : KLASY POLIMORFIZM

PARADYGMATY PROGRAMOWANIA Wykład 4

Wykład 1: Wskaźniki i zmienne dynamiczne

Podstawy programowania w języku C++

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

Wskaźniki w C. Anna Gogolińska

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

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

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

Transkrypt:

Referencje do zmiennych i obiektów Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2005 2008 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłacznie do własnych prywatnych potrzeb i może on być kopiowany wyłacznie w całości, razem z niniejsza strona tytułowa.

Referencje do zmiennej int main( ) int Zmienna = 2; int &RefDoZm = Zmienna; RefDoZm = 4; if (Zmienna == RefDoZm) cout << O rany, wartości tych zmiennych sa równe! << endl; if (&Zmienna == &RefDoZm) cout << ALEŻ TO S... A TE SAME ADRESY!!!!! << endl; Dzięki referencji do danej zmiennej można odwoływać się na różne sposoby. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 1

Referencja - idea możliwej implementacji int Zm1, Zm2; Zm1 = Zm2; int * wzm1, Zm2; * wzm1 = Zm2; int Zm1, &Zm2 = Zm1; Obszar kodu Obszar kodu Zm1 = Zm2; Kod operacji: X = Y Adres arg. X: &Zm1 Adres arg. X: &Zm2 Kod operacji: * X = Y Adres arg. X: &wzm1 Adres arg. X: &Zm2 Obszar kodu Kod operacji: X = Y Adres arg. X: &Zm1 Adres arg. X: &Zm2 Obszar danych Obszar danych Obszar danych Zm2 Zm2 Zm1 Zm1 wzm1 * wzm1 Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 2

Referencje do elementu tablicy int main( ) int Tablica[ROZMIAR TABLICY]; int &RefDoElem = Tablica[5]; RefDoElem = 4; // Tu tworzymy referencję do szóstego elementu. if (Tablica[5] == RefDoElem) cout << O rany, wartości sa takie same! << endl; if (Tablica + 5 == &RefDoElem) cout << ALEŻ TO S... A TE SAME ADRESY!!!!! << endl; Referencje pozwalaja na bardziej efektywny dostęp do wybranych elementów tablicy. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 3

Parametry przekazywane przez referencję void Podstawienie( int &Param ) Param = 3202741; int main( ) int Zmienna = 999; Podstawienie( Zmienna ); if ( Zmienna == 3202741 ) cout << Faktycznie!!! Zmiany sa widoczne na zewnatrz!!! << endl; Dla parametru przekazanego przez referencję zmiany jego wartości wewnatrz funkcji sa widoczne na zewnatrz po zakończeniu jej działania. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 4

Parametry przekazywane przez referencję void Podstawienie( const int &Param ) Param = 3202741; int main() int Zmienna = 999; // Ta operacja jest tutaj niedozwolona Podstawienie( Zmienna ); if (Zmienna == 999) cout << Tym razem nic nie uległo zmianie. << endl; Referencja z modyfikatorem const powoduje, że dana zmienna lub parametr traktowane sa jako stałe. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 5

Sposoby przekazywania parametrów Przekazywanie parametrów przez: Pascal C C++ wartość procedure Proc(wart :integer); void Funkcja(int wart); void Funkcja(int wart); wskaźnik procedure Proc(wsk :ˆinteger); void Funkcja(int wsk); void Funkcja(int wsk); zmienna / procedure Proc(var zm :integer); void Funkcja(int& zm); referencję referencję void Funkcja(const int& st); const Referencja dostarcza efektywny i elastyczny mechanizm przekazywania parametrów. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 6

Referencja do obiektu class ProstaKlasa //............................................................................. int Pole; public: void Zmien(int Wart) Pole = Wart; int Pobierz() const return Pole; ; //................................................................................................ int main() ProstaKlasa Ob; ProstaKlasa &RefDoOZmiennego = Ob; const ProstaKlasa &RefDoOStalego = Ob; // Tu następuje zawężenie dostępu. RefDoOZmiennego.Zmien(2); cout << RefDoOZmiennego.Pobierz() << endl; RefDoOStalego.Zmien(2); cout << RefDoOStalego.Pobierz() << endl;... // Odwołanie się do tej metody jest teraz niedozwolone. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 7

Referencja zwracana przez funkcję int ZmGl = 10; int &RefDoZG( ) //............................................. return ZmGl; int main( ) //................................................... int ZmLo = 0; ZmLo = RefDoZG( ); ++RefDoZG( ); RefDoZG( ) = 200; cout << ZmLo: << ZmLo << endl; cout << ZmGl: << ZmGl << endl; cout << ZmGl: << ZmGl << endl; Funkcja zwracajac referencję do zmiennej globalnej daje jednocześnie możliwość bezpośredniego dostępu do niej. Wynik działania: ZmLo: 10 ZmGl: 11 ZmGl: 200 Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 8

RefDoZG( ) = 200; Jak to działa? ZmGl 11 RefDoZG( ) = 200 RefDoZG( ) 200 ZmGl 11 int& ZmGl = 200 200 ZmGl = 200 ZmGl 11 int& 200 ZmGl 200 Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 9

Referencja do obiektu int ZmGl = 11; int WartoscZG( ) return ZmGl; int main() WartoscZG( ) = 200; Funkcja zwraca wartość, a nie dostęp do innej zmiennej. Tym samym operacja przypisania nie może być wykonana. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 10

WartoscZG( ) = 200; Dlaczego to nie działa? ZmGl 11 WartoscZG( ) WartoscZG( ) = 200 200 11 = 200 ZmGl 11 11 200 11 = 200 ZmGl 11 11 200 ZmGl 11 Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 11

l- i p-wartość Pojęcie l-wartości przypisania. i p-wartości zwiazane jest z operacja l-wartość = p-wartość l-wartość nazwana pojedyncza zmienna reprezentujaca obszar pamięci przeznaczony do przechowywania zmiennej. p-wartość stała lub zmienna lub wyrażenie zwracajace wartość. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 12

Referencja do obiektu int ZmGl = 11; const int& RefDoStalejZG( ) return ZmGl; int main() const int Zm = 1; Zm = 200; RefDoStalejZG( ) = 200; Nie każda l-wartość musi być modyfikowalna. Z tego powodu wyróżnia się l-wartości i l-wartości modyfikowane. Jednak często pojęcie l-wartości modyfikowalnej jest utożsamiane z l-wartościa. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 13

Zwracanie referencji int ZmGl = 11; const int& RefDoStalejZG( ) return ZmGl; int main() const int Zm = 1; (int&)zm = 200; const cast<int&>(zm) = 200; (int&)refdostalejzg( ) = 200; const cast<int&>(refdostalejzg( )) = 200; // Rzutowanie w C Rzutowanie w C++ Stałość obiektu dostępnego poprzez wskaźnik lub referencję zawsze można ominać dokonujac odpowiedniego rzutowania. Jednak nie należy nadużywać tego mechanizmu. Zazwyczaj świadczy to o błędach koncepcyjnych w przyjętej reprezentacji danych. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 14

Zwracanie referencji int & RefDoParam( int & Param ) return Param; int main() int ZmLo = 1; RefDoParam( ZmLo ) = 200; cout << ZmLo; Zwracanie przez funkcję referencji do obiektu ma sens w przypadku, gdy obiekt istnieje przed wywołaniem funkcji lub jest tworzony w niej w sposób dynamiczny. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 15

Jak nie należy robić int &RefDoZmAuto( ) //................................................. int ZmAuto = 6; return ZmAuto; int &RefDoKopiiParam(int Param) //.................................... return Param; int main( ) //............................................................ int ZmLo = 1; RefDoZmAuto( ) = 200; RefDoParam( ZmLo ) = 200; cout << RefDoZmAuto( ) << endl; cout << RefDoParam( ) << endl; Błędem jest zwracanie referencji do obiektów tworzonych lokalnie. W pierwszym przypadku jest to zmienna automatyczna, zaś w drugim kopia parametru. Wynik działania programu: 134515632 134520592 Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 16

Referencja do pola klasy class PrzykladKlasyA //.......................................... int PoleKlasy; public : int & PoleModyf( ) return PoleKlasy; const int & PoleStale( ) const return PoleKlasy; ; //................................................................. int main( ) int ZmLo = 0; PrzykladKlasyA ObiektA; ZmLo = ObiektA.PoleStale( ); ZmLo = ObiektA.PoleModyf( ); ObiektA.PoleModyf( ) = ZmLo; Udostępnianie możliwości modyfikacji zawartości pola klasy poprzez zwrócenie przez metodę referencji nie jest częsta praktyka. Znajduje to jednak zastosowanie w przypadku przeciażeń operatorów. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 17

Referencja do obiektu class PrzykladKlasyB //.................................................. public : int PoleKlasy; PrzykladKlasyB & ObiektModyf( ) return this ; const PrzykladKlasyB & ObiektStaly( ) const return this ; //.......................................................................... int main( ) int ZmLo = 0; PrzykladKlasyB ObiektB; ZmLo = ObiektB.ObiektStaly( ). PoleKlasy; ZmLo = ObiektB.ObiektModyf( ). PoleKlasy; ObiektB.ObiektModyf( ). PoleKlasy = ZmLo; Udostępnianie możliwości modyfikacji obiektu poprzez zwrócenie przez metodę referencji może być użyteczne, gdy dopuszcza się możliwość wywołań wielu metod dla tego samego obiektu. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 18

Problem parametrów nazwanych class WekParam //................................................................... public : float x, y, z; WekParam( ) x = y = z = 0; WekParam &X(float x) x = x; return this ; WekParam &Y(float y) y = y; return this ; WekParam &Z(float z) z = z; return this ; ; //..................................................................................... class Wektor3f //.................................................................... float x, y, z; public : void Zmien( const WekParam& P ) x = P. x; y = P. y; z = P. z; //...................................................................................... int main( ) Wektor3f W; W.Zmien( WekParam( ).X(1).Z(10) ); Parametry nazwane w sposób pośredni moga być realizowane w ramach składni C++. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 19

Bezpośrednia zmiana wybranych parametrów class Wektor3f //......................................................... float x, y, z; public : Wektor3f( ) x = y = z = 0; Wektor3f &X(float x) x = x; return this ; Wektor3f &Y(float y) y = y; return this ; Wektor3f &Z(float z) z = z; return this ; //.......................................................................... int main( ) Wektor3f W; W.X(1).Z(10); W trakcie prac nad standardem języka C++ powstał pomysł wprowadzenia parametrów nazwanych jako dodatkowej konstrukcji. Przykład, którego idea podana jest na poprzednim slajdzie, był argumentem świadczacym o tym, że istniejace mechanizmy umożliwiaja realizację tej konstrukcji bez potrzeby wprowadzania dodatkowych elementów składni. Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 20

Pytania i ćwiczenia Dany jest fragment kodu: class ProstaKlasa int Pole; public: void Zmien(int Wart) Pole = Wart; ; int main() ProstaKlasa const Ob; ProstaKlasa &Ref = Ob;... 1. Czy powyżej w poprawny sposób utworzona została referencja do obiektu Ob? 2. Jeżeli nie, to jak należy to zapisać aby operacja była poprawna (nie zmieniajac deklaracji referencji Ref)? 3. Jeżeli tak, to jak należy to zapisać aby uniemożliwić taka operację? 4. Czy po utworzeniu referencji Ref będzie się można poprzez nia odwołać do metody Zmien? Copyright c 2005 2008 Bogdan Kreczmer Referencje do zmiennych i obiektów 21