Konstruktory

David
Matfyz(ák|ačka) level II
Příspěvky: 80
Registrován: 7. 11. 2004 18:57
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Konstruktory

Příspěvek od David »

Chvili jsem si hral s jednim prikladem ze zkousky a dospel jsem k neblahemu zjisteni. - Vubec tomu nerozumim...

Jde o tohle:

Kód: Vybrat vše

class U {
public:
	U() {a = 1; cout << "1" << endl;}
	U(int i) {a= i + 2;}
	int a;
};

class T: public U
{
public:
	T() : U(2) { }
	T(int i) {a = a + 3;}
	T(const U &p):U(p.a) {  }
	T(const T &p): U(p.a) { }
};
Kdyz napisu:

Kód: Vybrat vše

T y;
T x = y;
je v x.a podle ocekavani 6. (v y.a jsou 4, pri T x = y se zavola kopirovaci konstruktor...)

Kdyz ale napisu:

Kód: Vybrat vše

T x = T();
tak se kopirovaci konstruktor nezavola a v x.a jsou 4.
Jak je to mozne? Nemely by oba zapisy udelat to same?

Jeste jsem zkousel odstranit kopirovaci konstruktor:

Kód: Vybrat vše

T(const T &p): U(p.a) { }
To se kopirovaci konstruktor nezavola ani v prvnim zapisu s promennou y. Proc? - y je typu T, muze se tedy zkonvertovat na predka a zavolat se prvni konstruktor?

Nebo ne? (No, ja vim, ze ne...)

Diky moc
Uživatelský avatar
Tuetschek
Supermatfyz(ák|ačka)
Příspěvky: 657
Registrován: 15. 6. 2005 13:54
Typ studia: Nestuduji ale učím na MFF
Kontaktovat uživatele:

Příspěvek od Tuetschek »

Kód: Vybrat vše

T x = T(); 
mi moc jasny neni... asi to bude synonymum k

Kód: Vybrat vše

T x();
, ale to dost hadam.

U toho druhyho bych rekl ze kdyz copy constructor odstranis, vola se defaultni prekladacem vygenerovany, ktery vola defaultni konstruktor na predky - tedy U. Vzhledem k tomu ze i x i y jsou uz predem stejneho typu T, neprichazi nejake konvertovani v uvahu.

-- opravte me nekdo jestli kecam :)
Plug 'n' Pray.
David
Matfyz(ák|ačka) level II
Příspěvky: 80
Registrován: 7. 11. 2004 18:57
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Příspěvek od David »

Dik.
Ten prvni obrat je teda dost hloupost. - V normalnim kodu nema smysl to tak psat. Na druhou stranu, kdyz se clovek podiva na nektere pisemky z cecka (hlavne z minuleho roku), tak se to tam podivnymi konstrukcemi jenom hemzi... A podle me by se mel ten kopirovaci konstruktor zavolat. Teoreticky... :)

Ten druhy ale podle me ma smysl -
U toho druhyho bych rekl ze kdyz copy constructor odstranis, vola se defaultni prekladacem vygenerovany, ktery vola defaultni konstruktor na predky - tedy U. Vzhledem k tomu ze i x i y jsou uz predem stejneho typu T, neprichazi nejake konvertovani v uvahu.
I kdyz mam promenne stejneho typu, tak na ne muzu chtit volat svuj kopirovaci konstruktor. - Kdyz bych mel v U nejaky pointer a chtel bych zkopirovat data, na ktera ukazuje (ne zkopirovat hodnotu pointeru), tak by mi defaultni konstruktor nestacil.
qk
Matfyz(ák|ačka) level III
Příspěvky: 181
Registrován: 24. 2. 2005 10:03
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od qk »

David píše: Ten druhy ale podle me ma smysl -
U toho druhyho bych rekl ze kdyz copy constructor odstranis, vola se defaultni prekladacem vygenerovany, ktery vola defaultni konstruktor na predky - tedy U. Vzhledem k tomu ze i x i y jsou uz predem stejneho typu T, neprichazi nejake konvertovani v uvahu.
I kdyz mam promenne stejneho typu, tak na ne muzu chtit volat svuj kopirovaci konstruktor. - Kdyz bych mel v U nejaky pointer a chtel bych zkopirovat data, na ktera ukazuje (ne zkopirovat hodnotu pointeru), tak by mi defaultni konstruktor nestacil.
no
1) opravdu bude misto toho implicitni
2) nevola se konstruktor predka, ale copy konstruktor a to na predka a na vsechny datovy polozky tridy.
3) opravdu je vlastni copy konstruktor v hodne pripadech uzitecny
Don't worry, be dead
David
Matfyz(ák|ačka) level II
Příspěvky: 80
Registrován: 7. 11. 2004 18:57
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Příspěvek od David »

Dik. Uz mi to je jasne. (ta druha cast)
Odpovědět

Zpět na „2005“