Professional Documents
Culture Documents
OOP-C++-5-Objekti Na Gomili-2018 PDF
OOP-C++-5-Objekti Na Gomili-2018 PDF
Teme
8.11.2018. 1 8.11.2018. 2
3 8.11.2018. 4
- pristupaju mu samo funkcije koje imaju pristup pokazivaču koji na taj prostor
pokazuje
- memorija koju rezerviramo ostaje dostupna sve dok ju eksplicitno ne oslobodimo
(rezervirana memoriju na gomili za parametar funkcije, dostupna je i nakon vraćanja funkcije)
- prostor se ne čisti dok program ne završi, tj. dok se eksplicitno ne izbriše (delete)
5 6
Povratna vrijednost od new je adresa slobodne memorije koja odgovara tipu objekta.
Ona mora biti dodijeljena pokazivaču. Objektni tip Krug c c referenca
Kopiranje varijabli primitivnih tipova i tipova objekata Kopiranje varijabli primitivnih tipova i tipova objekata
Pridruživanje primitivnih tipova Pridruživanje objektnih tipova Pridruživanje primitivnih tipova Pridruživanje objektnih tipova
i=j c1 = c2 i=j c1 = c2
Prije: Poslije: Prije: Poslije: Prije: Poslije: Prije: Poslije:
i 1 i 2 c1 c1 i 1 i 2 c1 c1
j 2 j 2 c2 c2 j 2 j 2 c2 c2
Za pristup objektima klase na gomili, dereferencira se pokazivač i poziva zašto je važan delete?:
dot operator na objekt na koji pokazivač pokazuje. delete oslobađa adresni prostor memorije na gomili
Kako se memorija alocirana sa naredbom new ne oslobađa automatski - > ne
može biti obnovljena sve dok program ne završi = curenje memorije (memory
Primjer: (analogija sa * pPointer = 10;) leaks)
pokazivač je lokalna varijabla -> Kada se vraća funkcija na kojoj je deklariran
(*pTom).GetGodine(); // najprije se dereferencira, a onda pokazivač, pokazivač je van dosega, izgubljen je.
se pristupa metodi klase
Pr. oslobađanje memorije na gomili rezervirane za int
ili kraći zapis pomoću operatora points-to (->) : delete pPointer;
11 12
8.11.2018. 15 8.11.2018. 16
8.11.2018. 25 8.11.2018. 26
Niz pokazivača vs. Pokazivač na niz instanci Primjer: Niz pokazivača vs Pokazivač na niz instanci
Primjer: Niz pokazivača na objekte Dana je klasa:
Zadatak:
#include <iostream>
1. Napraviti niz sa 5 pokazivača na objekte klase Pravokutnik
Pravokutnik *pRect1[5]; // niz sa 5 pokazivaca na objekte klase Pravokutnik using namespace std; na gomili
pRect1[0] = new Pravokutnik(); // pokazivac na objekt na gomili se pridružuje 1. el. niza class Pravokutnik{ 2. Napraviti 1 pokazivač na niz od 5 objekata klase
public: Pravokutnik na gomili
pRect1[1] = new Pravokutnik(); // pokazivac na objekt na gomili se pridružuje 2. el. niza Pravokutnik(int s=5, int d=5){
sirina =s;
duljina = d; }
~ Pravokutnik() {}
Primjer: 1. pokazivač na niz objekata
void setDuljina(int d) { duljina = d; }
Pravokutnik *pRect3 = new Pravokutnik[5]; // 1 pokazivač na niz od 5 objekata na gomili int getDuljina() { return duljina; }
pRect3->setDuljina(100); // pristupa se 1. elementu niza (objekt) void setSirina(int s) { sirina = s; }
(pRect3+1)->setDuljina(100); // pristupa se 2. elementu niza (objekt) int getSirina() { return sirina; }
private:
int duljina;
int sirina;
};
8.11.2018. 27 8.11.2018. 28
Primjer: Niz pokazivača vs Pokazivač na niz instanci 1 Niz pokazivača vs. Pokazivač na niz instanci
void main(){ Primjer: Niz pokazivača na objekte
Pravokutnik *pRect[5]; // niz sa 5 pokazivaca
pRect[0]= new Pravokutnik(); // 2. varijanta referenciranja Pravokutnik *pRect1[5]; // niz sa 5 pokazivaca na objekte klase Pravokutnik
pRect[0]->setDuljina(10); Pravokutnik *pRe; // pokazivac na objekt klase Pravokutnik
for (int i =0; i<5; i++) { for (int i =0; i<5; i++) {
pRect[i]= new Pravokutnik(); // pokazivac na objekt pRe= new Pravokutnik(); // def. se pokazivac na objekt na gomili
pRect[i]->setDuljina(i*10); } pRe->setDuljina(i*20);
for (int i =0; i<5; i++) pRect1[i] = pRe; // el. niz pokazivača pridružujemo pokazivač
cout << "pRect duljina: " << pRect[i]->getDuljina()<< "\n"; }
Primjer: 1. pokazivač na niz objekata
Pravokutnik *pRect2 = new Pravokutnik[5]; // 1 pokazivac na niz objekata
pRect2->setDuljina(100); // pristupa 1 elementu niza objekata – 2. varijanta Pravokutnik *pRect3 = new Pravokutnik[5]; // 1 pokazivac na niz od 5 objekata na gomili
for (int i =0; i<5; i++) Pravokutnik *pRr; // pokazivac na objekt klase Pravokutnik
for (int i =0; i<5; i++) {
(pRect2+i)->setDuljina(i*100);
pRr = new Pravokutnik; // def. se pokazivac na objekt na gomili
for (int i =0; i<5; i++) pRr->setDuljina(i*20);
cout << "pRect duljina: " << (pRect2+i)->getDuljina()<< "\n"; pRect3[i] = *pRr; // ali pridružuje se objekt jer je niz objekata a ne pokazivaca !!!
delete []pRect2;} delete pRr;
}
8.11.2018. 29 8.11.2018. 30
33 34
Primjer: const pokazivači i const funkcijski članovi const pokazivači i const funkcijski članovi
void main(){
Neka je dana klasa:
Pravokutnik* pRect = new Pravokutnik; // pokazivač na Pravokutnik
class Pravokutnik{ const Pravokutnik * pConstRect = new Pravokutnik; // const objekt
public: Pravokutnik * const pConstPtr = new Pravokutnik; // const pokazivač
Pravokutnik():sirina(5),duljina(10 ){} // isto što i { sirina =5; duljina=10; } Output:
~ Pravokutnik() {} cout << "pRect sirina: " << pRect->getSirina() << " m\n";
cout << "pConstRect sirina: " << pConstRect->getSirina() << " m\n“; pRect sirina: 5 m
void setDuljina (int d) { duljina = d; }
pConstRect sirina: 5 m
int getDuljina () const { return duljina; } cout << "pConstPtr sirina: " << pConstPtr->getSirina() << " m\n"; pConstPtr sirina: 5 m
void setSirina (int s) { sirina = s; }
int getSirina () const { return sirina; } pRect->setSirina(10);
private: // pConstRect->setSirina(10); //konstant objekt - nije dozvoljeno mijenjanje vrijednosti
int duljina; pConstPtr->setSirina(10); //pokazivač je const, ali objekt nije
int sirina;
}; cout << "pRect sirina: " << pRect->getSirina() << " m\n";
pRect sirina: 10 m
cout << "pConstRect sirina: " << pConstRect->getSirina() << " m\n“;
pConstRect sirina: 5 m
cout << "pConstPtr sirina: " << pConstPtr->getSirina() << " m\n"; pConstPtr sirina: 10 m
35
} 8.11.2018. 36
Sažetak
8.11.2018. 37