Kezdőoldal » Számítástechnika » Programozás » Ebben a sorban mi történik? C++

Ebben a sorban mi történik? C++

Figyelt kérdés

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;

}


2012. nov. 27. 11:10
 1/8 iostream ***** válasza:

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

2012. nov. 27. 11:42
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:

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.

2012. nov. 27. 13:49
 3/8 A kérdező kommentje:

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

2012. nov. 27. 13:52
 4/8 A kérdező kommentje:
Írjátok már le érthetőbben pls.
2012. nov. 27. 15:30
 5/8 A kérdező kommentje:

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?

2012. nov. 27. 15:56
 6/8 iostream ***** válasza:

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

2012. nov. 27. 16:36
Hasznos számodra ez a válasz?
 7/8 A kérdező kommentje:
ááá tényleg ezt tudtam csak elfelejtettem mert nem szoktam pointereket használni.Szinte mindig jól működi,hogy ha nem kell pointerezni.
2012. nov. 27. 16:42
 8/8 iostream ***** válasza:
És általában nem kell pointereket használni, sőt ellenjavalt. Lásd RAII.
2012. nov. 27. 19:05
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!