U pojedinim programskim jezicima (PASCAL, C/C++ i sl) postoji tzv. pokazivački tip podataka (eng. Pointer data type) čije su vrednosti adrese podataka u memoriji. Vrednost pokazivačkog tipa se naziva pokazivač zato što referiše ("pokazuje") na neku memorijsku lokaciju. Npr, neka je na memorijskoj adresi koja odgovara promenljivoj x smeštena neka vrednost (npr. realan broj 3.14), a p je pokazivač koji pokazuje na x (tj. vrednost od p je upravo adresa od x). PASCAL i C pružaju mehanizam da se na osnovu vrednosti pokazivača p (tj. adrese x) ustanovi vrednost u memorijskoj lokaciji na koju pokazuje p (tj. vrednost koju sadrži memorijska lokacija x). Taj proces se naziva dereferenciranje i u spomenutim jezicima se koristi različita notacija za pokazivač i dereferenciranu vrednost:
pokazivač | dereferencirana vrednost ("ono" na šta pokazivač "pokazuje") |
---|---|
p | p^ (PASCAL notacija) |
p | *p (C/C++ notacija) |
Dakle, naredba programskog jezika C/C++ *p = 5;ima isti efekat kao i naredba x = 5;ako je p pokazivač čija je vrednost adresa memorijske lokacije x. |
![]() |
U drugim programskim jezicima (npr. VBA, C++, JAVA) umesto pokazivača (ili zajedno sa njima) se uvode reference na objekat. One su u osnovi isto što i pokazivači (tj. implementiraju se kao adrese objekata u memoriji), ali se prilikom korišćenja u programu tretiraju kao dereferencirane vrednosti, tj. nema nikakve razlike u označavanju reference i dereferencirane vrednosti.
Npr, neka je na memorijskoj adresi koja odgovara promenljivoj x smeštena neka vrednost (npr. realan broj 3.14), a r je referenca na x (tj. vrednost od r je upravo adresa od x). Tada bi naredba programskog jezika C/C++
r = 5;imala potpuno isti efekat kao i naredba
x = 5;
Koji je smisao pokazivača i referenci? Prilikom rada sa dinamički kreiranim podacima u programu (npr. objektima u VBA), često je zgodnije posredno operisati sa objektom preko njegove adrese umesto direktno. Naime, objekti mogu biti različite složenosti u pogledu svojstava i metoda koje sadrže i njihovo kopiranje (sa svim svojstvima koja takođe mogu biti složeni objekti) ponekad predstavlja izuzetno skupu i složenu operaciju koja zahteva i prostorne (memorijske) i vremenske resurse. To posebno dolazi do izražaja prilikom naredbe dodele ili prenosa argumenata potprograma po adresi, gde nije potrebno da se ceo objekat kopira , već je dovoljno samo omogućiti drugim delovima programa (promenljivama i potprogramima) da pristupe objektu ili da ga promene.
Deklaracija objektnih promenljivih je ista kao i za promenljive prostog tipa
Dim imePromenljive As objektniTipTjKlasa
Ono što je važno napomenuti jeste da se deklaracijom objektne promenljive ne kreira sam objekat, već samo referenca na objekat (tj. promenljiva koja će sadržati adresu objekta i preko koje se radi sa objektom). Drugim rečima, ova deklaracija odvaja u memoriji SAMO lokaciju u kojoj će se čuvati adresa objekta, a ne i memorijski prostor za sam objekat.
Pošto tako deklarisana objektna promenljiva ne referiše ni na šta, tj. nije joj pridružena nijedna validna adresa u memoriji, ona automatski dobija specijalnu vrednost Nothing. Testiranjem da li objektna promenljiva ima vrednost Nothing se zapravo proverava da li objektna promenljiva referiše na neki objekat ili ne. Testiranje se obavlja posebnim operatorom Is.
If objektnaPromenljiva Is Nothing Then MsgBox 'Objektna promenljiva ne referisxe ni na sxta' End If
Operator Is se koristi za upoređivanje da li dve objektne promenljive referišu na isti objekat.
If objektnaPromenljiva1 Is objektnaPromenljiva2 Then MsgBox 'Objektne promenljive referisxu na isti objekat End If
Ako su objektnaPromenljiva1 i objektnaPromenljiva2 reference na objekte, tada je
objektnaPromenljiva1 Is objektnaPromenljiva2logički izraz čija je vrednost True ako i samo ako obe reference referišu na isti objekat.
Ako dva objekta, objektnaPromenljiva1 i objektnaPromenljiva2, pripadaju istoj klasi i imaju istovetne vrednosti odgovarajućih svojstava, a pritom zauzimaju različite memorijske lokacije, tada je
objektnaPromenljiva1 Is objektnaPromenljiva2 = False
Naime, tada je jedan od tih objekata kopija onog drugog i u tom smislu izgledaju istovetno, ali su njihove adrese u memoriji različite, a samim tim su i reference na te objekte različite, pa VBA tretira te objekte kao dva različita objekta.
Inicijalizacija objekta se obavlja u dve faze:
U mnogim programskim jezicima obe pomenute faze se obavljaju pozivom posebnog metoda u klasi koji se zove konstruktor. U programskom jeziku VBA ove dve faze su razdvojene.
Odvajanje memorijskog prostora za objekat se obavlja pomoću posebnog oblika naredbe dodele Set koji koristi ključnu reč New.
Set objektnaPromenljiva = New ImeKlase
Efekat ove naredbe je da se adresa kreiranog objekta u memoriji dodeljuje objektnoj promenljivoj koja se dalje koristi kao referenca na objekat.
Međutim, da bi se objekat koristio, neophodno je inicijalizovati njegova svojstva na odgovarajući način koji zavisi od klase kojoj objekat pripada.