Ebben a sorban mi történik? C++
class X {
public:
X(): s(0) {}
X(int f): s(f) {}
private:
int s ;
};
int main() {
X x;
int j = 8 ;
x = j ; /*Itt mi történik?Az x szerintem nem deklarálódik újra.Akkor a j ből lesz egy ú objektum?De ha így történik akkor az,hogy lehet,hogy két objektumot egymásnak tudok rendelni?Mi folyik itt?*/
return 0;
}
x = j;
Alakítsuk át egy kicsit. Ugye az operátor csak egy fancy módja a függvényhívásnak:
x.operator=(j);
Az operator= viszont const X&-t vesz át, a j meg egy int, hogy lehet ez?
x.operator=(X(j));
Mivel X-nek van egy intet átvevő, egyparaméteres konstruktora, az csendben egy temporális X objektummá alakul, és átadódik az operator=-nek, ami felülírja x dolgait.
Ez is egy user-defined konverzió, pont mint a konverziós operátorok. Ha meg akarod akadályozni, tedd ki az explicit kulcsszót a konstruktor elé (ahogy pl a vectort is lehet inicializálni egyetlen inttel, de mégsem fordulna le egy ilyen kód, mert explicit az a konstruktora).
iostream itt miről beszélsz?
"Az operator= viszont const X&-t vesz át, a j meg egy int, hogy lehet ez?
x.operator=(X(j));
Mivel X-nek van egy intet átvevő, egyparaméteres konstruktora, az csendben egy temporális X objektummá alakul, és átadódik az operator=-nek, ami felülírja x dolgait."
Az én példámban nincs operator= akkor miért hozod ezt szóba?
Itt csak egy konstruktor van ami egy paramétert vár.
És ebben a sorban: x = j; nem történik konstruktorhívás.
Az X típusnak pedig nincsen se X re hivatkozást váró operator= je sem pedig int típust váró operator= je.
Akkor most mi történik itt:
x = j ;
j nem tudom hozzárendelni x hez mert x nek nincs operator= je.Itt pedig meghívódik a konstruktor.Ami talán a j int ből hoz létre egy új objektumot.
Ha ez igaz akkor ez történik :
obj1 = obj2;
De az X típusnak nincs olyan operator= egyenlője ami x típust várna úgyhogy nem értem.
"Mivel X-nek van egy intet átvevő, egyparaméteres konstruktora, az csendben egy temporális X objektummá alakul, és átadódik az operator=-nek, ami felülírja x dolgait. "
Ez hogy lehetséges ha az X típusomnak nincs operator= je?
iostream nem értelek.
Akkor itt ez történik?:
x = X(j) ;
De ha az X típúsnak nincs olyan operator= je ami X& várna akkor hogy lehetséges az amit írtál?
Úgy, hogy minden osztálynak van másoló- és alapértelmezett konstruktora, destruktora, és = operátora, fordító által generálva, annyi kiegészítéssel, hogy ha megadsz bármilyen konstruktort, akkor a generált két konstruktort elveszíted (legalábbis ha adsz másolót, akkor a defaultot elveszíted).
Az alapértelmezett = operátor azt csinálja, hogy minden tagot egyenként = operátorral átmásol. Ez lehet elég (pl ha csak egy int adattagod van), de lehet hibás is.
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!