Programowanie w języku C++

Podobne dokumenty
Programowanie w języku C++

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Wprowadzenie do programowanie obiektowego w języku C++

Podstawy programowania w języku C++

Podstawy programowania w języku C i C++

Podstawy programowania

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Szablony funkcji i szablony klas

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

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

Podstawy programowania w języku C++

PARADYGMATY PROGRAMOWANIA Wykład 3

Wykład 4: Klasy i Metody

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

Szablony. Szablony funkcji

Szablony klas, zastosowanie szablonów w programach

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Paradygmaty programowania. Paradygmaty programowania

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

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

Wstęp do programowania

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

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

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

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

Programowanie w języku C++

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

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

Podstawy programowania w języku C++

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Podstawy programowania w języku C++

Wstęp do Programowania 2

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

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

Język C++ wykład VIII

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów klas

Wprowadzenie do szablonów szablony funkcji

Podstawy programowania w języku C++

Konstruktor kopiujacy

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

Programowanie obiektowe. Wykład 5. C++: szablony

Programowanie obiektowe 2005/2006. Laboratorium 1. Przeciążanie funkcji

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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.

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

Zaawansowane programowanie w C++ (PCP)

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

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

Programowanie obiektowe w C++ Wykład 12

Języki programowania obiektowego Nieobiektowe elementy języka C++

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Języki programowania. Tablice struktur, pliki struktur. Część ósma. Autorzy Tomasz Xięski Roman Simiński

Przeciążanie funkcji. Przykład 1: #include <iostream> using namespace std; double srednia(double n1, double n2) { return ((n1 + n2)/2.

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Wprowadzenie do programowania w języku C

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

Abstrakcyjny typ danych

Algorytmy i Struktury Danych. Anna Paszyńska

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Plik klasy. h deklaracje klas

Programowanie obiektowe

Szablon klasy std::list

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Wyliczanie wyrażenia obiekty tymczasowe

Techniki Programowania wskaźniki 2

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Projektowanie klas c.d. Projektowanie klas przykład

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

Programowanie obiektowe

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

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

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 obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Microsoft IT Academy kurs programowania

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

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

Programowanie i struktury danych

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

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

Programowanie i struktury danych

Programowanie Komputerów

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

tablica: dane_liczbowe

Szablon klasy std::vector

Programowanie Obiektowew języku C++ Zadania L4

ZASADY PROGRAMOWANIA KOMPUTERÓW

Programowanie komputerowe. Zajęcia 5

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

Wzorce funkcji (szablony)

Stos liczb całkowitych

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

Transkrypt:

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 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.

po co coś takiego? Przeciążanie funkcji Przeciążanie funkcji (ang. function overloading) tworzenie większej liczby funkcji o takiej samej nazwie. 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 ); Realizacje funkcji są takie same. Różnią je tylko typy argumentów i rezultatu. Definicje kolejnych funkcji przeciążonych dla innych typów, np. Complex, to powielenie tego samego schematu ze zmianą nazw typów. Copyright Roman Simiński Strona : 2

Funkcje szablonowe Funkcja w postaci esencjonalnej szablon dla funkcji add Funkcja szablonowa (ang. template function) jest ogólną postacią funkcji, określającą przepis na utworzenie funkcji skonkretyzowanej. template <typename T> T add( T a, T b ) return a + b; Deklarację funkcji szablonowej poprzedza specyfikacja: template <typename identyfikator> lub, traktowana jako przestarzała: template <class identyfikator> Identyfikator, w przypadku funkcji add to T, reprezentuje oznaczenie nieokreślonego typu. Typ zostanie określony przez kompilator przy wywołaniu funkcji, co spowoduje wygenerowanie jej skonkretyzowanej wersji. Copyright Roman Simiński Strona : 3

Funkcje szablonowe Wywołanie funkcji szablonowej Na etapie wywołania funkcji szablonowej, programista określa typ na podstawie którego kompilator tworzy postać funkcji skonkretyzowanej. cout << add<int>( 1, 2 ) << endl; cout << add<double>( 1.2, 2.5 ) << endl; 3 3.7 Konkretyzację typu można pominąć, kompilator sam określi typy na etapie wywołania: cout << add( 1, 2 ) << endl; cout << add( 1.2, 2.5 ) << endl; 3 3.7 Pozwala to uniknąć niejednoznaczności, np: cout << add<int>( 1.2, 2.5 ); 3 Copyright Roman Simiński Strona : 4

Funkcje szablonowe Wywołanie funkcji szablonowej, cd... Funkcja szablonowa może być konkretyzowana nie tylko dla typów wbudowanych: Complex a( 1, 1 ); Complex b( 2, 2 ); Complex c; c = add( a, b ); cout << c.getreal() << ' ' << c.getimag() << endl; 3 3 Przy rozpatrywanej postaci funkcji szablonowej add: template <typename T> T add( T a, T b ) return a + b; wywołanie: add( 1.2, 2 ); będzie błędne! Copyright Roman Simiński Strona : 5

Funkcje szablonowe Wywołanie funkcji szablonowej, cd... Funkcja szablonowa może otrzymywać więcej niż jeden typ uogólniony: template <typename T1, typename T2> T1 add( T1 a, T2 b ) return a + b; Przy takiej postaci funkcji szablonowej add, poniższe wywołanie będzie poprawne: add( 1.2, 2 ); 3.2 Jednak takie wywołanie: add( 2, 1.2 ); 3 Spowoduje konwersję typu rezultatu, sygnalizowaną przez niektóre kompilatory ostrzeżeniem: Copyright Roman Simiński Strona : 6

Klasy szablonowe Dynamiczna tablica jako klasa szablonowa motywacja Załóżmy, że chcemy korzystać z tablicy lb. całkowitych zmiennym rozmiarze: IntArray tab; int n; cout << "Liczba elementow: "; cin >> n; tab.expand( n ); for( int i = 0; i < n ; i++ ) tab.add( i ); for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ] << ' '; cout << endl << "Rozszerzam o trzy: " << endl; tab.add( ++n ); tab.add( ++n ); tab.add( ++n ); for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ] << ' '; Zastosowanie szablonów pozwoli na uogólnienie tej tablicy na inne typy Copyright Roman Simiński Strona : 7

Klasy szablonowe Dynamiczna tablica jako klasa szablonowa zastosowanie Tablica skonkretyzowana dla typu int: Array<int> tab; int n; cout << "Liczba elementow: "; cin >> n; tab.expand( n ); for( int i = 0; i < n ; i++ ) tab.add( i ); for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ] << ' '; cout << endl << "Rozszerzam o trzy: " << endl; tab.add( ++n ); tab.add( ++n ); tab.add( ++n ); for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ] << ' '; Copyright Roman Simiński Strona : 8

Klasy szablonowe Dynamiczna tablica jako klasa szablonowa zastosowanie Tablica skonkretyzowana dla typu float: Array<float> tab; tab.expand( 5 ); tab.add( 1.0 ); tab.add( 2.0 ); tab.add( 3.0 ); tab.add( 4.0 ); tab.add( 5.0 ); for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ] << ' '; Copyright Roman Simiński Strona : 9

Klasy szablonowe Dynamiczna tablica jako klasa szablonowa zastosowanie Tablica skonkretyzowana dla typu Complex: Array<Complex> tab; tab.expand( 5 ); tab.add( Complex( 1, 1 ) ); tab.add( Complex( 2, 2 ) ); tab.add( Complex( 3, 3 ) ); tab.add( Complex( 4, 5 ) ); tab.add( Complex( 5, 5 ) ); for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ].getreal() << ' ' << tab[ i ].getimag() << endl; // Aternatywnie, gdy klasa Complex ma przeciążony operator << : for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ] << ' '; Copyright Roman Simiński Strona : 10

Dynamiczna tablica jako klasa szablonowa jak to działa? Tablica będzie przechowywać elementy uogólnionego typu T template <class T> class Array public: //... protected: T * arr; // Wskaźnik na bufor dla obiektów typu T int len; // Długość tablicy liczba wstawionych elementów int maxlen; // Maksymalna liczba elementów int delta; // Lb. elem. o jakie tablica zostanie powiększona ; //... arr len delta... 0 1 2 3 4 5... maxlen Copyright Roman Simiński Strona : 11

Dynamiczna tablica jako klasa szablonowa jak to działa? Funkcje administracyjne template <class T> class Array public: int getlen() const return len; // Pobranie aktualnej liczby elementów int getmaxlen() const // Pobranie maksymalnej liczby elementów return maxlen; int getdelta() const // Jaki przyrostu rozmiaru gdy brak miejsca? return delta; ; T * getbegin() return arr; // Pobranie początku tablicy elementów Copyright Roman Simiński Strona : 12

Dynamiczna tablica jako klasa szablonowa jak to działa? Reprezentacja wewnętrzna na przykładzie Array<Complex> tab( 10, 3 ); tab.add( Complex( 1, 1 ) ); tab.add( Complex( 2, 2 ) ); tab.add( Complex( 3, 3 ) ); arr len: 3 delta: 3... 0 1 2 3 4 5...maxLen: 10 cout << "Dlugosc: " << tab.getlen() << endl; cout << "Max. dlugosc: " << tab.getmaxlen() << endl; cout << "Przyrost: " << tab.getdelta() << endl; for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ] << endl; for( int i = 4; i < 15; i++ ) tab.add( Complex( i, i ) ); cout << "Dlugosc: " << tab.getlen() << endl; cout << "Max. dlugosc: " << tab.getmaxlen() << endl; cout << "Przyrost: " << tab.getdelta() << endl; for( int i = 0; i < tab.getlen() ; i++ ) cout << tab[ i ] << endl; Copyright Roman Simiński Strona : 13

Konstruktory, destruktor i operator przypisania deklaracje template <class T> class Array public: // Konstruktor ogólny (i domyślny zarazem) Array( int maxsize = 0, int maxdelta = 10 ); // Konstruktor kopiujący Array( const Array &a ); // Destruktor - tablica jest niszczona virtual ~Array(); // Przeciazony operator przypisania tablic Array & operator = ( const Array &a ); protected: ; //... Copyright Roman Simiński Strona : 14

Konstruktory, destruktor i operator przypisania definicje template < class T > Array< T >::Array( int maxsize, int maxdelta ) init( maxsize, maxdelta ); template < class T > Array< T >::Array( const Array< T > &a ) copy( a ); template < class T > Array< T >::~Array() clear(); template < class T > Array< T > & Array<T>::operator = ( const Array< T > &a ) if( this!= &a ) clear(); copy( a ); return ( *this ); Copyright Roman Simiński Strona : 15

Inicjalizacja, czyszczenie, kopiowanie, rozszerzanie deklaracje funkcji template <class T> class Array public: //... // Powiększenie maksymalnego rozmiaru tablicy o delta elementów void expand( int tmpdelta ); // Wyczyszczenie tablicy,staje si ę pusta void clear(); ; protected: void copy( const Array & a ); void init( int startsize, int startdelta ); Copyright Roman Simiński Strona : 16

Inicjalizacja definicja funkcji template < class T > void Array< T >::init( int startsize, int startdelta ) arr = 0; len = maxlen = delta = 0; if( startsize > 0 ) arr = new T[ maxlen = startsize ]; if( startdelta >= 0 ) delta = startdelta; Copyright Roman Simiński Strona : 17

Kopiowanie definicja funkcji template < class T > void Array< T >::copy( const Array< T > & a ) if( a.maxlen > 0 ) arr = new T [ maxlen = a.maxlen ]; for( int i = 0; i < a.maxlen; i++ ) arr[ i ] = a.arr[ i ]; len = a.len; delta = a.delta; else clear(); Copyright Roman Simiński Strona : 18

Czyszczenie definicja funkcji template < class T > void Array< T >::clear() if( arr ) delete [] arr; arr = 0; len = maxlen = delta = 0; Copyright Roman Simiński Strona : 19

Rozszerzanie definicja funkcji template <class T> void Array< T >::expand( int tmpdelta ) if( tmpdelta <= 0 ) return; T * newarr; int savemaxlen = maxlen; int savelen = len; int savedelta = delta; newarr = new T[ maxlen + tmpdelta ]; for( int i = 0; i < maxlen; i++ ) newarr[ i ] = arr[ i ]; clear(); arr = newarr; maxlen = savemaxlen + tmpdelta; len = savelen; delta = savedelta; Copyright Roman Simiński Strona : 20

Dodawanie elementów i przeciążony operator indeksowania deklaracje funkcji template <class T> class Array public: ; //... // Przeciazony operator indeksu T & operator [] ( int i ); // Dopisanie na koniec tablicy void add( T item ); // Zapisanie elementu na pozycji i tablicy nadpisanie void addat( int i, T item ); // Zapisanie elementu na pozycji i tablicy wstawienie void insertat( int i, T item ); // Skasowanie elementu na pozycji i. Nastepne elementy sa przesuwane. void deleteat( int i ); //... Copyright Roman Simiński Strona : 21

Przeciążony operator indeksowania możliwe definicje funkcji template < class T > T & Array< T >::operator [] ( int i ) return arr[ i ]; lub template < class T > T & Array< T >::operator [] ( int i ) assert( i >= 0 && i < len ); return arr[ i ]; lub template < class T > T & Array< T >::operator [] ( int i ) assert( i >= 0 && i < len ); assert( arr!= 0 ); return arr[ i ]; Copyright Roman Simiński Strona : 22

Przeciążony operator indeksowania możliwe definicje funkcji template < class T > T & Array< T >::operator [] ( int i ) if( i >= 0 && i < len ) return arr[ i ]; else return arr[ 0 ]; lub template < class T > T & Array< T >::operator [] ( int i ) static T dummy; if( arr && ( i >= 0 && i < len ) ) return arr[ i ]; return dummy; Copyright Roman Simiński Strona : 23

Dodawanie elementów definicje funkcji template < class T > void Array< T >::add( T item ) if( len >= maxlen ) expand( delta ); arr[ len++ ] = item; template < class T > void Array< T >::addat( int i, T item ) if( i < len && arr!= NULL ) arr[ i ] = item; Copyright Roman Simiński Strona : 24

Dodawanie elementów definicje funkcji template < class T > void Array< T >::insertat( int i, T item ) if(!arr ) return; if( i >= 0 && i < len ) if( len == maxlen ) expand( delta ); // Przepisanie elementow w dol o jeden. Zaczynam od konca. for( int j = len; j >= i; j-- ) arr[ j + 1 ] = arr[ j ]; arr[ i ] = item; len++; Copyright Roman Simiński Strona : 25

Usuwanie elementów definicje funkcji template < class T > void Array< T >::deleteat( int i ) if( i>= 0 && i < len && arr!= NULL ) for( int j = i; j < len - 1; j++ ) arr[ j ] = arr[ j + 1 ]; len--; Copyright Roman Simiński Strona : 26

Iterowanie po wszystkich elementach template <class T> class Array public: ; //... // Wykonaj funkcje fun dla wszystkich elementow tablicy. void doforeach( void ( * fun ) ( T & a ) ); //... template < class T > void Array< T >::doforeach( void ( * fun ) ( T & a ) ) for( int i = 0; i < getlen(); i ++ ) fun( arr[ i ] ); Copyright Roman Simiński Strona : 27

Iterowanie po wszystkich elementach przykład wykorzystania void print( Complex & z ) cout << z << endl; void fun() Array<Complex> tab( 10, 3 ); for( int i = 0; i < 5; i++ ) tab.add( Complex( i, i ) ); tab.doforeach( print ); cout << endl << endl; Copyright Roman Simiński Strona : 28

Znajdowanie pierwszego wystąpienia elementu spełniającego warunek template <class T> class Array public: ; //... // Wykonaj funkcje fun dla wszystkich elementow tablicy. T * findfirstwho( bool ( * fun ) ( T & a ) ); //... template < class T > T * Array< T >::findfirstwho( bool ( * fun ) ( T & a ) ) for( int i = 0; i < getlen(); i ++ ) if( fun( arr[ i ] ) ) return &arr[ i ]; return ( T * ) NULL; Copyright Roman Simiński Strona : 29

Znajdowanie pierwszego wystąpienia elementu spełniającego warunek przykład bool iszero( Complex & z ) return z.getimag() == 0 && z.getreal() == 0; void fun() Array<Complex> tab( 10, 3 ); tab.add( Complex( 1, 1 ) ); tab.add( Complex( 2, 2 ) ); tab.add( Complex( 0, 0 ) ); tab.add( Complex( 3, 3 ) ); tab.add( Complex( 4, 4 ) ); Complex * num = tab.findfirstwho( iszero ); if( num ) cout << *num; else cout << "Zero nie występuje w tablicy"; cout << endl << endl; Copyright Roman Simiński Strona : 30