C++ mi a különbség pointer és referencia közt?
Egyszerűen ne tiszta ez a pointer dolog.
Az alábbi két programrészt írtam:
void Swamp(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
Meghívás: Swamp(a,b);
void Swap2( int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
Meghívás:
int* pa = &a;
int* pb = &b;
Swap2(pa,pb);
A két függvény ugyanazt eredményezi(a és b felcserélődik), akkor mégis mi a különbség?
pointer memóriacímre mutat.
referencia lényegében ugyanaz a változó amire mutat de ami azzal a változóval történik az történik a referenciával is.
Technikailag mondhatod azt, hogy a referencia egy olyan pointer, ami konstans, nem lehet null, és automatikusan dereferálódik.
Ami miatt érdemes volt bevezetni őket az az operátor túlterhelés. Képzelj el egy tömb osztályt, és így kéne használni:
MyTomb<int> myTomb;
*myTomb[i] = 2;
Vagy próbálj meg másolókonstruktort írni referencia nélkül, és aztán jobbértékkel inicializálni.
"pointer memóriacímre mutat."
Nem, a pointer egy memóriacím. Mutat valahova a memóriába.
"referencia lényegében ugyanaz a változó amire mutat de ami azzal a változóval történik az történik a referenciával is."
A referencia egy (másik, azért zárójelben, mert nincs minden objektumnak neve) név egy már létező objektumra. Nem lemásolja a változásait a változónak, ténylegesen ugyanaz az objektum a memóriában.
A különbség kb olyan, mint a symlink és a hardlink között.
Köszönöm a válaszokat, de ugyanúgy nem értem.
(Mgj.: Teljesen kezdő vagyok programozásban és C++-ban)
A pointer "valami" memóriacíme, ez eddig tiszta. Ezzel a memóriacímmel el tudom érni a változót.
DE akkor mire jó a referencia?
"A referencia egy (másik, azért zárójelben, mert nincs minden objektumnak neve) név egy már létező objektumra. Nem lemásolja a változásait a változónak, ténylegesen ugyanaz az objektum a memóriában."
Ezt ne tudom megtenni pointerrel?
"Vagy próbálj meg másolókonstruktort írni referencia nélkül, és aztán jobbértékkel inicializálni." Ööö tessék?
(Hátha valaki másnak is kell majd ez a cikk)
Időközben találta ezt itt egy kezdőnek is érthetően van leírva.
Abban ne kételkedem, hogy továbbra sem értem teljesen sem a referenciát, sem a pointert, ugyanakkor sokkal értelmesebben leírta a cikk hogyan is használjam őket ha kell, mint a legtöbb írás amibe eddig belefutottam, beleérve a C++ programozási nyelv című könyvet.
Hogy fogalmazza meg, a szakrizsa tök jó meg minden de nekem pl. sem az objektum, sem a hardlink, se a másolókonstrukot, sem a többi elvont programozási szakszó nem mond semmit.
Ha el tudod mondani úgy hogy egy 0 programozási ismeretű ember is megértse megköszönöm, de az eddigi válaszok kb. annyit értek mint szarnak a pofon. (Nem kötözködés vagy bunkóság csak szófordulat.)
Ui.: Sajnos kénytelen vagyok ilyen cikkekből tanulgatni révén, hogy a magyar nyelvű C++ irodalom vagy feltételez egy programozási előismeretet (pl.: c), vagy teljesen elvont lsd.: C++ programozási nyelv című könyv.
Angol nyelvű anyagokból meg sokra nem megyek a gyatra angoltudásommal.
Pointer: memória cím (ami valójában 32/64bites unsigned int, OStől függ)
Referencia: van 2 azonos típusú változód, de ezeket egy
memóriacímen tárolja.
Lényege az, hogy a pointer memóriacímet ad, és ha
menet közben változik az, amire mutat, akkor a pointer
NEM változik! Referencia pedig igen!
van egy változód, amit használni akarsz, legyen az egy
class.
Eltárolod a címét egy pointerben és egy referenciában.
Idővel a változót destroyolod, beállítod NULL-ra, mert
már nincs rá szükséged.
A pointerbe az a cím lesz, amit használt a változó, a
referencia pedig NULL lesz.
Ha a pointert akkor hívod, miután már kilőtted a classt,
kapsz szép eaccessviolationt.
Ez az alapvető különbség.
A példaprocban meg tök mindegy, hogy csinálod,
mivel ekkora kódnál nincs jelentősége.
Ehhez picit érteni kellene a compiler működését :)
Egyébként hülyeség maga a példa is, összevissza referálsz :)
Jah, a különbség valójában az, hogy hány lépésben
hajtod végre a műveletet.
"A pointerbe az a cím lesz, amit használt a változó, a
referencia pedig NULL lesz."
Mi? Mi? Mi? A referencia NULL lesz?
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!