defaulted constructor
Főnév
defaulted constructor (tsz. defaulted constructors)
- (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= defaultkonstruktorra 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
- 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.
- Fordítói optimalizáció A
= defaulthasználatával a fordító optimalizáltabb kódot tud létrehozni, mint amikor kézzel írsz üres konstruktort. - 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.
- defaulted constructor - Szótár.net (en-hu)
- defaulted constructor - Sztaki (en-hu)
- defaulted constructor - Merriam–Webster
- defaulted constructor - Cambridge
- defaulted constructor - WordNet
- defaulted constructor - Яндекс (en-ru)
- defaulted constructor - Google (en-hu)
- defaulted constructor - Wikidata
- defaulted constructor - Wikipédia (angol)