object-oriented constructor

Üdvözlöm, Ön a object-oriented constructor szó jelentését keresi. A DICTIOUS-ban nem csak a object-oriented constructor szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a object-oriented constructor szót egyes és többes számban mondani. Minden, amit a object-oriented constructor szóról tudni kell, itt található. A object-oriented constructor szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Aobject-oriented constructor és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

object-oriented constructor (tsz. object-oriented constructors)

  1. (informatika) A konstruktor (constructor) egy speciális függvény C++-ban, amely akkor fut le, amikor egy objektum létrejön. A célja az, hogy az objektumokat inicializálja (alapértelmezett értékeket állítson be, erőforrásokat foglaljon stb.).



1. Mi az a konstruktor?

A konstruktor egy osztály speciális tagfüggvénye, amely: - Ugyanolyan nevű, mint az osztály, és - Nincs visszatérési értéke (még void sem).

Példa konstruktorra:

#include <iostream>
using namespace std;

class Auto {
public:
    string marka;

    // Konstruktor
    Auto() {
        marka = "Ismeretlen";
        cout << "Konstruktor meghívva!" << endl;
    }
};

int main() {
    Auto a1;  // Konstruktor automatikusan lefut
    cout << "Márka: " << a1.marka << endl;
    return 0;
}

Kimenet:

Konstruktor meghívva!
Márka: Ismeretlen

Amikor az Auto osztályból létrehozunk egy a1 objektumot, a konstruktor automatikusan lefut.



2. Konstruktor típusok

A konstruktorokat többféleképpen lehet definiálni:

  1. Alapértelmezett konstruktor (Default constructor)
  2. Paraméterezett konstruktor (Parameterized constructor)
  3. Másoló konstruktor (Copy constructor)
  4. Mozgató konstruktor (Move constructor, C++11)
  5. Explicit konstruktor (Explicit constructor)
  6. Virtuális konstruktor (lehetetlen, de van workaround)



3. Alapértelmezett konstruktor

Az alapértelmezett konstruktor olyan konstruktor, amely nem fogad paramétereket.

Példa:

class Szemely {
public:
    string nev;
    
    // Alapértelmezett konstruktor
    Szemely() {
        nev = "Ismeretlen";
    }
};

int main() {
    Szemely s;
    cout << "Név: " << s.nev << endl;
    return 0;
}

Ha nem írunk saját konstruktort, a fordító automatikusan generál egy üres alapértelmezett konstruktort.



4. Paraméterezett konstruktor

A paraméterezett konstruktor lehetővé teszi, hogy az objektum létrehozásakor értékeket adjunk át.

Példa:

class Auto {
public:
    string marka;
    
    // Paraméterezett konstruktor
    Auto(string m) {
        marka = m;
    }
};

int main() {
    Auto a1("Toyota");
    Auto a2("BMW");

    cout << "A1 márka: " << a1.marka << endl;
    cout << "A2 márka: " << a2.marka << endl;
    return 0;
}

Kimenet:

A1 márka: Toyota
A2 márka: BMW

5. Másoló konstruktor

A másoló konstruktor egy másik objektum alapján hozza létre az új objektumot.

Példa:

class Ember {
public:
    string nev;

    // Paraméterezett konstruktor
    Ember(string n) {
        nev = n;
    }

    // Másoló konstruktor
    Ember(const Ember &e) {
        nev = e.nev;
    }
};

int main() {
    Ember e1("Gábor");
    Ember e2 = e1;  // Másoló konstruktor hívódik meg

    cout << "E1 név: " << e1.nev << endl;
    cout << "E2 név: " << e2.nev << endl;
    return 0;
}

Kimenet:

E1 név: Gábor
E2 név: Gábor

Ha nem írunk saját másoló konstruktort, a fordító automatikusan generál egyet.



6. Mozgató konstruktor (C++11)

A mozgató konstruktor lehetővé teszi a hatékony erőforrás-átadást rvalue referencia (&&) segítségével.

Példa:

#include <iostream>
using namespace std;

class Adat {
public:
    int* ptr;

    // Alapértelmezett konstruktor
    Adat(int ertek) {
        ptr = new int(ertek);
    }

    // Mozgató konstruktor
    Adat(Adat&& masik) {
        ptr = masik.ptr;
        masik.ptr = nullptr;  // Az eredeti objektum erőforrását átvesszük
    }

    ~Adat() {
        delete ptr;
    }
};

int main() {
    Adat a1(42);
    Adat a2 = move(a1);  // Mozgató konstruktor fut le

    return 0;
}

Ez gyorsabb, mint a másoló konstruktor, mert nem másolja az adatokat, csak áthelyezi őket.



7. Explicit konstruktor

Ha egy konstruktor csak egy paramétert fogad el, akkor implicit konverziót végezhet:

class Ember {
public:
    string nev;
    
    // Implicit konverzió lehetséges
    Ember(string n) {
        nev = n;
    }
};

int main() {
    Ember e = "Péter";  // Automatikus konverzió működik
    return 0;
}

Ha ezt meg akarjuk tiltani, használhatjuk az explicit kulcsszót:

class Ember {
public:
    string nev;

    explicit Ember(string n) {
        nev = n;
    }
};

int main() {
    // Ember e = "Péter";  // Fordítási hiba!
    Ember e("Péter");  // Csak ez működik
    return 0;
}

8. Konstruktorok öröklésben

Ha egy osztály egy másik osztályból öröklődik, a szülőosztály konstruktorát is meg kell hívni.

Példa:

class Szemely {
public:
    string nev;

    Szemely(string n) {
        nev = n;
    }
};

class Diak : public Szemely {
public:
    int jegy;

    // A szülő konstruktorának meghívása
    Diak(string n, int j) : Szemely(n) {
        jegy = j;
    }
};

int main() {
    Diak d("Ádám", 5);
    cout << "Diák neve: " << d.nev << ", jegy: " << d.jegy << endl;
    return 0;
}

Kimenet:

Diák neve: Ádám, jegy: 5

A Szemely(n) hívja meg a szülőosztály konstruktorát.



9. Virtuális konstruktor (NEM létezik, de van megoldás)

C++-ban nincs virtuális konstruktor, de gyárfüggvénnyel lehet hasonlót elérni:

class Alap {
public:
    virtual ~Alap() {}
    virtual Alap* ujPeldany() const = 0;
};

class Szarmaztatott : public Alap {
public:
    Szarmaztatott* ujPeldany() const override {
        return new Szarmaztatott(*this);
    }
};

Összegzés

A konstruktorok lehetővé teszik az objektumok helyes inicializálását, és többféle típusa van: - Alapértelmezett - Paraméterezett - Másoló - Mozgató - Explicit - Öröklött konstruktorok