public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Podobne dokumenty
Operatory na rzecz typu TString

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

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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 3

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

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

Programowanie obiektowe w C++ Wykład 12

Programowanie w języku C++

Wstęp do Programowania 2

Projektowanie klas c.d. Projektowanie klas przykład

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

dr inż. Jarosław Forenc

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

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

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

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków

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

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

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

Wstęp do Programowania 2

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

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

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

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

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

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

Konstruktor kopiujacy

Do czego służą klasy?

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.

Laboratorium 1 - Programowanie proceduralne i obiektowe

Podział programu na moduły

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

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

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

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

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

Podstawy Programowania Obiektowego

Szablony klas, zastosowanie szablonów w programach

Zaawansowane programowanie w C++ (PCP)

C-struktury wykład. Dorota Pylak

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

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

PARADYGMATY PROGRAMOWANIA Wykład 2

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

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

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

dr inż. Jarosław Forenc

Wyliczanie wyrażenia obiekty tymczasowe

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Wyjątki (exceptions)

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

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

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

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

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

C-struktury wykład. Dorota Pylak

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Programowanie i struktury danych

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

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

ALGORYTMY I STRUKTURY DANYCH

C++ - [1-3] Debugowanie w Qt Creator

Jak Windows zarządza pamięcią?

Plik klasy. h deklaracje klas

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

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

Zaawansowane programowanie w języku C++ Klasy w C++

Do czego służą klasy?

Zadanie 2: Arytmetyka symboli

it = 0; memset((void *)ptr, 0, items*sizeof(double)); cout << "Konstruktor sparametryzowany " << title << " adres: " << ptr << "\n";

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

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

Przekazywanie argumentów wskaźniki

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

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Zaawansowane programowanie w C++ (PCP)

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

Język C++ wykład VIII

Programowanie Obiektowew języku C++ Zadania L4

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

Zwracanie obiektu. Funkcja może zwracać obiekty: #include"stdafx.h #include <iostream> using namespace std; class samp { inti; public:

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Wstęp do programowania

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

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

Imię i nazwisko: PYTANIA I ODPOWIEDZI Nr 0 EGZAMIN Język C++ 27 czerwca 2011

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

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

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

TEMAT : KLASY DZIEDZICZENIE

Struktury Struktura polami struct struct struct struct

Transkrypt:

Zbudujemy klasę Definicję klasy zapiszmy w pliku tstring.h #ifndef TSTRING_H #define TSTRING_H #include <cstring> // w pliku nagłówkowym NIE // otwieramy przestrzeni std // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje ; // pamiętaj o średniku pola dostępu do klasy z zewnątrz Zapiszmy też prosty plik main.cpp #include "tstring.h" #include <iostream> using namespace std; int main () { TString s1; size_t jest nazwą (typedef) na bezznakowy typ całkowity wystarczająco pojemny aby opisać wielkość dowolnego obiektu [ m.in. zwracany przez sizeof ] private: char* ptr = nullptr; std::size_t len = 0; ;

Zdeklarujmy konstruktor (c-tor) : TString( const char* s = nullptr ); ; Zdefiniujmy konstruktor Metody definiujemy w tstring.cpp if (s > 0) { len = strlen(s); ptr = new char[ len + 1 ]; strcpy( ptr, s ); cout << "TString c-tor " << len << " - " << ( ptr? ptr : "pusty" ) << endl; #include "tstring.h" #include <iostream> using namespace std; TString::TString( const char* s ) : ptr(nullptr), len(0) { Kompilujemy dodatkowo dodając w linii opcję D definiowananazwa czyli D DEBUG (może być bez spacji), przykładowo: g++4.9.2 std=c++14 DDEBUG main.cc tstring.cpp o prog Możemy teraz dopisać w main kolejny obiekt, np. TString s2("inicjalizacja slowem");

Zdefiniujmy destruktor Zdeklarujmy destruktor (d-tor): TString( const char* s = nullptr ); ~TString(); ; Definicję destruktora, jak i wszystkich kolejnych metod składowych klasy, dopisujemy jako ciąg dalszy (czyli poniżej definicji konstruktora) w pliku tstring.cpp TString::~TString() { w pliku tstring.cpp jako dalsza część cout << "TString d-tor " << len << " - " << ( ptr? ptr : "pusty" ) << endl; delete [] ptr; Śledzenie pokrokowe programu (debuger) gdb Kod trzeba skompilować z flagą g (oraz nie używać flag optymalizujących takich jak O O2 itd.) http://www.yolinux.com/tutorials/gdb-commands.html

TString( const char* s = 0 ); TString( const TString& s ); ~TString(); ; Zdefiniujmy konstruktor kopiujący Zdeklarujmy konstruktor kopiujący (cc-tor): if (len > 0) { ptr = new char[ len + 1 ]; strcpy( ptr, s.ptr ); Możemy dopisać w main.cpp // poniżej to nie jest przypisanie TString s3 = s2; // albo tak: TString s3 ( s2 ); // albo tak: TString s3 { s2 ; TString::TString( const TString& s ) : ptr(nullptr), len( s.len ) { w pliku tstring.cpp jako dalsza część Operacja podobna do tej z konstruktora. cout << "TString cc-tor " << len << " - " << ( ptr? ptr : "pusty" ) << endl;

Zdefiniujmy operator przypisania kopiujący Zdeklarujmy operator= kopiujący: TString& operator= ( const TString& s ); ; if ( this!= &s ) { // if ( *this!= s ) { delete [] ptr; ptr = nullptr; len = s.len; if ( len > 0 ) { ptr = new char[ len + 1 ]; strcpy( ptr, s.ptr ); Możemy dopisać w main.cpp // poniżej jest przypisanie, bo obiekt // po lewej już istnieje s3 = "alfa beta"; s3 = s2; TString& TString::operator= (const TString& s ) { this specjalny wskaźnik, który otrzymuje każda niestatyczna składowa klasy, a w którym zapisany jest adres bieżącego obiektu, na którego argumentach działać ma metoda cout << "TString copy operator= " << len << " - " << ( ptr? ptr : "pusty" ) << endl; return *this; // nie zapomnij zwrócić obiektu!

Konstruktor przenoszący (mvc-tor): TString( TString&& s ); ; Zdefiniujmy konstruktor przenoszący Możemy dopisać w main.cpp // obiekt źródłowy zostaje pozbawiony zasobów // ale pozostawiony w stanie do dalszego użytku czyli można coś np. do niego przypisać s.ptr = nullptr; s.len = 0; // move maskuje tożsamość obiektu TString s4 = std::move( s2 ); // std::move będzie niepotrzebne // jeśli inicjalizować będzie obiekt // tymczasowy np. zwracany przez // funkcję jako wartość TString::TString( TString&& s ) : ptr(s.ptr), len(s.len) { Operacja przenoszenia dzieje się automatycznie wtedy, gdy obiekt źródłowy nie ma nazwy i nie ma adresu cout << "TString mvc-tor " << len << " - " << ( ptr? ptr : "pusty" ) << endl;

Zdefiniujmy operator przypisania przenoszący Zdeklarujmy operator= przenoszący: TString& operator= ( TString&& s ); Możemy dopisać w main.cpp // ponownie ukrywamy obiekt // za pomocą std::move s3 = std::move( s1 ); ; TString& TString::operator= if ( this!= &s ) { ( TString&& s ) { delete [] ptr; // usuń dotychczasowy zasób len = s.len; // typy proste się tylko (po prostu) kopiuje ptr = s.ptr; // tu zabieramy adres wskaźnika (przeniesienie praw własności) s.len = 0; // obiekt, któremu zabraliśmy, zerujemy s.ptr = nullptr; // wskaźnik również zerujemy cout << "TString move operator= " << len << " - " << ( ptr? ptr : "pusty" ) << endl; return *this; // nie zapomnij zwrócić obiektu!

Copy elision, obiekty do przenoszenia copy elision mechanizm pozwalający kompilatorowi na optymalizację polegającą na ominięciu cc-tor lub mvc-tor i bezpośrednim zbudowaniu / umieszczeniu obiektu w docelowym miejscu. Mimo tego formalnie tam, gdzie wymagane są cc-tor czy mvc-tor (choć niewykorzystane), muszą one być poprawnie sformułowane. en.cppreference.com/w/cpp/language/copy_elision Można wyłączyć optymalizację za pomocą flagi -fno-elide-constructors Jak najczęściej dostajemy obiekt do przeniesienia? Poprzez funkcję zwracającą go przez wartość. Prosty przykład // funkcję fun definiujemy jako globalną, np. // przed programem main // następnie w programie spróbujmy: TString s5 = fun("konstruktor przenoszący"); TString s6 = s4; // konstruktor kopiujący // zaobserwujmy wynik gdy działa optymalizacja // oraz gdy (używając powyższej flagi) jest // ona wyłączona // funkcja zwracająca wartość TString fun(const char* c) { return TString(c); // spróbujmy C++14 auto fun(const char* c) { return TString(c); UWAGA: kompilacja z flagą -std=c++14