Programowanie w języku C++
|
|
- Antoni Kurek
- 7 lat temu
- Przeglądów:
Transkrypt
1 Programowanie w języku C++ Część siódma Autor Roman Simiński Kontakt siminski@us.edu.pl Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.
2 Overloading przeciążanie, co to takiego? Przeciążanie funkcji Przeciążanie funkcji (ang. function overloading) tworzenie większej liczby funkcji o takiej samej nazwie. Nazwa funkcji może być zatem użyta wielokrotnie do realizacji różnych czynności. Jest więc przeciążona dodatkowymi obowiązkami. Kompilator zadba o dobranie właściwej wersji funkcji przeciążonej w zależności od kontekstu jej wywołania. Przykład funkcji przeciążonej int add( int a, int b ) // 1-sza wersja funkcji przeciążonej add return a + b; double add( double a, double b ) // 2-ga wersja funkcji przeciążonej add return a + b; cout << endl << "Dodawanie int :" << add( 1, 1 ); cout << endl << "Dodawanie double :" << add( 1.0, 1.0 ); Copyright Roman Simiński Strona : 2
3 Overloading przeciążanie, co to takiego? Przeciążanie funkcji rygory Przeciążanie funkcji jest możliwe, jeżeli listy parametrów funkcji przeciążonych różnią sie od siebie: typami parametrów, liczbą parametrów, jednocześnie typami i liczbą parametrów. Funkcje o tych samych nazwach i listach parametrów, różniące się tylko typem rezultatu, nie są przez kompilator rozróżniane i powodują wystąpienie błędu kompilacji. Copyright Roman Simiński Strona : 3
4 Overloading przeciążanie, co to takiego? Dlaczego przeciążanie nie uwzględnia rezultatu funkcji? int addandprint( int a, int b ) cout << a + b; return a + b; void addandprint( int a, int b ) cout << a + b; int result = addandprint( 10, 20 ); // OK addandprint( 10, 20 ); Copyright Roman Simiński Strona : 4
5 Overloading przeciążanie funkcji, szczegóły implementacyjne Przeciążanie funkcji delikatne problemy Załóżmy, że dane są następujące funkcje: void printdata( long num ) cout << "Liczba long: " << num << endl; void printdata( float num ) cout << "Liczba float: " << num << endl; void printdata( double num ) cout << "Liczba double: " << num << endl; Te wywołania są poprawne: long ln = 200; float fn = 200; double dn = 200; printdata( ln ); printdata( fn ); printdata( dn ); Copyright Roman Simiński Strona : 5
6 Overloading przeciążanie funkcji, szczegóły implementacyjne Przeciążanie funkcji delikatne problemy To wywołanie jest niepoprawne: printdata( 200 ); To poprawne, leczy być może zaskakujące: printdata( 3.14 ); Natomiast, gdyby istniały tylko dwie, następujące wersje funkcji printdata: void printdata( long num ) cout << "Liczba long: " << num << endl; void printdata( float num ) cout << "Liczba float: " << num << endl; printdata( 3.14 ); Copyright Roman Simiński Strona : 6
7 Overloading przeciążanie funkcji, szczegóły implementacyjne Przeciążanie funkcji zasady definiowania funkcji 1. Sygnatury i typ rezultatu są jednakowe, zakłada się deklarację tej samej funkcji, różnice w nazwach parametrów nie są znaczące: void printdata( long num ); void printdata( long number ); 2.Sygnatury są jednakowe, typy rezultatów są różne, kompilator potraktuje drugą deklarację jako niepoprawną redeklarację tej samej funkcji i zgłosi błąd: void printdata( long num ); long printdata( long num ); Uwaga przy doborze wersji funkcji przeciążonej typ rezultatu nie jest brany pod uwagę! 3.Sygnatury obu funkcji różnią są typami parametrów lub ich liczbą, mamy dwie wersje funkcji przeciążonej: int printdata( int num ); long printdata( long num ); Nazwa zdefiniowana przez typedef nie oznacza nowego typu: typedef int Integer; int printdata( int num ); Integer printdata( Integer num ); Copyright Roman Simiński Strona : 7
8 Overloading przeciążanie funkcji, szczegóły implementacyjne Przeciążanie funkcji rozróżnianie wersji Poszczególne wersje funkcji przeciążonej różni sygnatura nazwa funkcji i lista parametrów. Określenie, która wersja funkcji przeciążonej ma być wywołana w danym kontekście nazywa się rozróżnianiem wersji lub rozpoznawaniem wywołania (ang. function call resolution). Najważniejszym elementem rozpoznawania wywołania jest dopasowywanie parametrów (ang. argument matching). Polega on na porównaniu parametrów aktualnych wywołania z parametrami formalnymi funkcji. Proces dopasowania parametrów może skończyć się jednym z wariantów: udane dopasowanie, dopasowanie nie jest możliwe, dopasowanie jest niejednoznaczne. Copyright Roman Simiński Strona : 8
9 Overloading przeciążanie funkcji, szczegóły implementacyjne Przeciążanie funkcji rodzaje dopasowania void printdata( long num ); void printdata( float num ); void printdata( double num ); Udane dopasowanie printdata( 10L ); printdata( 10.5f ); printdata( 10.5 ); Dopasowanie nie jest możliwe printdata( "10" ); Dopasowanie jest niejednoznaczne printdata( 10 ); Copyright Roman Simiński Strona : 9
10 Overloading przeciążanie funkcji, szczegóły implementacyjne Przeciążanie funkcji jak uzyskać ścisłe dopasowanie? Istnieją cztery sposoby uzyskania ścisłego dopasowania, stosowane w następującej kolejności: ścisła zgodność, zgodność dzięki awansowaniu (ang. through promotion), zgodność dzięki standardowym przekształceniom typów, zgodność dzięki przekształceniom typów definiowanym przez programistę. Copyright Roman Simiński Strona : 10
11 Overloading przeciążanie funkcji, szczegóły implementacyjne Ścisła zgodność Typy parametru aktualnego i formalnego są identyczne: void printdata( int ); void printdata( char * ); printdata( 0 ); printdata( "Napis" ); Wersja zgodna z printdata( int ) Wersja zgodna z printdata( char * ) // Można stosować jawne rzutowanie typów printdata( ( char * )0 ); Wersja zgodna z printdata( char * ) Copyright Roman Simiński Strona : 11
12 Overloading przeciążanie funkcji, szczegóły implementacyjne Zgodność dzięki awansowaniu Jeżeli nie występuje ścisła zgodność, to przed następną próbą dopasowania, typ parametru aktualnego jest poszerzany wg. następujących zasad : Parametr typu char, unsigned char lub short awansują do typu int. Jeżeli rozmiary typu int i short są równe, parametr unsigned short awansuje do unsigned int, w przeciwnym wypadku do int. Parametr typu float awansuje do typu double. Parametr typu wyliczeniowego awansuje do typu int. void printdata( int ); void printdata( short ); void printdata( long ); printdata( 'a' ); printdata( 3.14 ); Wersja zgodna z printdata(int), 'a' awansuje do typu int. Brak możliwości awansu odwołanie niejednoznaczne. void printdata( char ); void printdata( int ); void printdata( unsigned int ); unsigned char uc; printdata( uc ); Wersja zgodna z printdata( int ), uc awansuje do int. Copyright Roman Simiński Strona : 12
13 Overloading przeciążanie funkcji, szczegóły implementacyjne Zgodność dzięki standardowym przekształceniom typów Jeżeli nie występuje ścisła zgodność, nawet po zastosowaniu awansowania parametru aktualnego, przed następną próbą dopasowania zastosowane zostaną standardowe przekształcenia typów wg. następujących zasad : Każdy argument aktualny typu liczbowego będzie zgodny z dowolnym innym typem liczbowym parametru formalnego. Każdy argument aktualny typu wyliczeniowego będzie zgodny z dowolnym typem liczbowym parametru formalnego. Literał 0 będzie zgodny z parametrem formalnym typu wskaźnikowego jak i typu liczbowego. Wskaźnik do dowolnego typu będzie zgodny z parametrem formalnym typu void *. void printdata( int ); void printdata( float); printdata( 3.14 ); void printdata( int ); printdata( 3.14 ); Dwa możliwe przekształcenia, odwołanie niejednoznaczne. Wersja printdata( int ), standardowe przekształcenie, nieco dziwne być może.... Copyright Roman Simiński Strona : 13
14 Overloading przeciążanie funkcji, szczegóły implementacyjne Zgodność dzięki przekształceniom typów definiowanym przez programistę Jeżeli żaden z poprzednich sposobów nie doprowadził do dopasowania parametrów to dokonuje się zdefiniowanych przez programistę przekształceń typów o ile takie istnieją. Definiowanie przekształceń typów dotyczy klas, dla nich można definiować operatory zwane operatorami przekształcenia typu. Pozwalają one na zdefiniowanie sposobu konwersji obiektu pewnej klasy na obiekt zadanego typu. Szczegółowe omówienie operatorów przekształcenia typów nastąpi później. Copyright Roman Simiński Strona : 14
15 Overloading przeciążanie funkcji, szczegóły implementacyjne Od klasy do typu wbudowanego z operatorem konwersji typu: class Integer64 public: operator int();... ; Operator przekształcenia obiektu klasy Integer64 do typu int. Integer64 i; void printdata( int ); void printdata( float ); printdata( i ); Wersja fun( int ), wg. przekształcenia w klasie Integer64. Copyright Roman Simiński Strona : 15
16 Overloading przeciążanie funkcji, szczegóły implementacyjne Zgodność dzięki przekształceniom typów definiowanym przez programistę, cd.... Kompilator będzie w trakcie dopasowywania parametrów będzie używał konwersji konstruktorowych. Polega ona na niejawnym utworzeniu obiektu tymczasowego i zainicjowaniu go odpowiednim konstruktorem. Jeżeli w jakieś klasie C istnieje konstruktor posiadający pojedynczy parametr typu T, to kompilator użyje tego konstruktora zawsze, gdy konieczna jest konwersja obiektu typu T na obiekt klasy C. Copyright Roman Simiński Strona : 16
17 Overloading przeciążanie funkcji, szczegóły implementacyjne Od typu wbudowanego do klasy, z wykorzystaniem konstruktora: class Integer64 public: Integer64(); Integer64( int i );... ; void printdata( Integer64 & num ); printdata( 1 ); Wersja printdata( Integer64 & ) Utworzenie niejawnego obiektu tymczasowego i zainicjowanie go konstruktorem Integer64( int ): printdata( Integer64( 1 ) ) Działa to również w sposób analogiczny w przypadku konwersji pomiędzy dwoma klasami. Copyright Roman Simiński Strona : 17
18 Overloading przeciążanie funkcji, szczegóły implementacyjne Wywołania z wieloma parametrami Następuje próba dopasowania każdego argumentu wg. zasad podanych wcześniej. Stosowany jest algorytm koniunkcji (ang. intersection rule). Wybiera się wersje o co najmniej takiej samej zgodności każdego z parametrów oraz typuje się tą wersję, która posiada najpełniejsze dopasowanie dla przynajmniej jednego parametru. Odwołanie uznaje się za niejednoznaczne, jeżeli: żadna wersja nie posiada parametru najbardziej zgodnego, więcej niż jedna wersja zawiera najpełniej zgodny parametr. void fun( int, int ); void fun( char *, int ); fun( 0, 'a' ); void fun( int, int ); void fun( long, long ); int i, j; fun( i, j ); void fun( int, int ); void fun( double, double ); fun( 'a', 3.14f ); Wersja fun( int, int ), pełna zgodność dla 0 z int oraz równa zgodność 'a' w obu wersjach. Nie istnieje najpełniejsze dopasowanie Dwie funkcje posiadają parametr najbardziej zgodny. Copyright Roman Simiński Strona : 18
19 Overloading przeciążanie funkcji, szczegóły implementacyjne Wywołania z parametrami domyślnymi Dla funkcji z parametrami domyślnymi stosuje się zwykłe zasady dopasowania, zgodność może dotyczyć zarówno wersji z bez parametrów domyślnych jak i wersji z parametrami. void printdata( int ); void printdata( long, int = 0 ); printdata( 0, 0 ); Wersja zgodna z printdata( long, int ) printdata( 0 ); Wersja zgodna z printdata( int ) printdata( 10L ); Wersja zgodna z printdata( long, int ) printdata( 3.14 ); Wywołanie niejednoznaczne Copyright Roman Simiński Strona : 19
20 Overloading przeciążanie funkcji, podsumowanie Przeciążanie funkcji krótkie podsumowanie Dzięki możliwości przeciążania funkcji: programista może stosować jednakowe, spójne nazwy funkcji mimo różnic w typach i liczbie parametrów, poszczególne wersje funkcji mogą być prostsze i łatwiejsze do napisania, być może niektóre wersje funkcji będą wyraźnie szybsze. int sqrt( int num ); float sqrt( float num ); double sqrt( double num ); Dobór odpowiedniej wersji funkcji przeciążonej: odbywa się na etapie kompilacji i jest pamiętany w kodzie wynikowym, nie wpływa na efektywność wykonania programu, jest prosty i oczywisty w przypadkach jednoznacznych, może powodować błędy kompilacji kub nieprzewidziane zachowanie kodu w przypadku gdy parametry wywołania nie pasują do parametrów formalnych funkcji. Copyright Roman Simiński Strona : 20
21 Overloading przeciążanie funkcji, podsumowanie Przeciążanie funkcji uwagi na zakończenie Z funkcjami przeciążonymi wiąże się jeszcze kilka istotnych zagadnień: Przeciążone funkcje składowe klas, Przeciążone funkcje składowe klas w hierarchii klas, Przeciążanie funkcji a zasięg identyfikatorów. Przeciążone funkcje składowe kontra funkcje wirtualne, czyli jak jest różnica pomiędzy przeciążaniem a redefinicją. Przeciążone funkcje kontra funkcje wzorcowe, czyli kiedy przeciążać funkcje a kiedy definiować ją z wykorzystaniem wzorców (szablonów). Mówiąc o przeciążaniu funkcji autorzy książek często używają pojęcia polimorfizmu funkcji. Jednak pojęcie polimorfizmu występuje głównie w kontekście obiektów wykorzystujących metody wirtualne. W obu tych kontekstach rozumienie polimorfizmu może być nieco inne. Wiele interesujących informacji na funkcji przeciążonych zawiera książka: S.B. Lippman, J. Lajoie, Podstawy języka C++,WNT, oraz jej poprzednie wersje. Copyright Roman Simiński Strona : 21
22 Overloading przeciążanie funkcji, podsumowanie Przeciążanie funkcji czy bez tego można się obejść? Zamiast przeciążania funkcji można zdefiniować jej różne wersje i ręcznie zaopatrzyć je w odpowiedni przedrostek lub przyrostek: void printdataint ( int num ); void printdatalong ( long num ); void printdatadouble( double num ); Albo napisać to jak w starym, dobrym C: enum DataTypes INT, LONG, DOUBLE ; printdata( INT, &in ); void printdata( int datatype, void * data ) printdata( LONG, &ln ); printdata( DOUBLE, &dn ); switch( datatype ) case INT : cout << "Liczba int: "; cout << *( ( int * )data ) << endl; break; case LONG : cout << "Liczba long: "; cout << *( ( long * )data ) << endl; break; case DOUBLE : cout << "Liczba double: "; cout << *( ( double * )data ) << endl; break; Copyright Roman Simiński Strona : 22
23 Przeciążanie operatorów koncepcja Problem Należy napisać program realizujący obliczenia dla układów prądu sinusoidalnie zmiennego. Do realizacji tych obliczeń wykorzystuje się liczby zespolone do tego celu należy zbudować klasę reprezentującą liczbę zespoloną, klasę Complex. Podbudowa teoretyczna W świecie liczb rzeczywistych zakłada się nieistnienie pierwiastka z liczby nieujemnej. W XVI wieku wprowadzono pojęcie jednostki urojonej i o własności: i 2 = 1. Można z tego wysnuć wniosek, że, w istocie jednak niepoprawny, dlatego że dalej nie pierwiastkuje sie liczb ujemnych.. Za liczbę zespoloną z przyjmuje się zatem liczbę w następującej postaci: z = a + bi, gdzie i 2 = 1 Liczbę (rzeczywistą) a nazywamy częścią rzeczywistą, zaś liczbę b częścią urojoną liczby zespolonej z. Podstawowe operacje na liczbach zespolonych w tej postaci: (a+bi)+(c+di)=(a+c)+(b+d)i (a+bi)-(c+di)=(a-c)+(b-d)i (a+bi) (c+di)=(ac-bd)+(bc+ad)i. a+ bi ( ac + bd) ( bc - ad) = + i c + di ( c 2 + b 2 ) ( c 2 + b 2 ) Copyright Roman Simiński Strona : 23
24 Przeciążanie operatorów koncepcja Klasa Complex pierwsza wersja class Complex public: // Konstruktor ogólny dzięki parametrom domyślnym staje sie te ż // domyślnym, konstruktor kopiujący nie jest konieczny. Complex( double re = 0, double im = 0 ); // Akcesory double getreal() const; double getimag() const; void setreal( double newval ); void setimag( double newval ); private: double real; // Część rzeczywista double imag; // Część urojona ; Copyright Roman Simiński Strona : 24
25 Przeciążanie operatorów koncepcja Klasa Complex pierwsza wersja, implementacja funkcji składowych Complex::Complex( double re, double im ) : real( re ), imag( im ) double Complex::getReal() const return real; double Complex::getImag() const return imag; void Complex::setReal( double newval ) real = newval; void Complex::setImag( double newval ) imag = newval; Copyright Roman Simiński Strona : 25
26 Przeciążanie operatorów koncepcja Klasa Complex jak ją wykorzystać? Complex z1; // Konstruktor: z1.complex(); parametr domyślny! Complex z2( 2 ); // Konstruktor: z2.complex( 2 ); parametr domyślny! complex z3( 1, 1 ); // Konstruktor: z2.complex( 1, 1 ); // Dodawanie liczb zespolonych wersja siermiężna z1.setreal( z2.getreal() + z3.getreal() ); z1.setimag( z2.getimag() + z3.getimag() ); Czy nie można tak: // Działania na liczbach zespolonych wersja poprawiona z1 = z2 + z3;... z1 = z2 * z3;... Można! Tylko skąd kompilator ma wiedzieć, jak dodawać, mnożyć, dzielić czy odejmować liczby zespolone? Należy go tego nauczyć! Polega to na związaniu z klasą Complex zestawu operatorów, realizujących określone działania zgodnie z intencjami programisty. Copyright Roman Simiński Strona : 26
27 Przeciążanie operatorów koncepcja Operatory są w naturalny sposób przeciażone Koncepcja przeciążania w przypadku operatorów jest oczywista i całkiem naturalna. Operatory potrafią wykonywać określone działania dla danych różnych typów; int ia, ib, ic;... ic = ia + ib; float fa, fb, fc;... fc = fa + fb; Również w innych językach operatory są w naturalny sposób przeciążone, niejednokrotnie nie tylko dla typów liczbowych (język Pascal, impl. Borland): Var SA, SB, SC : String;... SA := 'Operatory s ą '; SB := 'przeciążone robot ą'; SC := SA + SB; WriteLn( SC ); Copyright Roman Simiński Strona : 27
28 Przeciążanie operatorów koncepcja Jak zmusić operatory języka C++ do działania zgodnie z rachunkiem liczb zespolonych? Koncepcja przeciążania operatorów w języku C++ nie jest nowa. Nowością jest potraktowanie użycia operatora jako wywołania specjalnej funkcji, zwanej funkcją operatorową. Programista może napisać dla większości operatorów specjalne funkcje, określające sposób działania danego operatora dla argumentów, z których przynajmniej jeden jest obiektem. Generalne zasady wykorzystania funkcji operatorowych Nie wolno zmieniać znaczenia operatora określonego dla wbudowanych typów danych. Nie wolno budować nowych operatorów. Przynajmniej jeden argument funkcji operatorowej musi być obiektem jakiejś klasy. Nie wolno zmieniać zdefiniowanych pierwotnie reguł pierwszeństwa operatorów. Musi być zachowana liczba argumentów operatora. Copyright Roman Simiński Strona : 28
29 Przeciążanie operatorów koncepcja Operatory jako funkcje, użycie operatora jako wywołanie funkcji Weźmy pod lupę operator przypisania = Complex z1; Complex z2( 1, 2 ); z1 = z2; Czy takie zastosowanie zgodne jest ustalonymi zasadami? Tak, bowiem: oba argumenty są obiektami klasy; Jest to istniejący operator z dozwolonego zestawu, nie następuje zmiana reguł pierwszeństwa i liczby argumentów. Definiujemy funkcje operatorową dla operatora = klasy Complex class Complex public:... void operator = ( Complex & z );... ; Copyright Roman Simiński Strona : 29
30 Przeciążanie operatorów koncepcja Operatory jako funkcje, użycie operatora jako wywołanie funkcji, cd.... Implementacja funkcji operatorowej void Complex::operator = ( Complex & z ) real = z.real; // Lub setreal( z.getreal() ); imag = z.imag; // Lub setimag( z.getimag() ); Jak to działa? Complex z1; Complex z2( 1, 2 ); z1 = z2; Wywołanie: z1.operator=( z2 ); real: imag: z1 1 2 real: imag: z2 1 2 void Complex::operator = ( Complex & z ) real = z.real; imag = z.imag; Copyright Roman Simiński Strona : 30
31 Przeciążanie operatorów operator przypisania = Czy nasz operator przypisania jest dobry i w tym przypadku? Complex z1; Complex z2; complex z3( 1, 2 ); z1 = z2 = z3; z2.operator = ( z3 ) Wywołanie: z1.operator = (? ); Complex & Complex::operator = ( Complex & z ) real = z.real; imag = z.imag; return *this; this w obrębie definicji każdej funkcji składowej klasy występuje wskaźnik this. Wskazuje on zawsze na obiekt, dla którego została wywołana dana funkcja składowa. real: imag: z1 1 2 real: imag: z2 1 2 real: imag: z3 1 2 z1.operator = ( z2.operator = ( z3 ) ); Copyright Roman Simiński Strona : 31
32 Przeciążanie operatorów operator przypisania = Operator przypisania, analizy ciąg dalszy A co gdy napiszemy tak? z1 = z1; Zabezpieczenie przed przypisaniem do samego siebie Complex & Complex::operator = ( const Complex & z ) if( &z!= this ) real = z.real; imag = z.imag; Przy okazji, umieszczenie const pozwala na: const Complex a( 0, 0 ); Complex b; return *this; b = a; Operator przypisania kontra konstruktor kopiujący Complex z1( 1, 2 ); Complex z2 = z1; Konstruktor kopiujący z2 = z1; Operator przypisania Copyright Roman Simiński Strona : 32
33 Przeciążanie operatorów operator przypisania = Czy musimy przeciążać operator = i definiować konstruktor kopiujący? Jeżeli operator przypisania nie jest jawnie zdefiniowany dla danej klasy, a jest potrzebny kompilatorowi, generuje on domyślny operator przypisania, realizujący kopiowanie pole-po-polu. Jeżeli konstruktor kopiujący nie jest jawnie zdefiniowany dla danej klasy, a jest potrzebny kompilatorowi, realizuje on inicjalizację obiektu wykorzystując kopiowanie pole-po-polu. No to w końcu używać, nie używać? Stosowanie konstruktora kopiującego i przeciążonego operatora przypisania jest dobrą, programistyczną praktyką. Dzięki jawnym definicjom programista ma kontrolę nad kopiowaniem wartości, występujących w wielu, czasem zaskakujących sytuacjach. Naprawdę mało klas jest tak prostych, że nie potrzebują konstruktora kopiującego ani przeciążonego operatora przypisania. Operator przypisania jest nierozerwalnie związany z klasą i może być definiowany jedynie jako funkcja składowa klasy. Copyright Roman Simiński Strona : 33
34 Przeciążanie operatorów operator przypisania = Klasa Complex po poprawkach class Complex public: // Konstruktory Complex( double re = 0, double im = 0 ); Complex( const Complex & z ); // Akcesory double getreal() const; double getimag() const; void setreal( double newval ); void setimag( double newval ); // Operator przypisania Complex & operator = ( const Complex & z ); private: double real; // Część rzeczywista double imag; // Część urojona ; Copyright Roman Simiński Strona : 34
35 Przeciążanie operatorów operator przypisania = Klasa Complex po poprawkach, cd.... // Konstruktory Complex::Complex( double re, double im ) : real( re ), imag( im ) Complex::Complex( const Complex & z ) : real( z.real ), imag( z.imag ) // Akcesory double Complex::getReal() const return real; double Complex::getImag() const return imag; void Complex::setReal( double newval ) real = newval; void Complex::setImag( double newval ) imag = newval; // Operator przypisania Complex & Complex::operator = ( const Complex & z ) if( &z!= this ) real = z.real; imag = z.imag; return *this; Copyright Roman Simiński Strona : 35
36 Przeciążanie operatorów operator dodawania + Chcemy dodawać liczby zespolone Complex z1; Complex z2( 2 ); complex z3( 1, 1 ); z1 = z2 + z3; Rozszerzamy klasę Complex o przeciążony operator dodawania class Complex public:... Complex operator + ( const Complex & z );... ; Implementacja, wersja 1-sza Complex Complex::operator + ( const Complex & z ) Complex tmp; // Obiekt tymczasowy do przechowania sumy tmp.real = real + z.real; tmp.imag = imag + z.imag; return tmp; Copyright Roman Simiński Strona : 36
37 Przeciążanie operatorów operator dodawania + Jak to działa? Complex z1; Complex z2( 2 ); complex z3( 1, 1 ); z2 + z3; Wywołanie: z2.operator + ( z3 ); Razem z operatorem przypisania z1 = z2 + z3; Wywołanie: z1.operator = ( z2.operator + ( z3 ) ); Implementacja, wersja 2-ga Complex Complex::operator + ( const Complex & z ) return Complex( real + z.real, imag + z.imag ); Dlaczego rezultat operatora + nie jest referencją? W C i C++ rezultatem funkcji nie powinien być wskaźnik ani referencja do zmiennych automatycznych funkcji. Te lokowane są zwykle na stosie i po zakończeniu działania funkcji przestają istnieć. Copyright Roman Simiński Strona : 37
38 Przeciążanie operatorów operator odejmowania - Chcemy odejmować liczby zespolone Complex z1; Complex z2( 2 ); complex z3( 1, 1 ); z1 = z2 - z3; Rozszerzamy klasę Complex o przeciążony operator odejmowania class Complex public:... Complex operator - ( const Complex & z );... ; Implementacja operatora - Complex Complex::operator - ( const Complex & z ) return Complex( real - z.real, imag - z.imag ); Copyright Roman Simiński Strona : 38
39 Przeciążanie operatorów operator - Chcemy zmienić znak liczby zespolonej Complex z1; Complex z2( 2, 2 ); z2 = -z1 Rozszerzamy klasę Complex o przeciążony operator zmiany znaki ( unarny minus ) class Complex public:... Complex operator - ( const Complex & z ); Complex operator - ();... ; Implementacja jednoargumentowego operatora - Complex Complex::operator - () return Complex( - real, - imag ); Jak to działa? z2 = -z1; z1 = z2 - z3; Wywołanie: z2.operator = ( z1.operator - () ); Wywołanie: z1.operator = ( z2.operator - ( z3 ) ); Copyright Roman Simiński Strona : 39
40 Przeciążanie operatorów funkcja składowa czy zwykła? Niby jest świetnie, ale... Complex z; double d; z + d; d + z; Wywołanie: z.operator + ( Complex( d ) ); Wywołanie:??? Funkcja operatorowa nie musi być (z pewnymi wyjątkami) zdefiniowana jako funkcja składowa a jako zwykła funkcja, posiadająca przynajmniej jeden argument będący obiektem. Dla jednoargumentowego operatora # oraz obiektu O: #O oznacza wywołanie funkcji składowej O.operator#(), zwykłej operator#( O ). Dla dwuoargumentowego operatora # oraz obiektów X i Y: X # Y oznacza wywołanie funkcji składowej X.operator#( Y ), zwykłej operator#( X, Y ). Copyright Roman Simiński Strona : 40
41 Przeciążanie operatorów funkcja składowa czy zwykła? Implementacja operatorów w postaci zwykłych funkcji Complex operator + ( double num, const Complex & z ) return Complex( num + z.getreal(), z.getimag() ); Nieskładowa funkcja operatorowa w akcji d + z1; Wywołanie: operator + ( d, z1 ); Z operatorem przypisania z2 = d + z1; Wywołanie: z2.operator = ( operator + ( d, z1 ) ); Copyright Roman Simiński Strona : 41
42 Przeciążanie operatorów funkcja składowa czy zwykła? Nieskładowa funkcja operatorowa ma utrudniony dostęp do pól Complex operator + ( double num, const Complex & z ) return Complex( num + z.getreal(), z.getimag() ); Aby funkcja nieskładowa miała wygodniejszy dostęp do pól klasy, może się z nią zaprzyjaźnić. Taka funkcja może mieć bezpośredni dostęp do prywatnych pól klasy. Nieskładowa, zaprzyjaźniona funkcja operatorowa class Complex... friend Complex operator + ( double num, const Complex & z );... ; Complex operator + ( double num, const Complex & z ) return Complex( num + z.real, z.imag ); Copyright Roman Simiński Strona : 42
43 Przeciążanie operatorów funkcja składowa czy zwykła? Nieskładowa funkcje operatorowe na każdą okazję class Complex... friend Complex operator + ( double num, const Complex & z ); friend Complex operator + ( const Complex & z, double num ); friend Complex operator + ( const Complex & z1, const Complex & z2 );... ; Complex operator + ( double num, const Complex & z ) return Complex( num + z.real, z.imag ); Complex operator + ( const Complex & z, double num ) return Complex( num + z.real, z.imag ); Complex operator + ( const Complex & z1, const Complex & z2 ) return Complex( z1.real + z2.real, z1.imag + z2.imag ); Copyright Roman Simiński Strona : 43
44 Przeciążanie operatorów funkcja składowa czy zwykła? Wykorzystanie funkcji nieskładowych z2 = 2 + z3; z4 = z3 + 2; z1 = z2 + z3; z2.operator = ( operator + ( double, Complex ) ); z4.operator = ( operator + ( Complex, double ) ); z1.operator = ( operator + ( Complex, Complex ) ); A gdyby tak pozostawić tylko jedną funkcję nieskładową? class Complex... friend Complex operator + ( const Complex & z1, const Complex & z2 );... ; z2 = 2 + z3; z4 = z3 + 2; z1 = 2 + 3; z2.operator=( operator+( Complex(double), Complex ) ); z4.operator=( operator+( Complex, Complex(double) ) ); z1.operator=(operator+(complex(double),complex(double))); Copyright Roman Simiński Strona : 44
45 Przeciążanie operatorów przeciążanie operatorów ++ i Problem dwie wersje operatorów ++ i z1++; ++z1; --z2; z2--; Do wersji 3.0 języka C++ nie istniało rozróżnienie pomiędzy operatorami w wersji przedrostkowej i przyrostkowej. Teraz wersja przyrostkowa obsługiwana jest przez funkcję operatorową, definiowaną z parametrem typu int. Nie odgrywa on żadnego znaczenia praktycznego, jest istotny ze względu na syntaktykę języka. Rozszerzamy klasę Complex o przeciążone operatory ++ i class Complex public:... Complex & operator ++ (); Complex operator ++ ( int );... Complex & operator -- (); Complex operator -- ( int );... ; // Postać przedrostkowa // Postać przyrostkowa // Postać przedrostkowa // Postać przyrostkowa Copyright Roman Simiński Strona : 45
46 Przeciążanie operatorów przeciążanie operatorów ++ i Implementacja operatorów przedrostkowych Complex & Complex::operator ++ () ++real; Zwiększ część rzeczywistą i urojoną o 1 ++imag; return *this; Oddaj zmodyfikowany obiekt Complex & Complex::operator -- () --real; --imag; Zmniejsz część rzeczywistą i urojoną o 1 return *this; Oddaj zmodyfikowany obiekt Wywołanie operatorów przedrostkowych z1 = ++z2; z1 = --z2; Wywołanie: z1.operator = ( z2.operator ++ () ); Wywołanie: z1.operator = ( z2.operator -- () ); Copyright Roman Simiński Strona : 46
47 Przeciążanie operatorów przeciążanie operatorów ++ i Implementacja operatorów przyrostkowych Complex Complex::operator ++ ( int ) Complex copy; Zapamiętaj w copy wartość obiektu przed inkrementacją copy = *this; ++real; ++imag; return copy; Zwróć kopię wartości obiektu z przed inkrementacji Complex Complex::operator -- ( int ) Complex copy( *this ); --real; --imag; return copy; Tu nieco krócej konstruktor kopiujący Wywołanie operatorów przyrostkowych z1 = z2++; z1 = z2--; Wywołanie: z1.operator = ( z2.operator ++ (0) ); Wywołanie: z1.operator = ( z2.operator -- (0) ); Copyright Roman Simiński Strona : 47
48 Przeciążanie operatorów wirtualna tablica FileArray Problem Zdefiniować klasę FileArray, przechowującą znaki w pliku, pozwalającą na wykonywanie operacji zbliżonych do tych, które wolno wykonać na zwykłej tablicy. FileArray tab( "temp.dat" ); if( tab.ready() ) for( int i = 0; i < 26; i++ ) tab[ i ] = 'A' + i; for( int i = 0; i < tab.size(); i++ ) cout << tab[ i ]; Copyright Roman Simiński Strona : 48
49 Przeciążanie operatorów wirtualna tablica FileArray Definicja klasy class FileArray public: FileArray( char * filename ); ~FileArray(); bool ready() const; Te funkcje operatorowe są tu najważniejsze FileArray & operator = ( char c ); FileArray & operator [] ( long ); operator char(); long size() const; private: FILE * file; void operator &() ; ; Nie pozwól pobrać adresu tej tablicy! Copyright Roman Simiński Strona : 49
50 Przeciążanie operatorów wirtualna tablica FileArray Definicja funkcji składowych FileArray::FileArray( char * filename ) : file( 0 ) file = fopen( filename, "w+b" ); FileArray::~FileArray() if( file ) fclose( file ); bool FileArray::ready() const return ( file!= 0 ); long FileArray::size() const long currpos = ftell( file ); fseek( file, 0, SEEK_END ); long len = ftell( file ); fseek( file, currpos, SEEK_SET ); return len; Copyright Roman Simiński Strona : 50
51 Przeciążanie operatorów wirtualna tablica FileArray Definicja funkcji składowych FileArray & FileArray::operator = ( char c ) if( file ) fputc( c, file ); fflush( file ); return *this; FileArray & FileArray::operator [] ( long i ) if( file ) fseek( file, i, SEEK_SET ); return *this; FileArray::operator char() if( file ) fgetc( file ); Copyright Roman Simiński Strona : 51
52 Przeciążanie operatorów wirtualna tablica FileArray Definicja funkcji składowych FileArray tab( "temp.dat" ); if( tab.ready() ) cout << "Zapisywanie" << endl; for( int i = 0; i < 26; i++ ) tab[ i ] = 'A' + i; cout << char( 'A' + i ); tab.operator[](i).operator=( 'A' + i ); cout << endl << "Rozmiar tablicy: " << tab.size() << endl; cout << "Odczytywanie:" << endl; for( int i = 0; i < tab.size(); i++ ) cout << tab[ i ]; tab.operator[]( i ).operator char(); Copyright Roman Simiński Strona : 52
53 Przeciążanie operatorów podsumowanie Operatory, które można przeciążać Operatory, których przeciążać nie wolno Czego nie wolno a co trzeba + - * / % ~ & ^!, = < > <= >= << >> ==!= && += -= /= %= ^= &= = *= <<= >>= [] () -> ->* new delete ::.*.?: Nie wolno zmieniać znaczenia operatora określonego dla wbudowanych typów danych. Nie wolno budować nowych operatorów. Przynajmniej jeden argument funkcji operatorowej musi być obiektem jakiejś klasy. Nie wolno zmieniać zdefiniowanych pierwotnie reguł pierwszeństwa operatorów. Musi być zachowana liczba argumentów operatora. Copyright Roman Simiński Strona : 53
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
Bardziej szczegółowoC++ - 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
Bardziej szczegółowoPodstawy programowania w języku C i C++
Podstawy programowania w języku C i C++ Część czwarta Operatory i wyrażenia Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu,
Bardziej szczegółowoWprowadzenie do programowanie obiektowego w języku C++
Wprowadzenie do programowanie obiektowego w języku C++ Część czwarta 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
Bardziej szczegółowoProgramowanie 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
Bardziej szczegółowoPodstawy programowania w języku C++
Podstawy programowania w języku C++ Część dziewiąta Tablice a zmienne wskaźnikowe Wersja skrócona, tylko C++ Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie
Bardziej szczegółowoIMIĘ 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
Bardziej szczegółowoC++ - 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
Bardziej szczegółowoStrona 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
Bardziej szczegółowoPrzeciąż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
Bardziej szczegółowoSzablony funkcji i szablony klas
Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument
Bardziej szczegółowoPodstawy programowania w języku C++
Podstawy programowania w języku C++ Część siódma Przetwarzanie tablic znaków Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu,
Bardziej szczegółowoTEMAT : 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ą
Bardziej szczegółowoC++ Przeładowanie operatorów i wzorce w klasach
C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje
Bardziej szczegółowoPARADYGMATY 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
Bardziej szczegółowoPodstawy programowania w języku C++
Podstawy programowania w języku C++ Część ósma Zmienne wskaźnikowe koncepcja, podstawowe zastosowania Wersja skrócona, tylko C++ Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski
Bardziej szczegółowoWykł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
Bardziej szczegółowoPARADYGMATY 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
Bardziej szczegółowo1. 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
Bardziej szczegółowoFunkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów
Funkcje. Spotkanie 5 Dr inż. Dariusz JĘDRZEJCZYK Tworzenie i używanie funkcji Przekazywanie argumentów do funkcji Domyślne wartości argumentów Przeładowanie nazw funkcji Dzielenie programu na kilka plików
Bardziej szczegółowoPodstawy programowania
Podstawy programowania Część siódma Przetwarzanie tablic znaków Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Niniejsze opracowanie zawiera skrót treści wykładu,
Bardziej szczegółowoSzablony. Szablony funkcji
Szablony Szablony sa mechanizmem ponownego wykorzystania kodu (reuse) W przypadku funkcji ponownie wykorzystany jest algorytm W przypadku klas ponownie wykorzystane sa wszystkie skladowe Deklaracja szablonu
Bardziej szczegółowoWykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:
Program przedmiotu Programowanie Obiektowe (język C++) Wykład 1. Definiowanie prostych klas. Przykłady. Przypomnienie: typy referencyjne, domyślne wartości argumentów, przeciąŝanie funkcji. Konstruktory,
Bardziej szczegółowoAutomatyczne 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
Bardziej szczegółowoObszar 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
Bardziej szczegółowoJęzyki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński
Języki programowania Część druga Przetwarzanie tablic znaków Autorzy Tomasz Xięski Roman Simiński Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim
Bardziej szczegółowoJava - 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
Bardziej szczegółowoWprowadzenie do szablonów szablony funkcji
Wprowadzenie do szablonów szablony funkcji Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do
Bardziej szczegółowoWprowadzenie do szablonów szablony funkcji
Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego.
Bardziej szczegółoworeferencje 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
Bardziej szczegółowoWstę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
Bardziej szczegółowoWykł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
Bardziej szczegółowoTechniki 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
Bardziej szczegółowoAutomatyczne 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
Bardziej szczegółowoWykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej
Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest
Bardziej szczegółowoFunkcje 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).
Bardziej szczegółowoDr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI
Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku
Bardziej szczegółowoPROE 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
Bardziej szczegółowoTechniki 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
Bardziej szczegółowoSzablony 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
Bardziej szczegółowoWstęp do programowania
wykład 10 Agata Półrola Wydział Matematyki i Informatyki UŁ semestr zimowy 2018/2019 Przesyłanie argumentów - cd Przesyłanie argumentów do funkcji - tablice wielowymiarowe Przekazywanie tablic wielowymiarowych
Bardziej szczegółowoAutomatyczne 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
Bardziej szczegółowo1. 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
Bardziej szczegółowoProgramowanie 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
Bardziej szczegółowoC++ - 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
Bardziej szczegółowoProgramowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 14 Katarzyna Grzelak 3 czerwca 2019 K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27 Na ostatnim wykładzie: Konstruktor standardowy (domyślny) to taki, który nie ma żadnych argumentów
Bardziej szczegółowoPodstawy 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
Bardziej szczegółowoJę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
Bardziej szczegółowoProgramowanie 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];
Bardziej szczegółowoJĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Bardziej szczegółowoInformacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Bardziej szczegółowoProgramowanie obiektowe
Programowanie obiektowe Wykład 2: Wstęp do języka Java 3/4/2013 S.Deniziak: Programowanie obiektowe - Java 1 Cechy języka Java Wszystko jest obiektem Nie ma zmiennych globalnych Nie ma funkcji globalnych
Bardziej szczegółowoPrzeciążenie (przeładowanie nazw) funkcji
Przeciążenie (przeładowanie nazw) funkcji dla większości języków (w tym C) zasada w programie może być tylko jedna funkcja o danej nazwie kompilator C++ - dopuszcza więcej niż jedną funkcję o tej samej
Bardziej szczegółowoInformatyka 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
Bardziej szczegółowoDodatkowo klasa powinna mieć destruktor zwalniający pamięć.
Zadanie 1. Utworzyć klasę reprezentującą liczby wymierne. Obiekty klasy powinny przechowywać licznik i mianownik rozłożone na czynniki pierwsze. Klasa powinna mieć zdefiniowane operatory czterech podstawowych
Bardziej szczegółowo1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Bardziej szczegółowoclass Student Deklaracja klasy Osoba: Deklaracja klasy Student:
Osoba Student Będziemy mieli 2 klasy: Osoba, dla której zapamiętamy dane takie jak: imie, nazwisko i wiek Oraz klasę Student, w której będziemy też dodatkowo pamiętać kierunek studiów. Deklaracja klasy
Bardziej szczegółowoPrzeciąż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
Bardziej szczegółowoWykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:
Program przedmiotu Programowanie (język C++) Wykład 1. Język C a C++. Definiowanie prostych klas. Typy referencyjne. Domyślne wartości argumentów. PrzeciąŜanie funkcji. Konstruktory, destruktory. Definiowanie
Bardziej szczegółowoKlasa 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
Bardziej szczegółowoZmienne, stałe i operatory
Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe
Bardziej szczegółowoZaawansowane programowanie w języku C++ Przeciążanie operatorów
Zaawansowane programowanie w języku C++ Przeciążanie operatorów Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
Bardziej szczegółowoPodstawy programowania w języku C++
Podstawy programowania w języku C++ Część trzynasta Tablice struktur, pliki struktur Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści
Bardziej szczegółowoLab 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
Bardziej szczegółowoAbstrakcyjny typ danych
Abstrakcyjny typ danych Abstrakcyjny Typ Danych (abstract data type-adt): zbiór wartości wraz z powiązanymi z nimi operacjami; operacje są zdefiniowane w sposób niezależny od implementacji; operacje są
Bardziej szczegółowo2. 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
Bardziej szczegółowoW2 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;
Bardziej szczegółowoSzablony funkcji i klas (templates)
Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp
Bardziej szczegółowoMETODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Bardziej szczegółowoProgramowanie 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
Bardziej szczegółowoZaawansowane programowanie w C++ (PCP)
Zaawansowane programowanie w C++ (PCP) Wykład 6 - szablony. dr inż. Robert Nowak - p. 1/15 Kolekcje i algorytmy» Deklaracja szablonu y Pojęcia niezależne od typu: kolekcje (np. listy) algorytmy (np. znajdowania
Bardziej szczegółowoPodstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Bardziej szczegółowoEGZAMIN 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
Bardziej szczegółowoPodstawy programowania w języku C++
Podstawy programowania w języku C++ Część dziesiąta Rekordy w C/C++ struktury Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Niniejsze opracowanie zawiera skrót
Bardziej szczegółowoMATERIAŁY DO ZAJĘĆ II
MATERIAŁY DO ZAJĘĆ II Zmienne w C# Spis treści I. Definicja zmiennej II. Hierarchia typów (CTS) III. Typy wbudowane IV. Deklaracja zmiennych V. Literały VI. Pobieranie i wypisywanie wartości zmiennych
Bardziej szczegółowoInformatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki
Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1 Plan wykładu
Bardziej szczegółowoKonstruktor 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
Bardziej szczegółowoJęzyki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński
Języki programowania Część siódma Przetwarzanie plików amorficznych Konwencja języka C Autorzy Tomasz Xięski Roman Simiński Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie
Bardziej szczegółowoJęzyk ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Bardziej szczegółowoWykł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
Bardziej szczegółowoJę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
Bardziej szczegółowoProgramowanie 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
Bardziej szczegółowoKonstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.
Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class
Bardziej szczegółowoProgramowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ
programowanie w C++ dla OWK Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ 1 Streszczenie W tym rozdziale podamy kilka najprostszych przykładów programów
Bardziej szczegółowoWyliczanie 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
Bardziej szczegółowoPROE 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
Bardziej szczegółowoPodstawy 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
Bardziej szczegółowoWprowadzenie do programowania w języku C
Wprowadzenie do programowania w języku C Część trzecia 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
Bardziej szczegółowoObiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Bardziej szczegółowoProgramowanie 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
Bardziej szczegółowoJęzyki programowania obiektowego Nieobiektowe elementy języka C++
Języki programowania obiektowego Nieobiektowe elementy języka C++ Roman Simiński roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Przetwarzanie tablic znaków Łańcuchy znakowe jako tablice znaków
Bardziej szczegółowo1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.
Bardziej szczegółowoROZDZIAŁ 2. Operatory
Bibliografia [1] Jerzy Grębosz, Symfonia C++, Oficyna Kallimach, Kraków, 1999, [2] Jerzy Grębosz, Pasja C++, Oficyna Kallimach, Kraków, 1999, [3] Bjarne Stroustrup, Język C++, WNT, Warszawa, 1997, [4]
Bardziej szczegółowoJava. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego
Bardziej szczegółowoWiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java
Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java Cechy C++ Język ogólnego przeznaczenia Można programować obiektowo i strukturalnie Bardzo wysoka wydajność kodu wynikowego
Bardziej szczegółowoJęzyki i metody programowania Java. Wykład 2 (część 2)
Języki i metody programowania Java INF302W Wykład 2 (część 2) Autor Dr inż. Zofia Kruczkiewicz 1 Struktura wykładu 1. Identyfikacja danych reprezentowanych przez klasy podczas opracowania koncepcji prostego
Bardziej szczegółowo1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Bardziej szczegółowoC++ - 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
Bardziej szczegółowoTypy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura
Programowanie komputerów Programowanie obiektowe. Typy zmiennych proste i złożone Typy zmiennych "wbudowane", tj. identyfikowane przez słowa kluczowe, są określane jako proste: int short long float double
Bardziej szczegółowoWykład 9 2014-06-20 09:37 PP2_W9
Wykład 9 Przykłady programów z wykorzystaniem klas - przykład funkcji operatorowych - obiektowa implementacja listy jednokierunkowej kopiowanie obiektów - klasa "latający napis" Pozycjonowanie w plikach
Bardziej szczegółowo