Wskaźniki Cztery atrybuty zmiennej. Wskaźnik jest typem wartości. Operator * oznacza: Operator & oznacza: nazwa typ. wartość lokacja (adres)
|
|
- Elżbieta Szulc
- 9 lat temu
- Przeglądów:
Transkrypt
1 Dzisiejszy wykład Wskaźniki Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji Płytkie i głębokie kopiowanie Konstruktor kopiujący Operator przypisania Przeciążenie operatorów 1
2 Wskaźniki Cztery atrybuty zmiennej nazwa typ int x = 5; wartość lokacja (adres) Wskaźnik jest typem wartości przechowywany w zmiennej jest to pewna liczba Operator * oznacza: pobierz wartość przechowywaną w zmiennej i użyj jej jako adresu innej zmiennej Operator & oznacza: pobierz adres zmiennej (NIE wartość zmiennej) 2
3 Wskaźniki Zmienna nazwa, typ, wartość, lokacja (adres) lokacja int x = 5; typ wartość nazwa W programie W pamięci Która zmienna pod jakim adresem? Ile pamięci zajmuje? Kto o tym decyduje? 3
4 Wskaźniki Jaka jest wartość poniższych wyrażeń? Czy są one poprawne? x &x *x lokacja int x = 5; typ wartość nazwa W programie W pamięci 4
5 Wskaźniki Jaka jest wartość poniższych wyrażeń? Czy są one poprawne? x, &x, *x p, &p, *p q, &q, *q ip, &ip, *ip lokacja wartość nazwa int x=5; char *p="hello"; char *q; int *ip; ip=&x; int x char*p ? char*q ? int* ip hello\0 W programie W pamięci 5
6 Wskaźniki do funkcji int* f1(int*, const int*); int* (*fp1)(int*, const int*); int* (*f2(int))(int*, const int*); int* (*(*fp2)(int))(int*, const int*); fp1=f1; fp1=&f1; fp1=&fp1; /* zle */ fp2=f2; fp2=&f2; int a,b,*c; c=f1(&a,&b); c=fp1(&a,&b); c=(*fp1)(&a,&b); c=*fp1(&a,&b); /* zle */ c=(f2(3))(&a,&b); c=(*f2(3))(&a,&b); c=(fp2(3))(&a,&b); c=(*fp2(3))(&a,&b); c=(*(*fp2)(3))(&a,&b); 6
7 Klasa List Lista jednokierunkowa z dowiązaniami l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 class list private: struct node node *next; int val; ; node * head; ; 7
8 Klasa List - konstruktor i destruktor l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 class list private: struct node node *next; int val; ; node * head; public: list (); ~list (); void insert (int a); list::list() head = NULL; list::~list() while(head) node* t=head->next; delete head; head=t; ; 8
9 Klasa List - destruktor l head next=0x1334 val=2 next=null val=3 class list private: struct node list::list() node *next; int val; head = NULL; ; node * head; public: list (); ~list (); void insert (int a); list::~list() while(head) node* t=head->next; delete head; head=t; ; 9
10 Klasa List - destruktor l head next=null val=3 class list private: struct node list::list() node *next; int val; head = NULL; ; node * head; public: list (); ~list (); void insert (int a); list::~list() while(head) node* t=head->next; delete head; head=t; ; 10
11 Klasa List - destruktor l head=null class list private: struct node list::list() node *next; int val; head = NULL; ; node * head; public: list (); ~list (); void insert (int a); list::~list() while(head) node* t=head->next; delete head; head=t; ; 11
12 Klasa List - insert l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 class list private: struct node ; node *next; int val; node * head; public: list (); ~list (); void insert (int a); next=0x1134 val=1 void list::insert(int a) node* nowy=new node; nowy->next=head; head = nowy; head->val = a; 12
13 Klasa List - insert l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 class list private: struct node ; node *next; int val; node * head; public: list (); ~list (); void insert (int a); next=0x1134 val=1 void list::insert(int a) node* nowy=new node; nowy->next=head; head = nowy; head->val = a; 13
14 Klasa List - insert l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 class list private: struct node ; node *next; int val; node * head; public: list (); ~list (); void insert (int a); next=0x1134 val=1 void list::insert(int a) node* nowy=new node; nowy->next=head; head = nowy; head->val = a; 14
15 Klasa List - iterator l head current next=0x1234 val=1 next=0x1334 val=2 next=null val=3 class list private:... node * head; node *current; public:... void gotohead (); int getcurrentdata (); ; void advance (); bool moredata (); #include <iostream> using namespace std; #include "list.h" int main() list l; l.insert(3); l.insert(2); l.insert(1); l.gotohead(); while(l.moredata()) int val; val=l.getcurrentdata(); cout << val << " "; l.advance(); cout << endl; ; 15
16 Przekazywanie argumentów do funkcji Przekazywanie przez wartość parametry formalne są kopią parametrów aktualnych Przekazywanie przez referencję parametry formalne są referencją do parametrów aktualnych, tj. wszystkie operacje na parametrach formalnych odnoszą się do parametrów aktualnych C i C++ domyślnie przekazują parametry przez wartość void d1(int x) x = 10; void d2(int *p) (*p) = 10; void d3(int *p) p = new int(4); int main() int y = 2; d1(y); cout << y; d2(&y); cout << y; d3(&y); cout << y; 16
17 Przekazywanie argumentów do funkcji Przez wartość parametry formalne są kopią parametrów aktualnych Przez referencję parametry formalne są referencją do parametrów aktualnych, tj. wszystkie operacje na parametrach formalnych odnoszą się do parametrów aktualnych Przez stałą referencję do funkcji przekazywana jest referencja do parametru w celu uniknięcia kosztów kopiowania, ale wartość nie może być w funkcji modyfikowana (co jest sprawdzane przez kompilator) void f1(int x) x = x + 1; void f2(int& x) x = x + 1; void f3(const int& x) x = x + 1; void f4(int *x) *x = *x + 1; int main() int y = 5; f1(y); f2(y); f3(y); f4(&y); Która metoda w którym przykładzie? Ile wynosi y po każdym wywołaniu? Co jest przekazywane do f4? Czy to wartość, czy referencja? Czy można przekazać wskaźnik przez referencję? 17
18 Przekazywanie argumentów do funkcji Przekazywanie obiektów do funkcji nie różni się koncepcyjnie od przekazywania typów prostych klasy umożliwiają modyfikację zachowania w tym przypadku Trzy metody: przez wartość, przez referencję, przez stałą referencję Przez wartość parametr formalny jest kopią parametru aktualnego. Użyty konstruktor kopiujący. Przez referencję parametry formalne są referencją do parametrów aktualnych, tj. wszystkie operacje na parametrach formalnych odnoszą się do parametrów aktualnych Przez stałą referencję do funkcji przekazywana jest stała referencja do argumentu. Tylko metody ze specyfikatorem const mogą być wywoływane wewnątrz metody na rzecz argumentu. 18
19 Przekazywanie obiektów jako parametrów Kiedy obiekt jest użyty jako parametr wywołania funkcji, rozróżnienie między kopiowaniem płytkim a głębokim może spowodować tajemnicze problemy void PrintList (list & toprint, ostream & Out) int nextvalue; Out << "Printing list contents: " << endl; toprint.gotohead (); if (!toprint.moredata ()) Out << "List is empty" << endl; return; while (toprint.moredata ()) nextvalue = toprint.getcurrentdata (); Out << nextvalue << " "; toprint.advance (); Out << endl; Obiekt toprint jest przekazywany przez referencję, gdyż może być duży i kopiowanie byłoby nieefektywne Czy można użyć stałej referencji? Co by się stało, gdybyśmy przekazali toprint przez wartość? 19
20 Przekazywanie obiektów jako parametrów W poprzednim przykładzie obiekt nie może być przekazany przez stałą referencję, gdyż wywołana funkcja zmienia obiekt (wskaźnik current) Z tego powodu możemy chcieć wyeliminować możliwość przypadkowej modyfikacji listy i przekazywać ją przez wartość Będzie to rozwiązanie nieefektywne Może spowodować problemy, jeżeli brak konstruktora kopiującego 20
21 Przekazywanie obiektów przez wartość void PrintList (list toprint, ostream & Out) // identyczna implementacja int main() list BigLst; // initialize BigList with some data nodes PrintList(BigList, cout); BigList l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 toprint l head BigList i toprint są tym samym obiektem Funkcja PrintList dalej może modyfikować BigList Konsekwencje są jeszcze poważniejsze 21
22 Przekazywanie obiektów przez wartość Po zakończeniu PrintList czas życia zmiennej toprint kończy się i wywoływany jest jej destruktor BigList l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 toprint l head Dealokacja toprint powoduje dealokację listy węzłów, na którą wskazuje toprint.head Jest to ta sama lista, która jest zawarta w BigList. Po powrocie do funkcji main(), BigList została zniszczona, ale BigList.head wskazuje na zwolnioną pamięć 22
23 Przypisanie obiektów Obiekty posiadają domyślny operator przypisania (identyczny jak struktury) class DateType public: // constructor DateType(); DateType(int newmonth, int newday, int newyear);... ;... DateType A(1, 22, 2002); DateType B; B = A; // copies the data members of A into B Domyślny operator przypisania kopiuje pole po polu wartości z obiektu źródłowego do obiektu docelowego W wielu przypadkach jest to zadowalające. Niestety, jeżeli obiekt zawiera wskaźnik do dynamicznie zaalokowanej pamięci, rezultat zwykle nas nie zadowoli. 23
24 Problem z przypisaniem wskaźników class Wrong private: int *table; // some data here public: // constructor Wrong() table = new int[1000]; ~Wrong() delete [] table; ;... Wrong A; Wrong B; B = A; // copies the data members of A into B Jaki typ danych przechowuje Wrong? Czy int * table to to samo co int table[]? Co się stanie przy kopiowaniu? Jakie napotkamy problemy? Jak temu zapobiec? A B table? 24
25 Kopiowanie płytkie i głębokie Wyróżniamy dwa typy kopiowania obiektów zawierających pola będące wskaźnikami Kopiowanie płytkie Kopiowanie wszystkich składowych (w tym wskaźników) Kopiowane są wskaźniki, a nie to, na co wskazują Kopiowanie głębokie A B table Alokacja nowej pamięci dla wskaźników Kopiowanie zawartości wskazywanej przez wskaźniki w nowe miejsce Kopiowanie pozostałych pól, nie będących wskaźnikami A table B table 25
26 Problemy z płytkim kopiowaniem list mylist; mylist.insert (3); mylist.insert (2); mylist.insert (1); mylist l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 26
27 Problemy z płytkim kopiowaniem list mylist; mylist.insert (3); mylist.insert (2); mylist.insert (1); list anotherlist; anotherlist=mylist; mylist l head next=0x1234 val=1 next=0x1334 val=2 next=null val=3 anotherlist l head 27
28 Głębokie kopiowanie Kiedy obiekt zawiera wskaźnik do dynamicznie zaalokowanego obszaru, należy zdefiniować operator przypisania wykonujący głębokie kopiowanie W rozważanej klasie należy zdefiniować operator przypisania: AType& AType::operator=(const AType& otherobj) Operator przypisania powinien uwzględnić przypadki szczególne: Sprawdzić przypisanie obiektu do samego siebie, np. A=A: if (this == &otherobj) // if true, do nothing Skasować zawartośc obiektu docelowego delete this->... Zaalokować pamięć dla kopiowanych wartości Przepisać kopiowane wartości Zwrócic *this 28
29 Konstruktor kopiujący i operator przypisania Konstruktor kopiujący jest używany do stworzenia nowego obiektu Jest prostszy od operatora przypisania - nie musi sprawdzać przypisania do samego siebie i zwalniać poprzedniej zawartości Jest użyty do skopiowania parametru aktualnego do parametru formalnego przy przekazywaniu parametru przez wartość Przy tworzeniu nowego obiektu, można go zainicjalizować istniejącym obiektem danego typu. Wywołany jest wówczas konstruktor kopiujący. int main() list a; //... list b(a); //copy constructor called list c=a; //copy constructor called ; 29
30 Obiekty anonimowe Obiekt anonimowy to obiekt bez nazwy Tworzony jest obiekt, ale nie ma nazwanej zmiennej, która go przechowuje Użyteczny do użytku tymczasowego (parametr przy wywołaniu funkcji, zwracaniu wartości, fragment wyrażenia) jako domyślna wartość parametru będącego obiektem Rozważmy metodę pobierającą obiekt typu Address: Argument może zostać przekazany w sposób następujący: Person joe; joe.setaddress(address("disk Drive"...)); Zamiast: void Person::setAddress(Address addr); Person joe; Address joeaddress("disk Drive"...); joe.setaddress(joeaddress); 30
31 Przykład: obiekty anonimowe jako parametry Bez obiektów anonimowych mamy nieporządek Name JBHName("Joe", "Bob", "Hokie"); Address JBHAddr("Oak Bridge Apts", "#13", "Blacksburg","Virginia", "24060"); Person JBH(JBHName, JBHAddr, MALE);... Użycie obiektów anonimowych zmniejsza zanieczyszczenie lokalnej przestrzeni nazw Person JBH(Name("Joe", "Bob", "Hokie"), Address("Oak Bridge Apts", "#13", "Blacksburg", "Virginia", "24060"),MALE);... 31
32 Przykład: obiekty anonimowe jako wartości domyślne Użycie obiektów anonimowych jest relatywnie prostą metodą na kontrolowanie inicjalizacji i zmniejszenie liczby metod klasy Person::Person(Name N = Name("I", "M", "Nobody"), Address A = Address("No Street", "No Number", "No City", "No State", "00000"), Gender G = GENDERUNKNOWN) Nom = N; Addr = A; Spouse = NULL; Gen = G; 32
33 Wybrane metody tworzenia obiektów Zmienne automatyczne Atype a; //konstruktor domyślny Zmienne automatyczne z argumentami Atype a(3); //konstruktor z parametrem int Przekazywanie parametrów funkcji przez wartość void f(atype b)... Atype a; //konstruktor domyślny... f(a); //konstruktor kopiujący Przypisanie wartości zmiennym Atype a,b;... a=b; //operator przypisania Inicjalizacja nowych obiektów Atype b; //konstruktor domyslny... Atype a=b; //konstruktor kopiujący (NIE operator przypisania) Zwracanie wartości z funkcji Atype f() Atype a; //konstruktor domyślny... return a; //konstruktor kopiujący 33
34 Cechy dobrze napisanej klasy Jawny konstruktor domyślny Gwarantuje, że każdy zadeklarowany egzemplarz obiektu zostanie w kontrolowany sposób zainicjalizowany Jeżeli obiekt zawiera wskaźniki do dynamicznie zaalokowanej pamięci: Jawny destruktor Zapobiega wyciekom pamięci. Zwalnia zasoby podczas usuwania obiektu. Jawny operator przypisania Używany przy przypisywaniu nowej wartości do istniejącego obiektu. Zapewnia, że obiekt jest istotnie kopią innego obiektu, a nie jego aliasem (inną nazwą). Jawny konstruktor kopiujący Używany podczas kopiowania obiektu przy przekazywaniu parametrów, zwracaniu wartości i inicjalizacji. Zapewnia, że obiekt jest istotnie kopią innego obiektu, a nie jego aliasem. 34
35 Przeciążenie Przeciążenie - istnienie wielu definicji tej samej nazwy Wiele funkcji noszących tę samą nazwę W C++, przeciążone nazwy są rozróżniane na podstawie liczby i typu argumentów z uwzględnieniem dziedziczenia Powyższe parametry zwane są sygnaturą funkcji typy wartości zwracanej nie są rozróżniane, poniższy przykład jest niepoprawny double fromint(int x) float fromint(int x) Częste zastosowanie przeciążenia to przeciążenie operatorów 35
36 Przeciążenie i polimorfizm Przeciążenie to forma polimorfizmu Pozwala na zdefiniowanie nowego znaczenia (funkcjonowania) operatorów dla wybranych typów. Kompilator rozpoznaje, której implementacji użyć, po sygnaturze funkcji (typach operandów użytych w wyrażeniu) Przeciążenie jest wspierane dla wielu wbudowanych operatorów 17 * * 2.9 cout << 79 << 'a' << "overloading is profitable" << endl; Użyta implementacja zależy od typów operandów 36
37 Przyczyny przeciążania operatorów Wsparcie dla naturalnego, sugestywnego użycia: Complex A(4.3, -2.7), B(1.0, 5.8); Complex C; C = A + B; // '+' oznacza dodawanie dla tego typu, tak samo jak dla np. typu int Integralność semantyczna: przypisanie dla typów obiektowych musi zapewnić wykonanie głębokiej kopii Możliwość użycia obiektów w sytuacjach, w których oczekiwany jest typ prosty 37
38 Operatory, które mogą być przeciążane Jedynie poniższe operatory mogą być przeciążane + - * / % ^ & ~! = < > += -= *= /= %= ^= &=!= << >> >>= <<= ==!= <= >= && >*, -> [] () new new[] delete delete [] Operatory =, ->, [], () muszą być metodami niestatycznymi 38
39 Wskazówki dotyczące przeciążania operatorów Operator powinien zachowywać się zgodnie z oczekiwaniami użytkownika Complex Complex::operator~() const return ( Complex(Imag, Real) ); Należy dostarczyć pełen zestaw pokrewnych operatorów: a = a + b i a+=b powinny mieć taki sam efekt i należy dostarczyć użytkownikowi klasy oba operatory Należy zdefiniować operator jako składową jeśli inne rozwiązanie nie jest konieczne Jeżeli przeciążony operator nie może być składową, powinien być funkcją zaprzyjaźnioną, a nie używać akcesorów, dodanych do klasy wyłącznie w tym celu 39
40 Składnia przeciążania operatorów Deklarowane i definiowane tak samo jak inne metody i funkcje, różnią się użyciem słowa kluczowego operator Jako metoda klasy: bool Name::operator== (const Name& RHS) return ((First == RHS.First) && (Middle == RHS.Middle) && (Last == RHS.Last) ); Jako funkcja zaprzyjaźniona: bool operator==(const Name& LHS, const Name& RHS) return ((LHS.First == RHS.First) && (LHS.Middle == RHS.Middle) && (LHS.Last == RHS.Last) ); Bardziej naturalne jest użycie metody 40
41 Użycie operatorów przeciążonych Jeżeli Name::operator= jest zdefiniowany jako metoda klasy Name, wówczas nme1 == nme2 jest równoważne nme1.operator==(nme2) Jeżeli operator== nie jest zdefiniowany jako składowa, wówczas nme1 == nme2 jest równoważne operator==(nme1, nme2) 41
42 Przeciążenie operatorów Składowe przeciążające operatory są definiowane z użyciem słowa kluczowego operator // add to DateType.h: bool operator==(datetype otherdate) const ; Interfejs // add to DateType.cpp: bool datetype::operator==(datetype otherdate) const return( (Day == otherdate.day ) && (Month == otherdate.month ) && (Year == otherdate.year )); DateType adate(10, 15, 2000); DateType bdate(10, 15, 2001); Klient Odpowiednio użyte przeciążenie operatorów pozwala na traktowanie obiektów typu zdefiniowanego przez użytkownika w sposób tak samo naturalny, jak typów wbudowanych. if (adate == bdate)... Implementacja 42
43 Operator binarny jako składowa Operator odejmowania dla klasy Complex jako składowa: Complex Complex::operator-(const Complex& RHS) const return ( Complex(Real - RHS.Real, Imag - RHS.Imag) ); Lewy operand operatora musi być obiektem Complex X(4.1, 2.3), Y(-1.2, 5.0); int Z; OK: X + Y; Not OK: Z + X; Zazwyczaj przekazuje się operand przez stałą referencję, żeby uniknąć narzutu kopiowania 43
44 Operator binarny jako funkcja nie będąca składową Operator odejmowania dla klasy Complex jako funkcja nie będąca składową: Operator odejmowania musi używać interfejsu publicznego w celu dostępu do danych prywatnych klasy... Complex operator-(const Complex& LHS, const Complex& RHS) return ( Complex(LHS.getReal() - RHS.getReal(), LHS.getImag() - RHS.getImag()) );...chyba że klasa Complex zadeklaruje funkcję jako funkcję zaprzyjaźnioną Funkcja zaprzyjaźniona ma dostęp do składowych prywatnych klasy tak samo, jak składowa. class Complex ;... friend Complex operator+ (const Complex&, const Complex&);... 44
45 Operatory jednoargumentowe (unarne) Operator negacji dla klasy Complex Complex Complex::operator-() const return ( Complex(-Real, -Imag) ); Complex A(4.1, 3.2); // A = i Complex B = -A; // B = i Składowa implementująca unarny operator nie ma parametrów. 45
46 Operatory pre- i postinkrementacji class Value private: int x; public: Value(int i = 0) : x(i) int get() const return x; void set(int x) ( this->x = x; Value& operator++(); Value operator++(int Dummy); Operator preinkrementacji Value& Value::operator++() x = x + 1; return *this; Operator postinkrementacji Value Value::operator++(int Dummy) x = x + 1; return Value(x-1); // return previous value 46
47 Wielokrotne przeciążenie W klasie może być kilka operatorów dodawania Complex Complex::operator+(double RHS) const return (Complex(Real + RHS, Imag)); Complex Complex::operator+(Complex RHS) const return (Complex(Real + RHS.Real, Imag + RHS.Imag)); Napiszmy kilka wyrażeń mieszanych: Complex X(4.1, 2.3); double R = 1.9; Complex Y = X + R; // Y.Real is 6.0 Sygnatura funkcji zostanie użyta do wyboru właściwej funkcji Complex Z = Y + R; // complex plus double Complex W = Y + X; // complex plus complex 47
48 Wielokrotne przeciążenie Konstruktor może służyć jako operator konwersji Complex Complex::operator+(Complex RHS) const return (Complex(Real + RHS.Real, Imag + RHS.Imag)); Complex:: Complex (double co) Real = co; Imag = 0; ; Complex X(4.1, 2.3); double R = 1.9; Complex Y = X + R; // Y = X.operator+(Complex(R)); Nie zadziała, gdy lewy argument jest typu double Complex X(4.1, 2.3); double R = 1.9; Complex Y = R + X; // syntax error Lepiej zdefiniować operator dwuargumentowy jako funkcję zaprzyjaźnioną 48
49 Wielokrotne przeciążenie Funkcja zaprzyjaźniona działa również, gdy argument typu double jest po lewej stronie friend Complex operator+(complex LHS, Complex RHS) return (Complex(LHS.Real + RHS.Real, LHS.Imag + RHS.Imag)); Complex X(4.1, 2.3); double R = 1.9; Complex Y = X + R; // Y = operator+(x,complex(r)); Complex Z = R + X; // Y = operator+(complex(r),x); Kiedy implementować operatory jako funkcje zaprzyjaźnione: Przy operacjach na podstawowych typach danych, np. Complex operator+(int LHS, const Complex& RHS); Kiedy nie można zmodyfikować klasy oryginalnej, np. ostream 49
50 Implementowany zbiór operatorów W wielu przypadkach dla danego typu cała kategoria operatorów ma sens Na przykład, dla klasy Complex ma sens przeciążenie wszystkich operatorów arytmetycznych. Dla klasy Name ma sens przeciążenie wszystkich operatorów relacji Często implementacje jednych operatorów mogą korzystać z implementacji innych operatorów, np: Complex operator + (Complex s1, Complex s2) Complex n (s1); return n += s2; 50
51 Operatory wejścia/wyjścia Nie mamy dostępu do kodu klas istream i ostream, a więc nie możemy przeciążyć operatorów << i >> jako składowych tych klas. Nie możemy ich także uczynić składowymi klasy danych, ponieważ obiekt klasy danych musiałaby wówczas znajdować się po lewej stronie operatora, a nie o to nam chodzi. Dlatego musimy zdefiniować operator<< jako osobną funkcję Funkcja ta musi mieć dostęp do składowych klasy danych, a więc zazwyczaj będzie to funkcja zaprzyjaźniona. Rozwiązaniem alternatywnym, często nieakceptowalnym, jest zdefiniowanie akcesorów dla wszystkich pól prywatnych. Sygnatura funkcji będzie miała następującą postać: ostream& operator<<(ostream& Out, const Data& towrite) 51
52 operator<< dla obiektów Complex Przeciążony operator<< drukuje sformatowany obiekt klasy Complex do strumienia wyjściowego ostream& operator<<(ostream& Out, const Complex& towrite) const int Precision = 2; const int FieldWidth = 8; Out << setprecision(precision); Out << setw(fieldwidth) << towrite.real; if (towrite.imag >= 0) Out << " + "; else Out << " - "; Out << setw(fieldwidth) << fabs(towrite.imag); Out << "i"; Out << endl; return Out; 52
53 operator>> dla obiektów Complex Przeciążony operator>> wczytuje ze strumienia wejściowego obiekt klasy Complex sformatowany w sposób używany przez operator<< istream& operator>>(istream& In, Complex& toread) char signofimag; In >> toread.real; In >> signofimag; In >> toread.imag; if (signofimag == '-') toread.imag = -toread.imag; In.ignore(1, 'i'); return In; Funkcja zależy od sposobu formatowania obiektów Complex w strumieniu wejściowym. Może być znacznie bardziej skomplikowana, jeżeli chcemy wczytywać różne formaty. 53
54 Przeciążenie operatora indeksowania class vector int *dane; unsigned int size; public: vector(int n); //creates n-element vector ~vector(); int& operator[] (unsigned int pos); int operator[] (unsigned int pos) const //copy constructor, assignment operator,... ; int& vector::operator[] (unsigned int pos) if (pos >= size) abort (); return dane[pos]; int vector::operator[] (unsigned int pos) const if (pos >= size) abort (); return dane[pos]; Dostarcza spodziewaną funkcjonalność, pozwalając na napisanie vector a(10); a[5]=10; cout << a[4]<<endl; 54
55 Przeciążenie operatorów relacji Jeżeli zamierzamy przechowywać obiekty danej klasy jako elementy kolekcji, przynajmniej część operatorów relacji powinna zostać przeciążona W celu efektywnego wyszukiwania elementów i sortowania kolekcja musi mieć możliwość porównywania przechowywanych obiektów. Może ona: Użyć funkcji akcesorów i porównywać bezpośrednio pola Użyć specjalnej metody porównującej zdefiniowanej w danej klasi Użyć przeciążonych operatorów relacji (==,!=, <, <=, >, >= w zależności od potrzeb) Pierwsze podejście wymaga, aby kolekcja posiadała szczegółowe informacje o swoich elementach Drugie podejście wymaga dostarczenia specjalnych składowych Trzecie podejście jest najbardziej naturalne i pozwala na niezależne projektowanie klas danych i kolekcji. 55
Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 12 Katarzyna Grzelak 28 maja 2018 K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27 Klasy cd K.Grzelak (Wykład 12) Programowanie w C++ 2 / 27 Klasy - powtórzenie Klasy typy definiowane
Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30
Programowanie w C++ Wykład 11 Katarzyna Grzelak 13 maja 2019 K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30 Klasy cd K.Grzelak (Wykład 11) Programowanie w C++ 2 / 30 Klasy - powtórzenie Klasy typy definiowane
C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
Programowanie obiektowe i C++ dla matematyków
Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 22 XI 2011 Uwaga! Ponieważ już sobie powiedzieliśmy np. o wskaźnikach i referencjach, przez które nie chcemy przegrzebywać
Składnia C++ Programowanie Obiektowe Mateusz Cicheński
Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Konstruktory i destruktory
PARADYGMATY PROGRAMOWANIA Wykład 3
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
Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21
Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Przydzielanie pamięci Poniżej przedstawiono w C++ dwie klasy obrazujące sposób rezerwacji pamięci. class Osoba char imie[30];
Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)
Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006) Część 1. Teoria Wyjaśnij pojęcia, podaj przykład: klasa obiekt konstruktor destruktor kapsułkowanie (hermetyzacja) wskaźnik this
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE
WSKAŹNIKI KLASOWE Wskaźniki klasowe Każdy obiekt zajmuje fragment pamięci i wszystkie obiekty tego samego typu zajmują fragmenty pamięci tej samej długości początek miejsca w pamięci zajmowanego przez
Wykład 5: Klasy cz. 3
Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory Wskaźnik this Destruktor Przeciążanie funkcji i operatorów Funkcje otwarte
Dzisiejszy wykład Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory Wskaźnik this Destruktor Przeciążanie funkcji i operatorów Funkcje otwarte 1 Interfejs prostej klasy Date Oto deklaracja
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
TEMAT : KLASY DZIEDZICZENIE
TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą
Programowanie 2. Język C++. Wykład 3.
3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane
Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016
Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,
Składnia C++ Programowanie Obiektowe Mateusz Cicheński
Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Przeciążanie operatorów Słowo
W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :
Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;
Konstruktor kopiujacy
Konstruktor kopiujacy Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony
Operator przypisania. Jest czym innym niż konstruktor kopiujący!
Operator przypisania Jest czym innym niż konstruktor kopiujący! Domyślnie jest zdefiniowany jako przypisanie składowa po składowej (zatem niekoniecznie bajt po bajcie). Dla klasy X definiuje się jako X&
Programowanie Obiektowe i C++
Programowanie Obiektowe i C++ Marcin Benke Instytut Informatyki UW 30.10.2006 Marcin Benke (IIUW) Programowanie Obiektowe i C++ 30.10.2006 85 / 112 Zgodność typów Rozważmy klasy class A { //... }; class
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 4 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Przeciążanie operatorów Funkcje zaprzyjaźnione Na
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Wstęp do Programowania 2
Wstęp do Programowania 2 dr Bożena Woźna-Szcześniak bwozna@gmail.com Akademia im. Jana Długosza Wykład 8 Przykład realizowany na wykładzie Klasy StringBad i String. Wstępne pliki załaczone jako źródła.
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec
PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
Przeciążenie operatorów
Przeciążenie operatorów W C++ można przeciążyć większość operatory tak, żeby wykonywali zadania, charakterystyczne dla danej klasy Po przeciążeniu odpowiednich operatorów można posługiwać się obiektami
Języki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU
Inicjalizacja agregatowa zmiennej tablicowej int a[5] = 1,2,3,4,5 INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU Struktury są również agregatami, dlatego: struct X double f; char c; X x1 = 1, 2.2, 'c' Ale
Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this
Wstęp do programowania obiektowego WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this 1 Nazwa typu Rozmiar Zakres Uwagi bool 1 bit wartości true albo false stdbool.h TYPY ZNAKOWE
Szablony klas, zastosowanie szablonów w programach
Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
PARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne
Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne Przeciążenie funkcji polega na użyciu funkcji z tą samą nazwą, które mają różne listy argumentów(różne typy, różna ilość lub to i inne).
Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory
Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile Semafory 1 Klasa string Przetwarzanie tekstów jest powszechną dziedziną zastosowań komputerów W języku
Programowanie Obiektowe i C++
Programowanie Obiektowe i C++ Marcin Benke Instytut Informatyki UW 6.11.2006 Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 1 / 138 Operator przypisania Jest czym innym niż konstruktor kopiujacy!
Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).
Wprowadzenie w dziedziczenie Klasa D dziedziczy klasę B: B klasa bazowa D klasa pochodna Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Najpierw jest tworzona klasa bazowa,
Wyliczanie wyrażenia obiekty tymczasowe
Wyliczanie wyrażenia obiekty tymczasowe Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2013 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu
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.
- - uzupełnienie notatek: dr Jerzy Białkowski - - 1-2 - - - 1 #include 2 #include 3 # include 4 using namespace std ; 5 6 class Punkt { 7 8 private : 9 double
Język C++ Różnice między C a C++
Język C++ Różnice między C a C++ Plan wykładu C a C++ Różnice ogólne Typy Deklaracje zmiennych C++ jako rozszerzenie C Domyślne argumenty funkcji Przeciążanie funkcji Referencje Dynamiczny przydział pamięci
Wstęp do Programowania 2
Wstęp do Programowania 2 dr Bożena Woźna-Szcześniak bwozna@gmail.com Akademia im. Jana Długosza Wykład 5 W programowaniu obiektowym programista koncentruje się na obiektach. Zadaje sobie pytania typu:
Operatory na rzecz typu TString
Operatory na rzecz typu TString Dopiszmy w definicji klasy operator[], dzięki któremu potraktujemy obiekt jak tablicę class TString { public: char& operator[]( size_t n ); const char& operator[]( size_t
Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np
Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami
Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie:
Rozdział 10 Przeciążanie operatorów 10.1 Definicje Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie: operator op gdzie
Operacje wejścia/wyjścia (odsłona druga) - pliki
Operacje wejścia/wyjścia (odsłona druga) - pliki 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
Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);
Przeciążanie operatorów [] Przykład: klasa reprezentująca typ tablicowy. Obiekt ma reprezentować tablicę, do której można się odwoływać intuicyjnie, np. Tab[i] Ma być też dostępnych kilka innych metod
Listy powiązane zorientowane obiektowo
Listy powiązane zorientowane obiektowo Aby zilustrować potęgę polimorfizmu, przeanalizujmy zorientowaną obiektowo listę powiązaną. Jak zapewne wiesz, lista powiązana jest strukturą danych, zaprojektowaną
KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany
KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Programowanie, część I
11 marca 2010 Kontakt Wstęp Informacje organizacyjne Materiał na ćwiczenia Plan wykładu http://www.fuw.edu.pl/~rwys/prog rwys@fuw.edu.pl tel. 22 55 32 263 Materiał na ćwiczenia Informacje organizacyjne
Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26
Programowanie w C++ Wykład 13 Katarzyna Grzelak 4 czerwca 2018 K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe
Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe
Wstęp do programowania obiektowego Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe 1 PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI W C++ 2 W C++
Programowanie obiektowe, wykład nr 6. Klasy i obiekty
Dr hab. inż. Lucyna Leniowska, prof. UR, Zakład Mechatroniki, Automatyki i Optoelektroniki, IT Programowanie obiektowe, wykład nr 6 Klasy i obiekty W programowaniu strukturalnym rozwój oprogramowania oparto
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki int getmax (int a, int b) { return (a > b? a : b); float getmax (float a, float b) { return (a > b? a : b); long getmax (long a, long b)
Wykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Programowanie w języku C++
Programowanie w języku C++ Część dziewiąta Autor Roman Simiński Kontakt siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi
Dziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc
Rok akademicki 2016/2017, Wykład nr 4 2/45 Plan wykładu nr 4 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2016/2017
Wykład 3 Składnia języka C# (cz. 2)
Wizualne systemy programowania Wykład 3 Składnia języka C# (cz. 2) 1 dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD Wizualne systemy programowania Metody 2 Metody W C# nie jest
referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.
Programowanie (język C++) referencje Wykład 2. Referencje (1) Referencja (odnośnik) jest zmienną identyfikującą inną zmienną. Wykonanie operacji na referencji ma taki sam skutek, jak wykonanie tejŝe operacji
Język C++ zajęcia nr 2
Język C++ zajęcia nr 2 Inicjalizacja Definiowanie obiektu może być połączone z nadaniem mu wartości początkowej za pomocą inicjalizatora, który umieszczany jest po deklaratorze obiektu. W języku C++ inicjalizator
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU
Inicjalizacja agregatowa zmiennej tablicowej int a[5] = 1,2,3,4,5 INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU Struktury są również agregatami, dlatego: struct X double f; char c; X x1 = 1, 2.2, 'c' Ale
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY
Inicjalizacja obiektu KONSTRUKTORY Inicjalizacja Przyczyną wielu błędów w programach jest nieprawidłowe zainicjalizowanie zmiennych na początku działania programu. Obiekt zawiera z reguły szereg pól ich
Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula
Programowanie i struktury danych Wykład 4 Dr Piotr ybula Typ wska ź nikowy int* pointer; //wskaźnik do zmiennych typu int pozwala na dostęp do dowolnego miejsca pamięci (zmienne
Java - tablice, konstruktory, dziedziczenie i hermetyzacja
Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja
Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/
Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i
Paradygmaty programowania. Paradygmaty programowania
Paradygmaty programowania Paradygmaty programowania Dr inż. Andrzej Grosser Cz estochowa, 2013 2 Spis treści 1. Zadanie 2 5 1.1. Wprowadzenie.................................. 5 1.2. Wskazówki do zadania..............................
EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi
EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi 1. Napisz wskaźnik do funkcji fun tak zdeklarowanej: T* fun( int, double const& ) const; definicja wskaźnika musi być precyzyjna, inaczej
Wstęp do programowania obiektowego, wykład 7
Wstęp do programowania obiektowego, wykład 7 Klasy i funkcje abstrakcyjne Przeciążanie funkcji Definiowanie i interpretacja złożonych typów danych w C++ Wskaźniki do funkcji 1 KLASA ABSTRAKCYJNA 2 Klasa
Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej
Wykład V - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Programowanie obiektowe Dziedziczenie (inheritance) - mechanizm
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.
Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice
KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany
KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie
Programowanie, część I
Programowanie, część I Rafał J. Wysocki Instytut Fizyki Teoretycznej, Wydział Fizyki UW 22 lutego 2011 Rafał J. Wysocki (rwys@fuw.edu.pl) Programowanie, część I 22 lutego 2011 1 / 80 Wstęp Informacje organizacyjne
Materiały do zajęć VII
Spis treści I. Klasy Materiały do zajęć VII II. III. Konstruktor Właściwości i indeksatory Klasy Programowanie obiektowe wiadomości wstępne Paradygmat programowania obiektowego Abstrakcja Hermetyzacja
Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody
Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej
Przeciążanie operatorów
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
ALGORYTMY I STRUKTURY DANYCH
Akademia Rolnicza im. Augusta Cieszkowskiego w Poznaniu - Instytut Inżynierii Rolniczej - ALGORYTMY I STRUKTURY DANYCH Prowadzący: dr inż. Radosław J. Kozłowski email: rjk@au.poznan.pl www: http://www.au.poznan.pl/~rjk
public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje
Zbudujemy klasę Definicję klasy zapiszmy w pliku tstring.h #ifndef TSTRING_H #define TSTRING_H #include // w pliku nagłówkowym NIE // otwieramy przestrzeni std // interfejs private: // implementacja
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:
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: typ nw; /* definicja zmiennej nw typu typ */ typ *w_nw; /* definicja
Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {
Przeciążanie a dziedziczenie class Integer2: public Integer Operatory, z wyjątkiem operatora przypisania są automatycznie dziedziczone w klasach pochodnych. Integer2(int i): Integer(i) Automatyczne tworzenie
Programowanie obiektowe i C++ dla matematyków
Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 10 I 2012 1 Zabronienie kopiowania Czasami nie ma sensu, żeby obiekty pewnego typu były kopiowane z innych obiektów.
Dzisiejszy wykład. Wzorce funkcji Wzorce klas Tablica asocjacyjna Składowe statyczne
Dzisiejszy wykład Wzorce funkcji Wzorce klas Tablica asocjacyjna Składowe statyczne 1 Wzorce Często pojawia się konieczność pisania podobnych funkcji lub klas operujących na argumentach różnych typów int
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
KLASY cz.1. Dorota Pylak
KLASY cz.1 Dorota Pylak Do czego służą klasy? 2 W programowaniu obiektowym posługujemy się obiektami. Obiekty charakteryzują się: cechami (inaczej - atrybutami lub stanami) operacjami, które na nich można
Programowanie obiektowe
Programowanie obiektowe Wykład 2 Marcin Młotkowski 4 marca 2015 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 47 Krótki opis C Obiektowy, z kontrolą typów; automatyczne odśmiecanie;
Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {
Przeciążanie operatorów [] Przykład: klasa reprezentująca typ tablicowy. Obiekt ma reprezentować tablicę, do której można się odwoływać intuicyjnie, np. Tab[i] Ma być też dostępnych kilka innych metod
Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019
Wykład 3 22 marca 2019 Klasy wewnętrzne Klasa wewnętrzna class A {... class B {... }... } Klasa B jest klasa wewnętrzna w klasie A. Klasa A jest klasa otaczajac a klasy B. Klasy wewnętrzne Właściwości
2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne
Tematyka wykładów 1. Wprowadzenie. Klasy cz. 1 - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie
Programowanie obiektowe w C++ Wykład 12
Programowanie obiektowe w C++ Wykład 12 dr Lidia Stępień Akademia im. Jana Długosza w Częstochowie L. Stępień (AJD) 1 / 22 Zakresowe pętle for double tab[5] {1.12,2.23,3.33,4.12,5.22 for(double x: tab)
Programowanie w języku C++
Programowanie w języku C++ Część siódma Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi
Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32
Programowanie w C++ Wykład 12 Katarzyna Grzelak 20 maja 2019 K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:
Prawa dostępu do składowych klasy PRAWA PRZYJACIÓŁ KLASY 91 Dostęp z zewnątrz: double limit; ; water_temp T; T.limit = 100; Dostęp z wewnątrz: double set_temp(double nt) { if (nt0) ; water_temp
Zaawansowane programowanie w języku C++ Klasy w C++
Zaawansowane programowanie w języku C++ Klasy w C++ Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka bez ograniczeń
Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),
Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których
Do czego służą klasy?
KLASY Dorota Pylak 2 Do czego służą klasy? W programowaniu obiektowym posługujemy się obiektami. Obiekty charakteryzują się: cechami (inaczej - atrybutami lub stanami) operacjami, które na nich można wykonywać
Do czego służą klasy?
KLASY Dorota Pylak 2 Do czego służą klasy? W programowaniu obiektowym posługujemy się obiektami. Obiekty charakteryzują się: cechami (inaczej - atrybutami lub stanami) operacjami, które na nich można wykonywać