Osztályok és objektumok, Öröklés és Példányosítás Flashcards
Mi az OOP fogalma?
Olyan programozási technika, amely a programokat objektumokból építi fel. A program működése tulajdonképpen objektumok (minden objektumnak megvan a jól meghatározott feladata) kommunikációját jelenti. Legfontosabb alapelvei: egységbezárás, öröklődés, polimorfizmus.
mi az osztály?
Osztály (Class): Az osztály egy felhasználói típus, amelynek alapján példányok (objektumok) hozhatók létre. Az osztály alapvetően adat és metódus (művelet) definíciókat tartalmaz.
Mi az objektum?
Objektum (példány): Információt (adatokat) tárol és kérésre műveleteket végez. Van állapota, viselkedése és futásidőben azonosítható. Egy osztály példánya.
Mi az osztálydeklaráció kulcsszava
class
mutass példát egy osztályra
class Person { // Access specifier public: Person(string inputName){ name = inputName; } // Data Members string name;
// Member Functions() void printname() { cout << "Name is: " << name; } };
Az osztály tagjai.
Mik a mezők?
mezők: az objektum aktuális állapotát tárolják
Mik a metódusok?
metódusok: valamilyen művelet végeznek el, ez lehet mezők értékének lekérdezése vagy megváltoztatása az adott objektumon
Mik a konstruktorok?
konstruktorok: az objektum létrehozásakor végzi a mezők beállítását általában, de bármilyen logikát lehet benne implementálni, legtöbbször tényleg mezők kezdőértékének beállítását végzi.
Mezők
Mik a mezők jellemzői?
Definiáláskor meg kell adni a mezőben tárolandó adat típusát – Nevet kell kapjon a mező, mivel ezen a néven lehet rá hivatkozni később – A definícióban van lehetőség kezdőérték beállításra is – Kezdőértéket még konstruktorban vagy inicializáló blokkban is meg lehet adni.
Metódusok
egy metódus definiálásakor mire kell figyelni?
Minden metódus/ függvény – Definiáláskor meg kell adni a visszaadott érték típusát – Visszaadott érték hiányában – ekkor eljárásról beszélünk – a definícióban a void kulcsszót kell megadni
Mire kell figyelni ha egy metódusnak adtunk visszatérési értéket?
Ha van visszaadott érték, akkor kötelezően kell paraméteres return utasításnak is szerepelnie a metódusban (több is szerepelhet), és a vezérlésnek mindenképpen el kell érnie
Eljárásnál miért nem szükséges a return?
Eljárásnál nem szükséges kiírni a return utasítást, a fordító automatikusan elhelyez egyet a metódus utolsó végrehajtott utasítása és a blokkzáró zárójel közé
Mit lehet csinálni a metódusokkal ugyanazon a néven?
Ugyanazon a néven, de más paraméterezéssel (paraméterek típusa, darabszáma) lehet egyszerre több metódust is definiálni (metódusok túlterhelése)
Mi jellemző a private típusú metódusokra?
private minősítésű metódust más típusú objektumból kívülről nem lehet elérni, csak az adott, vagy azonos típusú objektumok metódusai tudnak hozzáférni, meghívni.
Hatáskör:
Mit tudsz a hatáskörről az osztályokkal kapcsolatban?
Minden osztály egy önálló osztály-hatáskört definiál. (Egységbezárás alapelve!) A meződeklarációk lokálisak az osztályhatáskörre nézve. A tagfüggvények egy hatáskörben vannak az adattagokkal => használhatják azokat!
Osztály használata:
hogyan zajlik egy osztály használata?
Az osztálynév típusnévként viselkedik, és minden eddig ismert deklarációs konstrukcióban használható. Objektum: az osztály egy előfordulása. Például: osztály típusú változó
Hogy lehet a tagra hivatkozni?
Hivatkozás a tagokra Analóg a struktúrák kezelésével. Tehát: objektumnév.mező vagy objektum_pointer->mező A mező lehet adattagra való hivatkozás (pontosan úgy, mint a struktúránál), tagfüggvény neve és aktuális paraméter-listája
Mik az osztály Hozzáférést szabályozó módosítói 1.?
public: a mező írható/olvasható bármelyik másik objektumpéldányból
Mik az osztály Hozzáférést szabályozó módosítói 2.?
private: a mező közvetlenül csak az adott osztályból, vagy csak metódusokon keresztül (get/set metódusok) érhető el
Mik az osztály Hozzáférést szabályozó módosítói 3.?
protected: a mező csak a leszármazott osztályokban látható, illetve az osztályt tartalmazó csomagban
Objektum létrehozása:
Mi a folyamata egy objektum létrehozásának?
: • helyfoglalás az adattagoknak • konstruktor automatikus meghívása.
írj egy példát az objektum létrehozására.
Person person(“Bob”);
Konstruktorok.
Mi a konstruktor neve?
Neve egyezik az őt tartalmazó osztály nevével.
Mi a konstruktor visszaadott értéke?
Nincs jelzett visszaadott értéke, még void sem
Mit nevezünk implicit konstruktornak?
A publikus, paraméter nélküli, üres törzsű konstruktort implicit konstruktornak nevezzük
MI történik ha nem írunk konstruktort az osztályba?
Ha nem írunk implicit konstruktort, és nincs paraméteres változat sem, akkor a fordító létrehoz egyet
Hányszor fut le a konstruktor?
A konstuktorok pontosan egyszer futnak le a használat során
Mi történik, ha több konstruktort definiálunk?
Ugyanazon a néven, de más paraméterezéssel (paraméterek típusa, darabszáma) lehet egyszerre több konstruktort is definiálni (konstruktorok túlterhelése) Ezek közül a példányosításkor az osztály neve után írt paraméterlistával tudunk választani.
Destruktor:
Mi a Destruktor?
neve ~osztálynév. Nem lehet visszatérési értéke (még void sem!) Nincs paraméterlistája, nem hívható meg közvetlenül, nem öröklődik. Automatikusan meghívódik egy objektum megszűnésekor. Erőforrásfelszabadítási logikát tartalmaz általában.
Mutass példát a konstruktor destruktorra.
include
class Pelda { public: Pelda() { std::cout << ( void* )this << ": Pelda()" << std::endl; } ~Pelda() { std::cout << ( void* )this << ": ~Pelda()" << std::endl; } };
int main() { Pelda tomb[ 3 ]; } Kimenete egy konkrét rendszeren egy futtatáskor (a kettőspont előtt az objektum virtuális címe olvasható):
0x7fffffffbeb0: Pelda()
0x7fffffffbeb1: Pelda()
0x7fffffffbeb2: Pelda()
0x7fffffffbeb2: ~Pelda()
0x7fffffffbeb1: ~Pelda()
0x7fffffffbeb0: ~Pelda()
A megszüntetés sorrendje a létrehozás sorrendjének a fordítottja, miért?
Mert képzeljük el, hogy létrehozunk két objektumot úgy hogy a másodikban hivatkozást helyezünk el az elsőre (például egy mutatóval mutatunk rá). Ha a megszüntetés sorrendje nem lenne fordított, akkor egy instabil állapoton haladna keresztül a program látókörből való kilépéskor.
Mi a this c++-ban?
A “this” egy kulcsszó, amely az osztály aktuális példányára utal.
Példával szemléltesd a this használatát.
Person(string inputName, int age){
this ->age = age;
name = inputName; }
Öröklés.
Mi az öröklés fogalma?
olyan alapvető programozási technika, amely lehetővé teszi, hogy a már meglévő osztályainkból újakat tudunk származtatni, valamint az egymással kapcsolatban álló osztályokat hierarchiába tudjuk rendezni.
mi az ősosztály?
Az az osztály, amiből kiindulunk, azaz melynek tulajdonságai tovább vannak örökítve.
mi a leszármazott osztály?
Az az osztály, amiben felhasználjuk az ősosztályt, azaz amely örökli a tulajdonságokat.
mutass Példát az öröklésre.
class Person { // Access specifier public: Person(string inputName, int age){ this ->age = age; name = inputName; } ~Person() { cout << "Object Deleted!"<< endl; } // Data Members string name; int age;
// Member Functions() void printname() { cout << "Geekname is: " << name << endl; }
void printAge() { cout << age << endl; } };
class Student : public Person {
public:
Student(string inputName, int age, string occupation): Person(inputName, age) {
cout<
Példányosítás.
Mi a példányosítás?
A példányosítás nem más, mint az osztály által meghatározott struktúrából és viselkedésből (változók, metódusok és operátorok) képzett objektum létrejötte.
Egy osztályból hány objektum képezhető?
Akárhány.
az objektumok viselkedését mi alakítja?
Ezek viselkedését az objektum mezők értéke és a függvényekben implementált logika alakítja.
Milyen objektum az osztály milye?
A példányosított objektum az osztály leképezése, megvalósítása.
Milyen objektum az osztály milye?
A példányosítás során mire van lehetőségünk? Ha ezt nem tesszük meg mi történik?
Példányosítás során lehetőségünk van a kezdőértékeket a konstruktor(ok) segítségével beállítani. Hanem választunk ki értékbeállításra való konstruktort, akkor az alapértelmezett konstruktor fog működésbe lépni.
Mutass példát a példányosításra.
Person person("Bob", 15); Student student("Joe", 16, "Student");
Meddig léteznek ezek a példányok?
Ezek a példányok a memóriába kerülnek és addig léteznek, amíg az adott hatókör létezik. Ha egy függvényben hozzuk létre, akkor a függvény lefutása után a destruktor felszabadítja az általuk foglalt memóriát. Mivel a main is egy függvény, így a main függvény lefutása után, azaz a program utolsó futtatott utasítása után is a destruktor lefut minden memóriában lévő objektumra.