Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

vracanje reference

[es] :: C/C++ programiranje :: vracanje reference

[ Pregleda: 3795 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

amavisto
Nis

Član broj: 4256
Poruke: 18
*.vdial.verat.net

Jabber: amavisto@elitesecurity.org
ICQ: 85132898


Profil

icon vracanje reference24.02.2004. u 16:00 - pre 245 meseci
Knjiga teach yourself c++ ... dan 10, listing 10.11. konstruktor kopiranja:

Code:

26:    const Counter& Counter::operator++()
27:    {
28:       ++itsVal;
29:       return *this;
30:    }


sta se ovde u stvari vraca? i kad napise u main(): a=++i; sta se dodeli objektu a?
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: vracanje reference24.02.2004. u 19:00 - pre 245 meseci
Tvoje pitanje nema veze sa primerom koji si dao - ili ja ne razumem
dobro pitanje. Ako sam u pravu - molim te da preformulises pitanje.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

amavisto
Nis

Član broj: 4256
Poruke: 18
*.ptt.yu

Jabber: amavisto@elitesecurity.org
ICQ: 85132898


Profil

icon Re: vracanje reference25.02.2004. u 20:16 - pre 245 meseci
da pojasnim (i sebi):

jeste knjiga teach yourself c++ ... dan 10, listing 10.11. ali koji se nadovezuje na 10.9.
pravi se klasa Counter, i preklopi operator ++ tako sto se napravi da vraca objekat klase
da bi bilo moguce uraditi nesto ovako:

a=++i;

pa da bi se izbeglo pravljenje privremenog objekta radi dodele, koristi se
pokazivac this (koji je vec prosledjen operatoru ++, tj. f-ji), dereferencira se
i vrati kao povratna vrednost. implementacija operatora:

Code:

26:    const Counter& Counter::operator++()
27:    {
28:       ++itsVal;
29:       return *this;
30:    }


u main(): (i je vec kreiran objekat):

Code:

       Counter a = ++i;


konstruktor kopiranja je mojom greskom upao u poruku (nije mu tu mesto)

ono sto mene buni je: kako se to povratna vrednost (dereferenciran *this) tumaci
kao referenca? (jos mi nisu jasne). sta je referenca? alternativno ime za neki
drugi objekat? pa sta se onda vraca? (valjda je sad malo jasnije pitanje)



 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.beg.sezampro.yu



Profil

icon Re: vracanje reference25.02.2004. u 23:18 - pre 245 meseci
Citat:
amavisto:
ono sto mene buni je: kako se to povratna vrednost (dereferenciran *this) tumaci
kao referenca? (jos mi nisu jasne). sta je referenca? alternativno ime za neki
drugi objekat? pa sta se onda vraca? (valjda je sad malo jasnije pitanje)

Na referencu mozes da gledas kao na pokazivac, sa izvesnim razlikama, od kojih su najuocljivije (izmedju ostalih) te, sto kada inicijalizujes referencu, kasnije ne mozes da menjas na sta ona pokazuje, i ne moras da dereferenciras referencu da bi vratila ono, sto se nalazi na adresi na koju ona pokazuje. Ukratko, referenca je samo "jos jedno ime" za memorijsku lokaciju tj. alias.
To dali ces koristiti referencu ili pokazivac, zavisi od prirode problema (mada sa pokazivacima uvek mozes da uradis sve ono sto mozes i sa referencama, dok suprotno nije slucaj) ali i od "ukusa i stila" :)
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: vracanje reference26.02.2004. u 08:13 - pre 245 meseci
Reference kompajler tretira interno kao pokazivace. Dakle "ispod haube" referenca je prosto prokazivac, dok programer slobodno miksuje kod, zato jer zna da ce to kompajler ispravno da kompajlira.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: vracanje reference26.02.2004. u 08:20 - pre 245 meseci
Citat:
passenger:To dali ces koristiti referencu ili pokazivac, zavisi od prirode problema (mada sa pokazivacima uvek mozes da uradis sve ono sto mozes i sa referencama, dok suprotno nije slucaj) ali i od "ukusa i stila" :)
Ovo nije sasvim tacno. Sa referencom si siguran da niko ne moze da ti uvali null pointer (tj. ne moras to da proveravas). Sa obicnim pointerima ti sledi neizbeizno if (!p) ...
 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
195.252.80.*



Profil

icon Re: vracanje reference26.02.2004. u 09:00 - pre 245 meseci
Iznad sam pomenuo "najuocljivije" razlike a ispod je rec o mogucnostima. I pokazivac moze da se proveri dali je null, ali ce se malo teze na "cisti c++ nacin" promeniti vrednost reference :) znaci to bi islo iznad :).
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: vracanje reference26.02.2004. u 09:19 - pre 245 meseci
Stvar je u tome sto referencu ne moras da proveris za NULL dok pokazivac moras - dakle jedna manje stvar koja treba da se uradi. To je nesto sto reference imaju a pokazivaci nemaju. QED.

Ne kazem da uopste nisi bio u pravu, nego samo hocu da skrenem paznju na jednu stvar koju dosta ljudi zaboravlja kada su u pitanju reference. No big deal.
 
Odgovor na temu

demonBre
Nemanja Grujic
Nish

Član broj: 21440
Poruke: 2
212.200.108.*



Profil

icon Re: vracanje reference26.02.2004. u 09:32 - pre 245 meseci
Sve u svemu da odgovorimo coveku na pitanje.

Ovaj kod :

const Counter& Counter::operator++()
{
++itsVal;
return *this;
}

vraca referencu. Znaci oznaku bas TOG objekta za koji je operator pozvan.

Ovaj kod :

const Counter Counter::operator++()
{
++itsVal;
return *this;
}

vraca KOPIJU objekta za koji je operator pozvan. Znaci bilo bi katastrofe.

Sada imamo neku f-ju : void f(Counter& c);
i objecat : Counter c1;

Pri pozivu ove f-je : f(c1);

f-ji se prosledjuje referenca (znaci oznaka) objekta c1. Kako bi
1. mogo da menjas unutar f-je bas objekat c1 a ne njegovu kopiju.
2. se ustedelo na memoriji (nema kopiranja objekta).
3. se ustedelo na brzini (nema kopiranja objekta).

 
Odgovor na temu

Milan Aksic

Član broj: 412
Poruke: 1053
*.beg.sezampro.yu



Profil

icon Re: vracanje reference26.02.2004. u 10:33 - pre 245 meseci
Citat:
Reljam:
Stvar je u tome sto referencu ne moras da proveris za NULL dok pokazivac moras - dakle jedna manje stvar koja treba da se uradi. To je nesto sto reference imaju a pokazivaci nemaju. QED.

Ne kazem da uopste nisi bio u pravu, nego samo hocu da skrenem paznju na jednu stvar koju dosta ljudi zaboravlja kada su u pitanju reference. No big deal.

Ma ok, naravno :) evo i ja sam na ovo bio zaboravio, hvala na podsecanju, ipak :)
 
Odgovor na temu

amavisto
Nis

Član broj: 4256
Poruke: 18
*.vdial.verat.net

Jabber: amavisto@elitesecurity.org
ICQ: 85132898


Profil

icon Re: vracanje reference26.02.2004. u 14:54 - pre 245 meseci
Citat:
demonBre:

const Counter& Counter::operator++()
{
++itsVal;
return *this;
}

vraca referencu. Znaci oznaku bas TOG objekta za koji je operator pozvan.


ono sto je mene zbunilo je sledece:
ako su r1 i r2 reference na int a int b, kod:
r1=r2 je <=> a=b
u kombinaciji sa dereferenciranjem. (referenca se koristi kao i pravi objekat;
tj. kako to vracam *this a u deklaraciji pise da se vraca referenca). ili mozda
jos bolje pojasnjenje, ja sam gledao cisto formalno. ako pise da se vraca referenca
onda treba return ime_reference). u svakom slucaju hvala na objasnjenju (ivci)

p.s. nevezano za C++, kako da se u emacsu podesi da na osnovu extenzije
(.c ili .cpp) sam provali da `M-x compile` pozove gcc ili g++? i kako da se podesi
da sam doda ime fajla koji se trenutno obradjuje u buffer-u? (ili da pustim ovo
na linux forum?)
 
Odgovor na temu

amavisto
Nis

Član broj: 4256
Poruke: 18
*.ptt.yu

Jabber: amavisto@elitesecurity.org
ICQ: 85132898


Profil

icon Re: vracanje reference26.02.2004. u 15:37 - pre 245 meseci
Citat:
demonBre:

const Counter& Counter::operator++()
{
++itsVal;
return *this;
}

vraca referencu. Znaci oznaku bas TOG objekta za koji je operator pozvan.



jos nesto da dodam, problem je nastao kad sam trebao da napisem neku prostu verziju klase string.
jedan od operatora koji treba da se preklopi je [], pa da bi moglo da se uradi neki_string[2]='a', operator
[] treba da vrati referencu na objekat klase tako da je moguca dodela, tj. izmena stringa sto ne radi
ako se operator preklopi sa:
ime_nove_string_klase operator[] (int);
na stranu to sto je brze sa referencama jer se ne pravi privermena kopija objekta koji se vraca

ako i sad nije jasno sta me bunilo onda odoh da upisem neki kurs srpskog jezika
 
Odgovor na temu

demonBre
Nemanja Grujic
Nish

Član broj: 21440
Poruke: 2
212.200.108.*



Profil

icon Re: vracanje reference28.02.2004. u 12:07 - pre 245 meseci
kako to vracam *this a u deklaraciji pise da se vraca referenca

U tome je i sva lepota. Ti mozes da koristis stvarne objekte, a oni ce automatski biti shvaceni kao reference.

Primer :

void f(T& t)
{
// ...
}

void main(void)
{
T t1;
f(t1); // Prenosi se referenca iako ti navodis objekat
}
 
Odgovor na temu

[es] :: C/C++ programiranje :: vracanje reference

[ Pregleda: 3795 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.