C++/Konstruktor i destruktor

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

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

Wykład 5: Klasy cz. 3

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

Wykład 8: klasy cz. 4

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

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

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

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

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

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

private - oznacza, że wszystkie elementy klasy bazowej zmieniają się w prywatne.

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

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Aplikacje w środowisku Java

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Wykład 4: Klasy i Metody

PARADYGMATY PROGRAMOWANIA Wykład 4

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

TEMAT : KLASY DZIEDZICZENIE

Dziedziczenie jednobazowe, poliformizm

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

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

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

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

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

C++ - [4-7] Polimorfizm

Deklaracja struktury w C++

Klasa to byt programistyczny określający jakie właściwości i metody będą miały obiekty, które zostaną utworzone na jej podstawie.

Programowanie obiektowe

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

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

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

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

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

Dokumentacja do API Javy.

Materiały do zajęć VII

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Lab 9 Podstawy Programowania

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie w języku C++

Programowanie komputerowe. Zajęcia 7

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

.NET Klasy, obiekty. ciąg dalszy

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Szablony klas, zastosowanie szablonów w programach

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

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

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

PHP 5 język obiektowy

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

Wprowadzenie do programowanie obiektowego w języku C++

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

Rozdział 4 KLASY, OBIEKTY, METODY

Wstęp do programowania obiektowego. Wykład 2

Programowanie obiektowe w języku

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

Programowanie Obiektowe i C++

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

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Programowanie obiektowe

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

Do czego służą klasy?

KLASY cz.1. Dorota Pylak

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

Język C++ zajęcia nr 2

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Programowanie obiektowe w C++ Wykład 12

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

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

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

10. Programowanie obiektowe w PHP5

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

Wstęp do Programowania 2

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe i C++ dla matematyków

Zaawansowane programowanie w C++ (PCP)

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

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

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

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

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

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

Do czego służą klasy?

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

Wykład 9: Metody wirtualne i polimorfizm

Technologie i usługi internetowe cz. 2

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Programowanie Obiektowo Zorientowane w języku c++ Konstruktory

Programowanie obiektowe

Języki i techniki programowania Ćwiczenia 2

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

Aplikacje w środowisku Java

Wstęp do programowania obiektowego. Wykład 1 Algorytmy i paradygmaty Podstawowe pojęcia PO

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

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

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Transkrypt:

C++/Konstruktor i destruktor 1 C++/Konstruktor i destruktor Teoria Wstęp Pisząc klasy każdy kiedyś dotrze do momentu, w którym będzie odczuwał potrzebę napisania funkcji wykonującej jakieś niezbędne instrukcje na początku lub na końcu istnienia obiektu. W takim momencie programista powinien sięgnąć po dwa niezwykle przydatne narzędzia: konstruktory i destruktory. Konstruktor Konstruktor jest to funkcja w klasie, wywoływana w trakcie tworzenia każdego obiektu danej klasy. Funkcja może stać się konstruktorem gdy spełni poniższe warunki Ma identyczną nazwę jak nazwa klasy Nie zwraca żadnej wartości (nawet void) Należy dodać że każda klasa ma swój konstruktor. Nawet jeżeli nie zadeklarujemy go jawnie zrobi to za nas kompilator (stworzy wtedy konstruktor bezparametrowy i pusty). Mamy na przykład klasę Miesiac. Chcielibyśmy, aby każdy obiekt tej klasy tuż po utworzeniu wygenerował tablicę z nazwami dni tygodnia w zależności od miesiąca i roku. A może dało by się to zrobić w trakcie tworzenia klasy? Przyjrzyj się poniższej klasie, oraz funkcji konstruktora: class Miesiac int dni[31]; int liczbadni; string nazwa; Miesiac();//deklaracja konstruktora Miesiac::Miesiac()//definicja konstruktora // instrukcje tworzące Konstruktor może też przyjmować argumenty. Jak? To zależy od sposobu w jaki tworzymy obiekt: jako obiekt MojaKlasa obiekt(argumenty); jako wskaźnik do obiektu: MojaKlasa* wsk = new MojaKlasa(argumenty); Teraz powyższa klasa miesiąca może być stworzona z uwzględnieniem numeru miesiąca i roku:

C++/Konstruktor i destruktor 2 class Miesiac int dni[31]; int liczbadni; string nazwa; Miesiac(int numer,int rok); Miesiac::Miesiac(int numer,int rok) /* instrukcje tworzące */ Aby utworzyć nowy obiekt tej klasy trzeba będzie napisać: Miesiac styczen2000(1,2000); lub jako wskaźnik do obiektu: Miesiac* styczen2000 = new Miesiac(1,2000); otrzymawszy w ten sposób kalendarz na styczeń. Najczęstszą funkcją konstruktora jest inicjalizacja obiektu oraz alokacja pamięci dla dodatkowych zmiennych (w tym celu lepiej jest użyć instrukcji inicjujących, które poznasz już za chwilę). Instrukcje inicjujące Instrukcje inicjujące to instrukcje konstruktora spełniające specyficzne zadanie. Mianowicie mogą one zostać wywołane przez kompilator zaraz po utworzeniu klasy. Służą do inicjowania pól klasy, w tym stałych i referencji. Jeśli nie zaimplementujemy instrukcji inicjujących, niczego nie będą one robiły. Jeżeli chcemy zaimplementować instrukcje inicjujące, musimy po liście argumentów konstruktora, użyć dwukropka, podać nazwę pola, które chcemy zainicjować i jego wartość ujętą w nawiasy okrągłe. Rok() : miesiace(new Miesiac[12]), liczbadni(7) /* zamiast średników stosuje się przecinki przy ostatniej instrukcji przecinka nie stosuje się */ Działa to podobnie jak użycie inicjowania w konstruktorze, jednak w przypadku instrukcji inicjujących pola będą zainicjowane w trakcie tworzenia klasy, a nie po utworzeniu jej obiektu.

C++/Konstruktor i destruktor 3 Konstruktor kopiujący Konstruktor kopiujący to konstruktor spełniający specyficzne zadanie. Mianowicie może on zostać wywoływany przez kompilator niejawnie jeżeli zachodzi potrzeba stworzenia drugiej instancji obiektu (np. podczas przekazywania obiektu do funkcji przez wartość). Jeżeli nie zaimplementujemy konstruktora kopiującego, kompilator zrobi to automatycznie. Konstruktor taki będzie po prostu tworzył drugą instancję wszystkich pól obiektu. Możemy go jawnie wywołać np. tak: Miesiac miesiac(12,2005); Miesiac kopia(miesiac); //tu zostanie wywołany konstruktor kopiujący /* obiekt kopia będzie miał taką samą zawartość jak obiekt miesiąc */ Jeżeli chcemy sami zaimplementować konstruktor kopiujący musimy zadeklarować go jako konstruktor o jednym parametrze będącym referencją na obiekt tej samej klasy. class Miesiac int numer; int rok; Miesiac(const Miesiac &miesiac) numer=miesiac.numer; rok=miesiac.rok;

C++/Konstruktor i destruktor 4 Porada Jeżeli dokonujemy w instrukcjach inicjujących alokacji pamięci, np: class Rok protected: Miesiac *miesiace; Rok() : miesiace(new Miesiac[12]) virtual ~Rok() delete[] miesiace; to nie możemy się zdać na konstruktor kopiujący tworzony niejawnie. Jeżeli tak zrobimy, to w obiekcie stworzonym przez konstruktor kopiujący pole miesiace będzie wskazywać na ten sam fragment pamięci, co w obiekcie wzorcowym. Jeżeli nie jest to zamierzony efekt (a zwykle nie jest) musimy sami zaimplementować konstruktor kopiujący, np. tak: class Rok protected: Miesiac *miesiace; Rok() : miesiace(new Miesiac[12]) Rok(const Rok &rok) //musimy sami zaalokować pamięć na pole ''miesiace'' miesiace=new Miesiac[12]; //oraz przypisać temu polu odpowiednie wartości for (int i=0; i<12; ++i) miesiace[i]=miesiac(rok.miesiace[i]); virtual ~Rok() delete[] miesiace; Destruktor Destruktor jest natomiast funkcją, którą wykonuje się w celu zwolnienia pamięci przydzielonej dodatkowym obiektom lub innych zasobów. Zasady "przemiany" zwykłej funkcji do destruktora, są podobne do tych tyczących się konstruktora. Jedyna zmiana tyczy się nazwy funkcji: Musi się ona zaczynać od znaku tyldy - ~. class MojaKlasa MojaKlasa();//to oczywiście jest konstruktor ~MojaKlasa();//a to - destruktor Najczęstszą funkcją destruktora jest zwolnienie pamięci (zwykle poprzez zniszczenie wszystkich pól używanych przez ten obiekt).

C++/Konstruktor i destruktor 5 Porada Należy pamiętać, że jeżeli zamierzamy implementować dziedziczenie po klasie dla której piszemy destruktor to powinniśmy stworzyć destruktor wirtualny! class MojaKlasa MojaKlasa(); virtual ~MojaKlasa();//to jest destruktor wirtualny Początkujący programiści często o tym zapominają, doprowadzając w ten sposób czasami do tzw. wycieków pamięci. Dobrą praktyką jest tworzenie tylko destruktorów wirtualnych (patrz Funkcje wirtualne). Ćwiczenia Ćwiczenie 1 Napisz definicje instrukcji inicjujących do poniższej klasy: class Vector double x; double y; Vector(); Vector(double, double); Klasa ma reprezentować wektor w przestrzeni dwuwymiarowej, a instrukcje inicjujące mają realizować inicjalizację tego wektora. Pierwsze instrukcje inicjujące powinny ustawiać wektor na wartość domyślną (0,0). Ćwiczenie 2 Dopisz do kodu z poprzedniego ćwiczenia konstruktor kopiujący. Vector(const Vector&); Po wykonaniu tego ćwiczenia zastanów się, czy napisanie konstruktora kopiującego było konieczne. Jeżeli nie jesteś pewien - napisz program który testuje działanie Twojego konstruktora kopiującego i sprawdź jak program działa bez niego. Wyjaśnij dlaczego konstruktor kopiujący nie jest potrzebny. Ćwiczenie 3 Poniższa klasa miała implementować dowolnej wielkości tablicę obiektów klasy Vector z poprzednich ćwiczeń. Niestety okazało się że powoduje wycieki pamięci - programista zapomniał o napisaniu destruktora: class VectorsArray Vector* vectors; VectorsArray(size_t); Vector GetVector(size_t);

C++/Konstruktor i destruktor 6 size_t GetSize(); size_t size; VectorsArray::VectorsArray(size_t argsize) : size(argsize), vectors(new Vector[argSize]) Vector VectorsArray::GetVector(size_t i) return vectors[i]; size_t VectorsArray::GetSize() return size; Do powyższej klasy dopisz definicję destruktora. Nie zapomnij o dealokacji pamięci!

Źródła i autorzy artykułu 7 Źródła i autorzy artykułu C++/Konstruktor i destruktor Źródło: http://pl.wikibooks.org/w/index.php?oldid=171555 Autorzy: Algorytmik, Delimata, Derbeth, Felix, Gang65, Kj, Lethern, Magalia, Matekm, Michał Głamowski, Piotr, Uniq, 43 anonimowych edycji Źródła, licencje i autorzy grafik Grafika:Fairytale messagebox info.png Źródło: http://pl.wikibooks.org/w/index.php?title=plik:fairytale_messagebox_info.png Licencja: GNU Lesser General Public License Autorzy: Amada44, Anime Addict AA, Bayo, Dake, Jon Harald Søby, Rocket000, ZooFari Licencja Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/