Kezdőoldal » Számítástechnika » Programozás » "Copy constructor"nak mi a...

"Copy constructor"nak mi a haszna C++ nyelvben?

Figyelt kérdés
2014. ápr. 28. 20:01
 1/7 anonim ***** válasza:
100%

[link]


Szerintem ennyi elég is lesz.


De ha nem: másolatot készít az objektumról, inicializáláskor lehet használni(használódik)

2014. ápr. 28. 21:51
Hasznos számodra ez a válasz?
 2/7 iostream ***** válasza:
90%

Képzeld el:

X x;

x = kezdőérték;


Vagy

X x = kezdőérték;


Melyik a hatékonyabb, létrehozni egy objektumot, és utána feltölteni értékkel, vagy eleve az adott értékkel létrehozni? Melyik veszélyesebb (esetleg elmarad a feltöltés, vagy beékelődik a feltöltés és a létrehozás közé valami)?

2014. ápr. 28. 22:15
Hasznos számodra ez a válasz?
 3/7 anonim ***** válasza:
100%

Ami miatt igazából kitalálták, az a dinamikus adatokra való hivatkozás, mint adattag másolása.


Tegyük fel, hogy van egy objektumod, amihez egy sztring tartozik, de nem része az objektum adatterületének, hanem csak hivatkozik rá. Csak a hivatkozás van az objektumban tárolva. Ha ebből az objektumból csinálsz egy másolatot, akkor az új objektum minden adata másolódik, a hivatkozás is, vagyis ugyanarra a sztringre fog mutatni, mint az eredeti.


Ilyenkor (is) hasznos a copy-constructor, mert abban meg lehet írni, hogy másoláskor másolja le a dinamikus adatokat is.

2014. ápr. 29. 17:12
Hasznos számodra ez a válasz?
 4/7 gyikjoe válasza:
0%

Úgy gondolom mellébeszélnek a válaszolók, hiszen a "mi a haszna" kérdésre nem az a válasz, hogy hogyan működik. Elsősorban szerintem az a kérdés, hogy minek létrehozni egy vele teljesen megegyező másolatot egy objektumról, ha már van belőle egy példány, amire elég lehetne csak hivatkozni.

Általában ha erre van szükség akkor rossz tervezésről árulkodik, de azért néha mégis van haszna dolognak. Bizonyos kifejezések, könyvtári függvények érték szerint kezelik az objektumokat, ideiglenes másolatokat hoznak létre, stb., ezek csak akkor tudnak jól működni, ha helyesen van definiálva a copy constructor.

Kicsit olyan ez mint virtuális öröklődés, akadémiai kódban lehet róla elmélkedni, elméletben ki lehet találni olyan eseteket amikor tök hasznos, való életben jobb, ha nincs.

Általában a copy constructor elrejti az objektumok másolódását a fejlesztő elől, ezért kényelmes, de sok apró hülyeség összeadódásával káros lehet a teljesítményre.

2014. máj. 5. 08:17
Hasznos számodra ez a válasz?
 5/7 iostream ***** válasza:

Szerintem te beszélsz butaságokat, és az én válaszom pont a mi a haszna kérdésre adott választ: hibalehetőségeket zár ki és gyorsítja a programot.


Egy C++ féle nyelvben elkerülhetetlen, hogy objektumok másolódjanak. Ez nem hiba, nem rossz tervezés, így működik a nyelv logikája. Kis objektumoknál sokkal hatékonyabb lemásolni, mint indirekcióval szenvedni. Ha kell egy másikkal megegyező, de duplikátum (mert mondjuk módosítani akarod, csak kellett az alapállapot), akkor szintén hasznos.

Te azt a kérdést feszegeted, hogy minek másolatokat készíteni objektumokról. Ez rossz megközelítés, hiszen akkor az értékadást is ekézhetnéd. A copy constructor dolga a másolat készítése egy speciális esetben. Ez a haszna, hogy abban a speciális esetben jobban készít másolatot, mint az értékadás. Az, hogy maga a másolatkészítés hasznos-e, már magasabb szintű kérdés.

2014. máj. 5. 10:25
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:

Az eszem megáll, miért kell a jó válaszokba is belekötni?

Pont te beszéltél arról, hogy ha valamiről "akadémiai kódban" lehet csak elmélkedni, akkor az nem valami hasznos a gyakorlatban.

Ehhez képest pont a leggyakorlatiasabb választ pécézted ki magadnak. Szerinted mondjuk egy stringnek nem kell copy constructor? Vagy egy komplex számnak, szintén iskolapélda. Az std::string-nek is van. Akkor most mi van? ..

2014. máj. 5. 20:13
Hasznos számodra ez a válasz?
 7/7 gyikjoe válasza:

Lehet én értem félre a kérdezőt, de szerintem a "mi haszna?" kérdés nem azt jelenti, hogy fogalmam sincs mi az, idézzétek a tankönyvi definíciót, hanem azt, hogy tudom mi a copy konstruktor (elég nehéz is lenne nem tudni, benne van a nevében) de felületes információk alapján nem látszik minek van egyáltalán.

Szerintem az előttem válaszolók az előbbire korlátozódtak, és az utóbbi témát nem érintették kellő súllyal, ezért kritizáltam a válaszokat.


Pont a komplex számos hülyéskedésről beszéltem, amikor azt mondtam, a gyakorlatban ritkán van haszna, gyönyörűen cáfoltad magad :)


A string is pont jó példa, hogy lehet a copy ctornak köszönhetően brutális teljesítményvesztést elérni.


A copy ctor elsődleges haszna, hogy egy összetett objektum elemi egységgé absztrahálva használható kifejezésekben. Ez néha jó, mert szép és átlátható kódot eredményez. De rossz, mert implicit, temporáris példányosítást eredményez, igen gyakran szükságtelenül pocsékolva az erőforrásokat.

Nagy hátránya, hogy van belőle default, ami általában hibás működést eredményez, illetve, hogy gyakorlatlan szem alig veszi észre, hogy hol hívódik. (Pl. iostream felahsználó első példájáról sem mindenki mondaná meg kapásból, hogy az "=" operátor használata nem a "=" operátort hívja, hanem a copy ctort)


Általános ökölszabály, hogy a copy ctort, assignment operátort deklaráljuk privátnak (vagy deleted-nek, c++11 óta), és csak akkor térjünk el ettől ha alaposan átgondoltuk és tudjuk mit csinálunk. Ezzel elérjük, hogy a fordító hibát jelez, ha úgy használjuk az objektumot ahogy általában nem kéne.


Ismét hangsúlyoznám, az átgondolatlan reflexszerű támadások elkerülésére, hogy a copy ctornak van haszna, de gyakorlatban ez ritkán a legjobb megoldás.


Ha komplex számok kezelését akarod megírni 50 milliomodszor a törénelemben, akkor bizony copy ctor és egy rakás operátor definiálása szükséges. De ez inkább elméleti lehetőség :)

2014. máj. 6. 05:16
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, 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!