Itt most milyen konstruktorhívás történik a new után? (C++)
ListaElem* p;
ListaElem* temp = new ListaElem(*p);
Azt odáig értem, hogy az = jelnél copy hívódik, de a new után milyen konstruktor hívódik??? Mert ugyan én ilyet nem írtam! (Egyébként kidebuggoltam, és a második sorban pontosan EGYSZER hívódik copy. )
bocs, helyesen így néz ki:
ListaElem* p;
p= ertek; //értékadás
ListaElem* temp = new ListaElem(*p);
Milyen konstruktorhívás történik?
No. Ha leírod ezt, hogy
class P
{
};
akkor automatikusan generál neked három függvényt:
P();
P(const P&);
~P();
Ha írsz bármilyen konstruktort ami nem egy darab const P& paramétert vesz át, akkor a P()-t nem generálja le, de a P(const P&)-t igen, ezt hívjuk másoló konstruktornak. A fordító által írt verzió azt csinálja, hogy az összes tagra meghívja a másolókonstruktort (összetett típus esetén) vagy simán bitre pontosan átmásolja (beépített típusnál).
Tehát pl
class asd
{
int x, y;
vector<int> z;
};
Az asd osztály (automatikusan generált) másoló konstruktora át fogja kopizni az x és az y értékét a paraméterül kapott objektumból az újonnan létrehozottba, és meghívja a saját tagvectorán a másoló konstruktort a kapott asd objektum vektorával, tehát kb ilyesmi kódot generál:
asd(const asd& oth): x(oth.x), y(oth.y), z(oth.z)
{}
A második kérdésedre pedig: a fordító egyrészt dönthet úgy, hogy nem hív meg feleslegesen függvényeket, optimalizál. Másrészt a temp egy pointer, aminek nincs konkrétan konstruktora (van neki, de semmiképp nem történik függvényhívás), tehát lekonsruálódik a ListaElem ojjektum, aztán annak a címe, amit visszaadott a new bemásolódik a tmp-be.
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!