Valaki elmagyarázná nekem? C++
SIMPLECAT* FunctionTwo(SIMPLECAT *TheCat)
{cout <<"FunctionTwo returning \n";return TheCat;}
/*Így jó.Itt látom,hogy a függvény egy memóriacímet ad vissza igaz?*/
SIMPLECAT* FunctionTwo(SIMPLECAT *TheCat)
{cout <<"FunctionTwo returning \n";return *TheCat;}
/*Így már nem jó nem értem miért.Hisz lássátok a függvény visszatérési értékéből kiderül,hogy amit vissza fogok adni az egy mutató lesz.De mégsem jó csak akkor ha kiveszem a visszatérési értékből a * got.*/
SIMPLECAT& FunctionTwo(SIMPLECAT *TheCat)
{cout <<"FunctionTwo returning \n";return *TheCat;}
/*De így már működik nem értem miért.Most pedig megmondtam a függvénynek,hogy a visszatérési értéke egy hivatkozás lesz és még is mutatót adok vissza.*/
SIMPLECAT& FunctionTwo(SIMPLECAT *TheCat)
{cout <<"FunctionTwo returning \n";return TheCat;}
/*Így pedig egy hivatkozást ad vissza ha jól tudom így van.Mert ha igen akkor a fordító a kódkörnyezetből deríti ki,hogy most egy mutatót vagy hivatkozás ad e vissza.
Ez teljesen meg egyezik az előző függvény visszatérési értékével csak annyiból más,hogy nem raktam * jelzést a TheCat elé.*/
Szóval ha ez a függvény visszatérési értéke(SIMPLECAT)akkor az objektum másolatát adja vissza a függvény.Igaz? pl return TheCat;
Ha pedig ez a függvény visszatérési értéke(SIMPLECAT*)akkor az objektum memóriacímét fogja vissza adni.Igaz? pl return TheCat;
Ha pedig(SIMPLECAT&)akkor pedig azt amit a mutató a megadott memóriacímen tárol.Igaz? pl return *TheCat.
De viszont ez a függvény így is jól működik return TheCat.Szóval ebben az esetben(return TheCat) nem azt adja vissza amit a memóriacímen tárol hanem egy hivatkozást az az eredetinek név változatát.Ugyan az amúgy nem?Ebben az esetben a return *TheCat és a return TheCat ugyan az nem?Csak az egyik név változat míg a másik egy memória címen levő objektum.Jól mondom?
Szia!
Az első esetben igen jól látod egy mutatott memóriacímet ad vissza. A második eset azért nem jó,mert *TheCat -ot adsz vissza,de mivel TheCat egy pointer, *TheCat már a pointer által mutatott ÉRTÉK -et ad vissza,és nem pointert,pedig azt vár visszatérési értékként,te pedig értéket akarsz visszaadni. A harmadik eset azért működik,mert a visszatérési érték referenciáját kapod vissza. Negyedik esetben pedig a pointer címét kapod vissza. Mivel a pointer is SIMPLECAT típusú és van értéke,így a visszatérés ennek a pointernek a referenciája.
egyébként még egy példát is írok hogy megértsd pontosan a különbséget:
int szam = 6;
int* pszam = &szam;
std::cout << szam << std::endl;
std::cout << *pszam << std::endl;
std::cout << &szam << std::endl;
std::cout << pszam << std::endl;
Mi történik? Létrehozunk egy integer típusú szám változót 6 értékkel. Ez létrejön valahol a memóriában. Utána egy integer pointert is csinálunk,aminek az értéke a szam memóriacíme(referencia).
Kiíratások sorrendben:
Első esetbern nyílván megkapjuk,hogy 6
Második esetben a pointer által mutatott helyen szereplő értéket kapjuk vissza,tehát 6-ot. Harmadik esetben a szam változó memóriacímét,hisz a referenciáját íratjuk ki. Negyedik esetben pedig a pointer értékét,ami nem azonos a pointer által mutatott értékre, és mivel a pointer egy memóriacímet tárol,ezért a szam változó memóriacímét kapjuk vissza,tehát ugyanazt,amit a harmadik esetben.
14:45 válaszoló elég jól elmagyarázta.
De még mindig nem tiszta.
1.Az első esetben igen jól látod egy mutatott memóriacímet ad vissza.
2.Negyedik esetben pedig a pointer címét kapod vissza. Mivel a pointer is SIMPLECAT típusú és van értéke,így a visszatérés ennek a pointernek a referenciája.
Ez a kettő ugyan az akkor most mi van? :(
Értem mi nem tiszta. Figyelj:
1. eset SIMPLECAT* a függvény visszatérési értéke. A TheCat SIMPLECAT* azaz egy pointer. A pointer memóriacímet tárol,ezért visszatéréskor tulajdonképpen TheCat értékét ,azaz egy memóriacímet ad vissza.
4. eset Érdemes tisztázni,hogy a pointer is egy változó,létrejön a memóriában és így magának a pointernek is van memóriacíme,viszont mivel a pointer mutat valahova így az értéke is egy memóriacím. A pointernek van típusa,még pedig az általa mutatott memóriacímen található érték típusa. jelen esetben SIMPLECAT. Te visszatérési értéknek egy SIMPLECAT& -t vársz és visszaadod a TheCat pointert.És ilyenkor a pointer memóriacímét kapod vissza ,és nem pedig a pointer által mutatott memóriacímet.
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!