Kezdőoldal » Számítástechnika » Programozás » Nem értem segítesz? C++

Nem értem segítesz? C++

Figyelt kérdés

//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?


2012. jan. 28. 19:35
 1/10 iostream ***** válasza:

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.

2012. jan. 28. 19:52
Hasznos számodra ez a válasz?
 2/10 A kérdező kommentje:
Nem értelek teljesen milyen átmeneti változók az mi?
2012. jan. 28. 21:26
 3/10 A kérdező kommentje:
Kérhetnék még magyarázatot?Kköszi.
2012. jan. 28. 21:32
 4/10 iostream ***** válasza:

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.

2012. jan. 28. 21:41
Hasznos számodra ez a válasz?
 5/10 A kérdező kommentje:

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.

2012. jan. 28. 22:28
 6/10 A kérdező kommentje:
Segítség de sürgős amúgy léci má.
2012. jan. 28. 23:13
 7/10 iostream ***** válasza:

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.

2012. jan. 28. 23:47
Hasznos számodra ez a válasz?
 8/10 iostream ***** válasza:

"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.

2012. jan. 28. 23:48
Hasznos számodra ez a válasz?
 9/10 A kérdező kommentje:

Igen tudom de bonyolultan írod le az egészet az a baj.

Segítsen valaki.

2012. jan. 29. 00:47
 10/10 iostream ***** válasza:
Mit nem értesz? Van KÉT objektum, a TheCat és a névtelen visszatérési érték. Mindkettő megsemmisül amikor visszatérsz a függvényből.
2012. jan. 29. 09:51
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!