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

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

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

Przeciążenie operatorów

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

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

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

Wstęp do Programowania 2

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

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.

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

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

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

Obsługa wyjątków. Język C++ WW12

TEMAT : KLASY POLIMORFIZM

Plik klasy. h deklaracje klas

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

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie w języku C++

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

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

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

Wstęp do Programowania 2

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

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

Techniki Programowania wskaźniki 2

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Konstruktor kopiujacy

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

Programowanie Obiektowew języku C++ Zadania L4

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 :37 PP2_W9

Operatory na rzecz typu TString

Programowanie obiektowe i C++ dla matematyków

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

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Mechanizm dziedziczenia

Informacja o programowaniu w c++ Dr Maciej Bobrowski

Wyliczanie wyrażenia obiekty tymczasowe

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

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

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

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

Jak Windows zarządza pamięcią?

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:

Identyfikacje typu na etapie. wykonania (RTTI)

I - Microsoft Visual Studio C++

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

Techniki Programowania wskaźniki

Programowanie Obiektowew języku C++ Zadania L4

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Owad():waga(1),jadowitosc(false) {cout<<"konstruktor domyslny owada\n";}

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

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

Szablon klasy std::vector

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

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

Część 4 życie programu

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

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

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

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

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

Paradygmaty programowania

ALGORYTMY I STRUKTURY DANYCH

dr inż. Jarosław Forenc

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Programowanie obiektowe w C++ Wykład 12

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

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

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

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

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

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

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

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

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

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wstęp do programowania

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

C++ wprowadzanie zmiennych

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

Programowanie obiektowe W3

Programowanie i struktury danych

Lab 9 Podstawy Programowania

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

Paradygmaty programowania. Paradygmaty programowania

Programowanie obiektowe i C++ dla matematyków

Programowanie w języku C++

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Szablon klasy std::list

string Rodzaj[4]= {"TV ", "wieza ", "DVD ", "kino "}; string Producent[4]={"Phillips", "Sony ", "Sanyo ", "Samsung "};

Środowisko programistyczne GEANT4

Język C++ wykład VIII

PARADYGMATY PROGRAMOWANIA Wykład 4

Transkrypt:

// W7.cpp : Defines the en point for the console application. // Konstruktor kopiujacy. Funkcje zwraca obiekt klasy. // Przeciazenie operatora przypisania 1 #include "stdafx.h" #include <iostream> #include <cstdlib> using namespace std; //Dla uruchomienia przykladu "PRZYPISANIE" zakomentuj nastepna //linie kodu. Dla poprawnego dzialania programu odkomentuj //przeciazenie operatora przypisania i jego definicje //#define PRZYKLAD_INICJOWANIE class myclass; myclass fun(int ndim); class myclass double *ptr; int it; public: myclass() cout << "Konstruktor\n"; it = 0; myclass(int items, char *title); myclass(const myclass &aa); ~myclass(); void put(double a); int getnoitems(); double get(int i); void disp(char *title); myclass & operator = (const myclass &aa); //Przeciazenie operatora przypisania ; myclass::myclass(int items, char *title) /*=========================================================================== Konstruktor ============================================================================*/ ptr = new double [items]; it = 0; memset((void *)ptr, 0, items*sizeof(double)); cout << "Konstruktor sparamezowany " << title << " adres: " << ptr << "\n"; myclass::myclass(const myclass &aa) /*================================================================================= Konstruktor kopiujacy ===================================================================================*/ it = aa.it; if(aa.ptr) //sprawdzamy, czy pozostala wydzielona pamiec //dla tablicy aa.ptr size_t noitems = _msize(aa.ptr); //rozmiar tablicy int items = (int)noitems/sizeof(double); //konstruktor kopii bedzie wywolany przy tworzeni nowego obiektu //jest koniecznie wydzielenie pamieci dal nowego obiektu ptr = new double [items];

2 //pamiec pozostala wydzielona - kopiujemy memcpy((void *)ptr, (const void *)aa.ptr, items*sizeof(double)); cout << "Konstruktor kopiujacy. adres: " << ptr << "\n"; //Przeciazenie operatora przypisania myclass & myclass::operator = (const myclass &aa) cout << "operator = : free " << ptr << endl; if(aa.ptr) size_t dim = _msize((void *)aa.ptr)/sizeof(aa.ptr[0]); ptr = new double [dim]; cout << "operator = : alloc. " << ptr << endl; catch(bad_alloc) cout << "memory allocation error\n"; exit(1); memcpy((void *)ptr, (const void *)aa.ptr, dim*sizeof(ptr[0])); /* bool alloc_mem = false; it = aa.it; if(aa.ptr) //sprawdzamy, czy pozostala wydzielona pamiec //dla tablicy aa.ptr - operandu prawostronnego size_t noitems_praw = _msize(aa.ptr)/sizeof(double); //rozmiar tablicy //sprawdzamy, czy pozostala wydzielona pamiec //dla tablicy ptr - operandu lewostronnego //sprawdzamy, czy wystarczy rozmiaru tablicy //operandu lewostronnego dla kopiowania tablicy //operandu prawostronnego size_t noitems_lew = _msize(ptr)/sizeof(double); if(noitems_lew < noitems_praw) //rozmiar tablicy ptr jest zamaly cout << "free adres: " << ptr << endl; alloc_mem = false; alloc_mem = true; alloc_mem = false;

3 if(!alloc_mem) //jesli pamiec dla tablicy ptr nie pozostala zaalokowana //lub byla zwolniena, alokuj pamiec ptr = new double [noitems_praw]; //kopiuj tablice prawostronnego operandy do tablicy lewostronnego memcpy((void *)ptr, (const void *)aa.ptr, noitems_praw*sizeof(double)); cout << "Operator przypisania L adres: " << ptr << " copy from P adres: " << aa. ptr << "\n"; //pamiec dla operatora prawostronnego nie pozostala wydzielona //a operator lewostronny moze miec zaalokowana pamiec - zwalniamy jej cout << "Operator przypisania: L adres = " << ptr <<" zwalniamy pamiec P adres: " << aa.ptr << " \n"; */ //zwracamy referencje do obiektu lewostronnego return *this; myclass::~myclass() cout << "Destruktor: "; cout << "adres: " << ptr; cout << " free ptr"; it = 0; cout << "\n"; int myclass::getnoitems() if(!ptr) return -1; size_t noitems = _msize(ptr); //rozmiar tablicy return (int)noitems/sizeof(double); void myclass::put(double a) int noitems = getnoitems(); //rozmiar tablicy if(it >= noitems)

cout << "tablica jest wypelniona\n"; return; 4 ptr[it] = a; it++; double myclass::get(int i) bool IsOK = true; int noitems = getnoitems(); if(!ptr i < 0 i >= noitems) cout << "indeks przekracza granicy tablicy lub tablica nie zaalokowana\n"; exit(1); return ptr[i]; void myclass::disp(char *title) cout << title << "\n"; int noitems = getnoitems(); int i; for(i=0; i<noitems; i++) cout << "i = " << i << "\t" << ptr[i] << "\n"; // myclass fun(int ndim) myclass ret(ndim, "fun"); ret.put(10); ret.put(20); ret.disp("fun"); return ret; //tu bedzie wywolany destruktor dla zwolnienia obiektu ret #ifdef PRZYKLAD_INICJOWANIE int _tmain(int argc, _TCHAR* argv[]) cout << "PRZYKLAD: INICJOWANIE\n\n"; //inicjowanie obiektu ob obiektem, zwracanym przez funkcje fun myclass ob = fun(10); samo //tu bedzie wywolany destruktor dla zwolnienia obiektu ret, //tworzonego przez funkcje fun dla zwracania obiektu. //dzialanie programu poprawne - //destruktor zwolnil tablicu ptr kopji, a nie oryginalu //Dla przekazywania lokalnie zdefiniowanego obiektu ret jest //tworzony obiekt tymczasowy, ktory pozostanie przekazany //obiektowi ob. Obiekt tymczasowy i obiekt ob - to jest to return 0; //Tu bedzie zwolniony obiekt ob //Destruktor sie wywoluje 2 razy - przy niszczeniu lokalnego obiektu ret (wyjscie z ciala //funkcji fun) i przy niszczeniu obiektu ob (zakonczenie programu) # int _tmain(int argc, _TCHAR* argv[]) cout << "PRZYKLAD: PRZYPISANIE\n\n"; //przypisanie obiektowi ob obiektu, zwracanego przez funkcje fun(...) myclass ob(10, "main"); //tu bedzie wywolany konstruktor - alokacje pamieci dla

tablicy ptr ob = fun(10); //a to - operator przypisania, ktory kopiuje bit po bicie skladowe //obiektu, zdefiniowanego w funkcji fun (konstruktor kopiujacy), //do skladowych obiektu ob //adres ob.ptr bedzie przypisany adresem #.ptr, tworzonym konstruktorem kopiujacym - //zgubiona pamiec! //ob.ptr i #.ptr wskazuja na ten samy obszar pamieci. //po zakonczeni dzialania operatora przypisania z fun bedzie wywolany destruktor //dla zwolnienia obiektu #, ktory zwolni pamiec #.ptr - ob.ptr - PROBLEM! //Dla poprawnrgo rozwiazania tego problemu trzeba przecjazyc operator przypisania myclass ob1(20, "main1"), ob2; ob1 = ob2; 5 return 0; #endif #undef PRZYKLAD_PIERWSZY