Hirdetés

Keresés

Új hozzászólás Aktív témák

  • dobragab

    addikt

    válasz EQMontoya #3321 üzenetére

    Konkrétan C++98-ban:

    - default ctor: végighívja az ősosztályok és adattagok default ctor-át, sorrendben. Ha írsz bármilyen ctort, ami nem copy ctor, bukod a default ctort, kézzel kell írnod, ha akarsz. (vagy = default, C++11-ben)
    - copy ctor: végighívja az ősosztályok és adattagok copy ctor-át, sorrendben.
    - operator=: végighívja az ősosztályok és adattagok operator=-jét, sorrendben.
    - dtor: végighívja az adattagok és ősosztályok dtor-át, ebben a sorrendben

    - címképző operátor (&)
    - vessző operátor (,)

    Ehhez hozzá jön a C++11-es move ctor és move assignment operator, ami ha kínai, nézz utána alaposan a jobbérték referenciáknak.
    - move ctor: a move ctor-okat hívja végig, ha van, egyébként a copy ctort
    - move op=: a move op=-ket hívja végig, ha van, egyébként a sima op=-t

    Ez a kettő csak akkor van, ha
    - nincs a felhasználó által írt copy ctor vagy dtor,
    - nincs a felhasználó által írt másoló vagy move operator=,
    - nincsen valami miatt implicit törölve (például mert az egyik adattagé törölve van).

    Mindennek az a célja, hogy az erőforráskezelést el tudd rejteni egy-egy erre specializált osztály belsejébe, pl. string vagy vector. Ezeket aztán máshol úgy tudod használni, mint egy sima int-et, mert a fordító mindig tudja, mikor mit kell meghívni. A felsőbb szintű (nem erőforráskezelő) osztályoknak nem kell foglalkoznia a fent említett tagfüggvényekkel, a default is úgy fog működni, ahogy elvárjuk.

    Nyilván ez nagyon le van egyszerűsítve, de nagyságrendileg stimmel.

    Jávához képest: van destruktor, mégpedig arra, hogy bármilyen erőforrást (memória, fájl, mutex, grafikus memória, stb.) becsukjon. Ha jól tervezed meg az osztályaidat, ezek mind automatikusan történnek. A GC ennél butább, mert csak memóriát szabad / lehet rábízni.

    Jó, igen a finalize-ra elvileg rá lehet bízni pl. egy fájl bezárását, de az ki tudja, mikor fut le... Nagyon nem vicces nyitva hagyni egy fájlt random ideig, amíg a GC össze nem szedi a memóriában lévő objektumot. Ezért van jávában minden fájlkezelős történet try - catch - finally blokkban, hogy akármi történik, kézzel be tudd csukni a fájlt. C++-ban a compiler biztosan becsukja a fájlt a blokk végén (fstream).

    Kicsit elkanyarodtam a kérdéstől. Remélem, azért mondtam újat, rosszat meg nem :D

Új hozzászólás Aktív témák