Nem értem segítesz? C++
//main.cpp
# include <iostream> //std függvénykönyvtár
# include <stdlib.h> //return EXIT_SUCCESS
# include <windows.h> //Sleep(500),exit(0)
typedef unsigned short ushort;
typedef unsigned int uint;
using std::cout;
using std::cin;
using std::endl;
class SIMPLECAT
{
public:
SIMPLECAT(); //Konstruktor
SIMPLECAT(SIMPLECAT&); //Másoló konstruktor
~SIMPLECAT(); //Destruktor
};
SIMPLECAT::SIMPLECAT()
{cout <<"Konstruktor \n";}
SIMPLECAT::SIMPLECAT(SIMPLECAT&)
{cout <<"Copy konstruktor \n";}
SIMPLECAT::~SIMPLECAT()
{cout <<"Destruktor \n";}
SIMPLECAT FunctionOne(SIMPLECAT TheCat);
SIMPLECAT* FunctionTwo(SIMPLECAT *TheCat);
int main()
{
cout <<"Making a cat \n";
SIMPLECAT Frisky;
cout <<"\nCalling FunctionOne \n";
FunctionOne(Frisky);
cout <<"\nCalling FunctionTwo: \n";
FunctionTwo(&Frisky);
cin.get();
return EXIT_SUCCESS;
}
SIMPLECAT FunctionOne(SIMPLECAT TheCat)
{cout <<"FunctionOne returning \n";return TheCat;}
SIMPLECAT* FunctionTwo(SIMPLECAT *TheCat)
{cout <<"FunctionTwo returning \n";return TheCat;}
Ennél a résznél:
SIMPLECAT FunctionOne(SIMPLECAT TheCat)
{cout <<"FunctionOne returning \n";return TheCat;}
Meghívódik a másoló konstruktor ami ideiglenes objektumot csinál mert érték szerinti...... de mivel nem rendeljük hozzá azt semmilyen változóhoz ezért a destruktor is meghívódik,hogy azt eltávolítsa.
De ez után a kimenetben megint látni foglyuk,hogy a destruktor megint meghívódik.
A könyv szerint azért mert:
a számára készült helyi objektum másolat érvényét veszti és ezért megint meghívódik a destruktor na ezt nem értem.
Miért van így?
Van a függvényben lévő TheCat változó. Az a függvényre nézve lokális. Amikor visszatérsz, az semmisül meg. Utána a kifejezés véget ér, és megsemmisülnek az átmeneti változók, ez a második destruktorhívás.
Segítheted a debuggolást meg ilyesfajta megfigyeléseket, ha kiírod a this pointert is, az mindig egyértelműen azonosítja az objektumot, így látod mikor melyik semmisül meg.
Mondom, irasd ki a konstruktor/destruktorban a this pointert is.
Amúgy az, hogy a függvényben létrejön egy változó, a TheCat. Ez megsemmisül a return végrehajtásakor. Viszont a return végrehajtása közben létrejön egy temporális változó, a visszatérési értéknek fenntartott helyen, amit aztán nem használ fel a környezet, ezért legyilkolja.
Ki írattam a this-t de nem értem.
Hihetetlen amikor én magyarázok el valakinek valamit akkor azt úgy megtudom tenni hogy egyből megérti .
De itt szenvedni kell órákat hogy egy normálisabb magyarázatot kapjak.
SIMPLECAT FunctionOne(SIMPLECAT TheCat)
{cout <<"FunctionOne returning \n";return TheCat;}
Na akkor az első destruktor megsemmisíti a TheCat ideiglenes másolatát amit a copy konstruktor hozott létre.
Ez a másolat azért semmisül meg mert nem rendeljük hozzá egy változóhoz sem így aztán meghívódik a destruktor és törli.Na ezt értem.
De ez után még egyszer meghívódik a destruktor de miért nem értem pedig a könyv leírta meg itt is leírták de nem tudom értelmezni.
Valaki magyarázza el érthetőbben,és ne úgy mintha már 1000 éve programoznák mert még csak tanuló vagyok.
Kösz.
Nem, ezt pofázom, hogy a TheCat az a FÜGGVÉNY változója. Nem ideiglenes abban az értelemben, ahogy azt a C++ szabvány ideiglenesnek nevezi. Ideiglenes az a kifejezések által előállított érték, például egy függvény visszatérési értéke.
A függvényben amikor átadod neki a változót és ő azt lemásolja, akkor lesz egy másolat. Ez a TheCat néven fut. Ez megsemmisül a return alatt. Ez MELLETT a return alatt létrejön egy másik, névtelen objektum, ami a visszatérési érték. Ez kopikonstruálkódik a TheCat-ből, és aztán megsemmisül.
"Hihetetlen amikor én magyarázok el valakinek valamit akkor azt úgy megtudom tenni hogy egyből megérti .
De itt szenvedni kell órákat hogy egy normálisabb magyarázatot kapjak."
Lehet ez azért van, mert nem tudsz kérdezni. Illetve ahogy nézem olvasni sem. Mindent leírtam már az első válaszban is.
Igen tudom de bonyolultan írod le az egészet az a baj.
Segítsen valaki.
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!