Ugrás a tartalomhoz

defaulted constructor

A Wikiszótárból, a nyitott szótárból


Főnév

defaulted constructor (tsz. defaulted constructors)

  1. (informatika) A C++11 szabvány bevezetett egy új lehetőséget az osztálytag függvények (például konstruktorok, destruktorok, másoló- és mozgató konstruktorok) egyszerűsített kezelésére: az úgynevezett defaultolás (= default) és tiltás (= delete). Ebben az írásban a = default konstruktorra koncentrálunk.



Mi az a defaulted konstruktor?

A defaulted konstruktor egy alapértelmezett konstruktor, amit nem te írsz meg kézzel, hanem megkéred a fordítót, hogy hozza létre automatikusan az osztályod számára.

A következő két sor funkcionálisan egyenértékű:

Esemeny() = default;

és

Esemeny() {}

Mindkettő egy üres konstruktor, amely nem csinál semmit. Azonban az = default jelzés explicit módon kéri a fordítót, hogy generálja az alapértelmezett konstruktort – ez különösen akkor hasznos, ha az osztályban már van más konstruktor, vagy valamilyen más szabály miatt a fordító nem hozná létre automatikusan.



🔎 Mikor hasznos a defaulted konstruktor?

A C++-ban, ha nem írsz semmilyen konstruktort, a fordító automatikusan létrehoz egy alapértelmezett konstruktort. De ha legalább egy másik konstruktort írsz (pl. paraméteres konstruktort), akkor a fordító már nem hoz létre alapértelmezett konstruktort.

Példa:

class Esemeny {
public:
    Esemeny(std::string nev);  // paraméteres konstruktor
    // Nincs automatikus default konstruktor!
};

Ebben az esetben, ha te mégis szeretnél egy alapértelmezett konstruktort, akkor ezt explicit módon ki kell fejezned:

class Esemeny {
public:
    Esemeny() = default;  // Itt kérjük explicit
    Esemeny(std::string nev);
};

⚙️ Működése a gyakorlatban

Tegyük fel, hogy van egy osztályod, ami tartalmaz néhány tagváltozót:

class Esemeny {
private:
    std::string nev;
    int kezdes = 0;
    int vege = 0;

public:
    Esemeny() = default;
};

A = default konstruktor itt létrehozza azt az alapértelmezett konstruktort, amely a nev nevű stringet az üres sztringgel inicializálja, a kezdes és vege változókat pedig a 0 értékkel (mert így lettek inicializálva a definíciójukban).



Előnyei az = default használatának

  1. Egyértelmű szándékjelzés A kódban világosan látszik, hogy tudatosan szeretnéd használni az alapértelmezett konstruktort – ez olvashatóbbá és karbantarthatóbbá teszi a kódot.
  2. Fordítói optimalizáció A = default használatával a fordító optimalizáltabb kódot tud létrehozni, mint amikor kézzel írsz üres konstruktort.
  3. Speciális esetek kezelése Olyan helyzetekben is engedélyezheted az alapértelmezett konstruktort, amikor az egyébként nem generálódna automatikusan (például ha van más konstruktor vagy destruktor).



🛑 Mikor nem használható automatikusan a default konstruktor?

Például, ha az osztályod tartalmaz egy nem defaultolható mezőt, például egy referencia vagy egy csak olvasható konstans, akkor a fordító nem tud létrehozni default konstruktort, mert nem tudná inicializálni az ilyen mezőket.

Példa:

class Problematic {
    const int x;  // nincs default érték!
public:
    Problematic() = default;  // Hibát fog dobni
};

🧱 Összehasonlítás más konstruktorokkal

Konstruktor típusa Leírás
Esemeny() Kézzel írt, üres konstruktor
Esemeny() = default; Fordító által generált alapértelmezett konstruktor
Esemeny() = delete; Tiltott konstruktor, például ha nem akarod, hogy példányosítsák alapértelmezés szerint



📦 Mintaosztály teljesen

#include <string>

class Esemeny {
private:
    std::string nev;
    std::string datum;
    int kezdes;
    int vege;
    int letszam;

public:
    Esemeny() = default;  // alapértelmezett konstruktor
    Esemeny(std::string n, std::string d, int k, int v, int l)
        : nev(n), datum(d), kezdes(k), vege(v), letszam(l) {}

    // Getters és setters (pl.)
    std::string getNev() const { return nev; }
    void setNev(const std::string& n) { nev = n; }
};

📚 Összefoglalás

A = default kulcsszó C++11 óta lehetővé teszi, hogy tiszta, egyértelmű és hatékony módon adjuk meg, hogy egy osztály függvénye (konstruktor, destruktor stb.) alapértelmezetten viselkedjen, azaz a fordító generálja automatikusan.

Használd, ha:

  • Tudatosan szeretnél egy üres konstruktor implementációt.
  • Van más konstruktor, és mégis szükséged van a defaultra is.
  • Szeretnél tiszta, jól dokumentált, és optimalizált C++ kódot írni.