PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Podobne dokumenty
PROE wykład 4 pozostałe operatory, forward declaration, dziedziczenie. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

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

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

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Pliki wykład 2. Dorota Pylak

Język C++ Różnice między C a C++

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

Część 4 życie programu

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

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

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

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

Język C++ wykład VIII

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

Zaawansowane programowanie w języku C++ Biblioteka standardowa

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

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

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

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

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

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

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

I - Microsoft Visual Studio C++

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

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

Pliki wykład 2. Dorota Pylak

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

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

Zaliczenie przedmiotu:

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

PROE wykład 1. dr inż. Jacek Naruniec

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

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

Języki i techniki programowania Ćwiczenia 2

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

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

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

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

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Programowanie obiektowe i C++ dla matematyków

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

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

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Podstawy Programowania Obiektowego

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

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

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

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

Szablony klas, zastosowanie szablonów w programach

Podstawy programowania skrót z wykładów:

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

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

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

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie w językach

Biblioteka standardowa - operacje wejścia/wyjścia

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

Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

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

Wyliczanie wyrażenia obiekty tymczasowe

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

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

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku.

Struktury, unie, formatowanie, wskaźniki

Programowanie w języku C++

Język C++ zajęcia nr 2

PARADYGMATY PROGRAMOWANIA Wykład 4

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Aplikacje w środowisku Java

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

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

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Operatory na rzecz typu TString

Wstęp do Programowania, laboratorium 02

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

Projektowanie klas c.d. Projektowanie klas przykład

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

Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Wyjątki (exceptions)

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

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

jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

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.

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Zmienne, stałe i operatory

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

TEMAT : KLASY DZIEDZICZENIE

Transkrypt:

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 w ramach obiektów.

Klasa string W C++ zamiast ciągów znaków char[] zwykle używa się klasy string (include <string>). Klasa znajduje się w przestrzeni nazw std, więc dodajemy using namespace std.

Klasa string Najczęstsze formy inicjalizacji: Dodawanie napisów (strcat w char[]):

Klasa string Porównywanie napisów (strcmp w char[]):

Klasa string Wyszukiwanie napisu w napisie

Klasa string Długość napisu: s.length() Ciąg znaków z obiektu klasy string: Wiele innych funkcji (ask Google)

Klasa string Zalety string nad char[] to: Nie martwimy się, że wyjdziemy poza zakres wskaźnika. Mamy jeden obiekt zamiast ciągu znaków. Mamy bezpośrednio dostęp do listy możliwych funkcji klasy. Uproszczenie operacji (np. porównywanie). Zalety char[] nad string to: printf, sprintf, fprintf, scanf, sscanf, fscanf mnóstwo możliwości odczytu i zapisu z/do konsoli/pliku/ciągu Wybór string/char[] zależy często od aplikacji, ale wskazane jest używanie string. Z obiektu string można pobrać ciąg znakowy (s.data(), s.c_str())

Pola statyczne Pole statyczne jest wspólne dla każdej instancji (każdego stworzonego obiektu) danej klasy. Tutaj przykład wykorzystania do zliczania ilości punktów:

Pola statyczne Zawsze musimy nadać początkową wartość pola statycznego: bez inicjalizacji:

Pola statyczne Takie bezpośrednie odwołanie się do klasy możliwe tylko do pól (i funkcji) statycznych! Nie można wywołać Punkt::x = 0 (bo którego obiektu to będzie dotyczyć?)

Przeciążanie funkcji W standardowym C parametry funkcji są jednoznacznie określone: W C++ wybór odpowiedniej funkcji odbywa się w czasie kompilacji:

Przeciążanie funkcji Co jeśli jest wiele funkcji odpowiadających parametrom? Np. funkcje sqrt mamy dla float, double i long double: Musimy wymusić wywołanie konkretnej funkcji:

Operatory i przeciążanie operatorów W przypadku standardowych typów zmiennych nie ma problemu z następującymi operacjami: Ale co w przypadku klasy Punkt? W C++ będziemy sami określić jakie działanie ma mieć konkretny operator (+, -, <<, >> ++, ).

Operator == Przeciążanie operatora:

Operator == Powoduje wywołanie operatora == dla obiektu Z LEWEJ strony tu jest referencja na p2 Zawsze wywołuje się funkcja dla obiektu z lewej strony, czyli p1 to this. to są pola p1

Operator == Bardziej złożony obiekt: Co oznacza równość węży? - sami to ustalamy, np.: 1. Równość węży oznacza równość długości. 2. Głęboka równość: warunek 1 + wszystkie elementy muszą być równe

Operator == Równość 1: Równość 2:

Operator > W przypadku klasy Punkt operator > jest także niejednoznaczny (co znaczy punkt większy/mniejszy?) I (suma zmiennych): II (odległość od (0,0) ):

Operator > W przypadku klasy Waz:

Operator = Operator = klasy Punkt (taki zresztą stworzy się domyślnie, nawet jeśli go nie napiszemy): Ok, ale co jeśli wywołamy Operatory równorzędne wywoływane są od strony prawej do lewej: To wywoła się jako pierwsze. Co w tym miejscu zostanie? - to, co zwraca operator = czyli void, czyli w sumie nic. a to się oczywiście nie skompiluje

Operator = Rozwiązanie: Operator = powinien zwracać ten sam obiekt na rzecz którego został wywołany (nie jego kopię, tylko referencję!): Będzie to równoważne z: Innymi słowy aby operator skonstruowany był poprawnie, bardzo istotny jest zwracany typ!

Operator = Klasa Waz (płytka i głęboka kopia) Płytka kopia: Efekt: podwójne kasowanie pamięci + wyciek

Operator = Kopia głęboka: teraz ok

Operator + Waz:

Operator + Waz: nasz ulubiony błąd

Operator + Ten obiekt zostanie usunięty w momencie wyjścia z kontekstu, czyli tutaj Dalej przekazujemy referencję, czyli ADRES zmiennej którą właśnie usunięto! W rezultacie tu otrzymujemy obiekt który usunęliśmy.

Operator + Rozwiązanie: przekażmy kopię obiektu a nie obiekt, który zaraz zostanie usunięty: W rezultacie tu otrzymujemy KOPIĘ obiektu suma. Tworzony jest zazwyczaj poprzez konstruktor kopiujący, który MUSI być tu zdefiniowany (dlaczego?)!

Operator + Dla punktu: Efekt działania dokładnie ten sam (może poza szybkością), oczywiście ostatni najładniejszy. W przypadku braku dynamicznej alokacji pamięci możemy polegać na automatycznie wygenerowanym konstruktorze kopiującym.

Operator << Operatory strumieniowe to operatory przyjmujące strumień jako parametr (np. cout, cin itp.) Strumień cout jest typu ostream ( o, czyli output wyjście) Strumień cin jest typu istream ( i, czyli input wejście) Można by bezpośrednio zaimplementować go w klasie: Jest jeden problem chcemy wywołać cout << obiekt, a przecież w operatorach this jest zawsze po lewej stronie, czyli zgodnie z powyższą definicją operatora mielibyśmy:

Operator << Powinniśmy odwrócić logikę zaimplementować funkcję ostream& cout::operator<<(punkt &p). Ponieważ nie mamy dostępu do składowych klasy cout, operator można zdefiniować poprzez funkcję poza klasami: argument z lewej argument z prawej Funkcja nie jest zdefiniowana w żadnej klasie ( zewnętrzna )! Pozwala na wywołanie cout << p1.

Operator << Waz: Proszę zauważyć: nie ma tu cout <<, tylko s <<, co oznacza, że będziemy mogli korzystać z dowolnego strumienia (np. plikowego - fstream). Ponieważ operator korzysta z pól prywatnych klasy Waz (dlugosc_weza, kierunek_weza) musi być zaprzyjaźniony z klasą wąż.

Operator << Zaprzyjaźnienie oznacza, że funkcja będzie mogła korzystać nawet z prywatnych pól klasy Waz, czego zawsze unikamy.

Inne operatory: Operator rzutowania ((int)waz) Operator dostępu do elementu tablicy (waz[i]) Operator +=, operator ++ Można definiować praktycznie dowolne operatory tak aby działały w pożądany dla nas sposób.

Operatory Sposób działania operatorów jest umowny. Umowne są także typy zwracane przez operatory. Dla swoich potrzeb można je dowolnie zmieniać, ale na projektach przedmiotu trzymamy się umownych zwracanych i przyjmowanych typów danych. Polecam przeczytać bardzo dobry opis operatorów: http://nauka-programowania.pl/o2.pdf

Operacje na plikach Pliki traktujemy tak samo jak strumienie cout, cin. Tworzymy obiekt strumienia plikowego wejściowego (ofstream), wyjściowego (ifstream) lub ogólnego (fstream).

Operacje na plikach

Operacje na plikach Na stronie prosty przykład z plikiem i okienkiem dialogowym (Windows)

Przestrzenie nazw Używane zwykle aby: Uniknąć konfliktu nazw w różnych bibliotekach. Zwiększyć przejrzystość kodu.

Przestrzenie nazw Jeśli takie same przestrzenie istnieją w różnych miejscach kodu łączą się

Przestrzenie nazw

Przestrzenie nazw Jeśli wpiszemy: Oznacza to, że bez podania nazwy przestrzeni domyślnie korzystamy z PrzestrzenGienka, czyli:

Przestrzenie nazw Stąd nasze using namespace std; sprawia, że korzystamy z przestrzeni nazw std domyślnie. Nie musimy wtedy pisać std::cout tylko po prostu cout Tak samo string i std::string i inne Można mieć włączone wiele domyślnych przestrzeni nazw, ale wtedy nazwy elementów nie mogą się pokrywać, czyli: