Egységbezárás, adatelrejtés, konstruktorok, destruktorok. OOP + névterek, láthatóság, hatókör, túlterhelés Flashcards

1
Q

Egységbezárás

mit jelent az egységbezárás?

A

Az adatok és az azokat kezelő függvények összekapcsolása. Tehát a procedurális programozással szemben nem mindenfele vannak deklarálva a függvények és változók, hanem osztályokban.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Adatelrejtés

Ezáltal milyen elvet alkalmazunk?

A

Azzal, hogy az egymáshoz tartozó függvényeket és változókat egy fedél alá helyezzük, társulhat (és minden esetben társul is) az adatelrejtés elve.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

mi az az adatelrejtés elvének a lényege?

A

Az adatok elrejtése az objektumorientált programozás egyik leglényegesebb és legfontosabb jellemzője a C++-ban. Az adatelrejtés arra utal, hogy az adatokról csak a lényeges információkat adjuk meg a külvilág számára, elrejtve a háttérben lévő részleteket vagy a megvalósítást.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Láthatóság

Mi a private?

A

Az osztály privatenak nyilvánított tagjai csak az osztályon belüli tagfüggvények által érhetők el. Az osztályon kívüli objektumok vagy függvények nem érhetik el őket közvetlenül.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Mi a public?

A

“Public” : A public specifikátor alatt deklarált összes osztálytag mindenki számára elérhető lesz. A “public”-ként deklarált adattagokat és tagfüggvényeket más osztályok és függvények is elérhetik. Egy osztály publifc tagjai a program bármely pontjáról elérhetők a közvetlen tagelérési operátor (.) használatával az adott osztály objektumával.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Mi a protected?

A

A protected hozzáférés módosító hasonló a private hozzáférés módosítóhoz abban az értelemben, hogy az osztályon kívül nem lehet hozzáférni, a különbség az, hogy a protectedként deklarált osztálytagokhoz az adott osztály bármely alosztálya (származtatott osztály) is hozzáférhet.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

példa.

Mutass példát az összes előzőre. Class deklaráció. Animal

A

include

using namespace std;

// Ősosztály
class Animal {
// Privát változók, kívülről nem érhetők el
 private:
     string name;
     int age;
     int legs;
// Protected csak az ősosztály számára érhető el
 protected:
    string breed;
    //Getterek, setterek konstruktor public, hogy lehessen használni a class-t.
 public:
     Animal(string name, int age, int legs, string breed) {
     this->name = name;
     this->age = age;
     this->legs = legs;
     this->breed = breed;
     }
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

példa. Getterek és setterek.

A
string getName() {
        return this->name;
    }
    void setName(string name) {
        this->name = name;
    }
    int getAge() {
         return this->age;
    }
    void setAge(int age) {
        this->age = age;
    }
    int getLegs() {
    return this->legs;
    }
    void setLegs(int legs) {
        this->legs = legs;
    }
    string getBreed(){
    return this-> breed;
    }
    void setBreed(string breed) {
    this-> breed = breed;
    }
};
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

példa. Örökölt osztály. Mammal

A
// Öröklünk az Animalból, tehát minden ami abban benne van, benne lesz ebben is.
class Mammal: public Animal {
// Private itt is csak ebben az osztályban érhető el.
private:
    string breathing;
// Public ugyanígy getter setter és a konstruktor
public:
   string getBreathing() {
    return this->breathing;
    }
    void setBreathing(string breathing) {
    this->breathing = breathing;
    }
    Mammal(string name, int age, int legs, string breed, string breathing): Animal(name, age, legs, breed) {
        this->breathing =breathing;
    }
};
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

példa. main fgv. Animal

A
int main()
{
    //Animal példány, konstruktorral értékadás
   Animal animal("Bob", 5, 4, "Cat");
   // A konstruktorral adott értékeket a getterekkel lekérjük, kiiratjuk
   cout << animal.getName()<< ", " << animal.getAge() << ", " << animal.getLegs()<< ", "<< animal.getBreed()<< endl;

// Setterekkel állítunk az értékeken, NEM lehet olyan hogy animal.name = “George”, mivel private a mező
//nem látjuk magát az Animal osztály name mezőjét, csak a gettert.
animal.setName(“George”);
animal.setAge(1);
animal.setLegs(2);
animal.setBreed(“Parrot”);

   // Kiiratjuk az új értékeket
    cout << animal.getName()<< ", " << animal.getAge() << ", " << animal.getLegs()
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

példa. mmain fgv. Mammal

A
// Mammal példány, eggyel több változóval
    Mammal mammal("Rufus", 3, 4, "Dog", "Lung");
    // Kiiratás
    cout << mammal.getName()<< ", " << mammal.getAge() << ", " << mammal.getLegs()
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Konstrukturok

Mi a konstruktor?

A

Egy konstruktor-függvény, mint ahogy a neve mutatja, felépít egy osztályt, vagyis inicializálhatja az új objektum alapértékeit.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

a konstruktor fgvek hogyan és mikor kerülnek meghívásra?

A

A konstruktor-függvények automatikusan meghívásra kerülnek, amikor példányosítunk egy osztályt (vagyis objektumot hozunk létre az osztály alapján).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

A konstruktor milyen fgv, milye nincs?

A

A konstruktor olyan függvény, melynek nincsen visszatérési típusa, tehát még a void kulcsszót sem kell kiírni a neve elé

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

minek kell egyeznie egy konstruktorban mivel?

A

A konstruktor függvény neve meg kell, hogy egyezzen az osztály nevével c++-ban.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Legalább mivel rendelkezik minden osztály?

A

Minden osztálynak legalább 1 konstruktora van.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Hogyan és mit lehet csinálni egy konstruktorral? Mire kell vigyázni?

A

Egy osztálynak lehet több konstruktora is (tehát túlterhelhető - overloading), csak arra kell vigyázni, hogy a paraméterezésük legyen különböző, vagyis nem lehet kétszer deklarálni ugyanazt a paramétertípust elfogadó konstruktort.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Névterek

Mi a névtér?

A

A névtér egy olyan ’régió’, ami a ’neveknek’ (a típusok, függvények változók neveinek) hatókört ad.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Mire szokás használni egy konstruktort?

A

Konstruktort általában kezdőérték-adásra szokás használni, illetve további inicializáló logikát szokás bele tenni.

20
Q

Örökléskor mi történik a Konstruktorral? Miért fontos a kezdőérték adás cpp-ben?

A

Öröklés esetén, ha egy gyerek osztályt példányosítunk, a szülő osztály konstruktora szintén le fog futni. A kezdőérték adás fontos c++-ban, mivel ha nem kapnak rendes kezdőértéket, akkor valami memóriaszemetet fognak kapni a változók alapértelmezetten.

21
Q

Mutass példát egy konstruktorra.

És írd le a példát.

A
class Person{
public:
    Person(string inputName, int age){
        this ->age = age;
    name = inputName;
    }
}
Ez egy kezdőérték adó konstruktor, tehát példányosításnál az osztály age és name mezője az bemenő paraméter értékét fogja kapni.
22
Q

Destruktor

mi a destruktor múködésének lényege?

A

A destruktor működésének lényege a konstruktorral ellentétes, azaz az objektum megszüntetésekor lép működésbe

23
Q

mi a destruktor fogalma?

A

A destruktor egy olyan példánytagfüggvény, amely automatikusan meghívásra kerül, amikor egy objektum megsemmisül.

24
Q

Miben különbözik a destruktor a konstruktortól?

A

hogy egy tilde ~ kell a neve elé, hogy meg tudjuk különböztetni a konstruktortól.

25
Q

Milyen logikát tartalmaznak a destruktorok?

A

Ezek általában memóriát felszabadító logikát, fájl lezárásokkal kapcsolatos logikát tartalmaznak.

26
Q

milye nem lehet egy destruktornak?

A

Destruktornak nem lehet bemenő paramétere és visszatérési típusa sem.

27
Q

Mikor kell írnunk egy felhasználó által definiált destruktort?

A

Az alapértelmezett destruktor jól működik, kivéve, ha dinamikusan allokált memóriát vagy mutatót használunk az osztályban. Ha egy osztály tartalmaz egy mutatót az osztályban allokált memóriára, akkor írnunk kell egy destruktort, hogy felszabadítsuk a memóriát, mielőtt az osztálypéldány megsemmisül. Ezt a memóriaszivárgás elkerülése végett kell megtenni.

28
Q

Lehet egynél több destruktor egy osztályban?

A

Nem, egy osztályban csak egy destruktor lehet.

29
Q

Mi történik ha egy destruktort sem definiálunk?

A

Amennyiben nem állítunk be egyet sem, a C++ létrehoz egyet.

30
Q

Mutass példát a destruktrra.

A

~Person() {
cout &laquo_space;“Object Terminated!”&laquo_space;endl;
}

31
Q

Mi a névtér?

A

A névtér egy olyan ’régió’, ami a ’neveknek’ (a típusok, függvények változók neveinek) hatókört ad.

32
Q

mit tesz lehetővé a névtér?

A

Névterekkel a kódot logikai csoportokba lehet rendezni és ezáltal az esetleges névegyezések nem okoznak problémát akkor, ha mondjuk több library-t használunk.

33
Q

Mi látható egy névtéren belül? Hogyan érhetjük el a tagjait többek között?

A

A névtér hatókörében minden azonosító minősítés nélkül látható a másik számára. Úgy is elérhetjük a tagjait, hogy a névtér teljes nevére hivatkozunk és mögötte egy scope resolution (::) operátor segítségével.

34
Q

Mutass példát a teljes névvel való hivatkozásra:

A

include

int main()
{
    std::cout << "Hello world!" << std::endl;
    return 0;
}
35
Q

Hivatkozás a using direktívával egy namespace egy konkrét nevére.

A

Ilyenkor a program elején meg tudjuk hivatkozni egy névtér tetszőleges nevét. Ezáltal nem kell mindig eléírni a namespace nevét, ha használni akarjuk.

36
Q

Hivatkozás a using direktívával egy namespace egy konkrét nevére.
Példa

A

include

using std::cout;

int main()
{
    cout << "Hello world!" << std::endl;
    return 0;
}
37
Q

Össszes név hivatkozása egy namespacen belül.

Miért nem jó módszer ez?

A

Hivatkozhatunk az összes névre (tagra) egy namespacen belül is akár, bár ez nem ajánlott módszer. Azért nem ajánlott ezt a módszert használni, mert Képzeljük el, hogy includeolunk egy header fájlt és a standard namespacet is és a header fájlban is van egy cout függvény. Így ugyanannak a típusnak két definíciója is létezne az aktuális névtérben. Ez a C++-ban nem megengedett, és még ha a program le is fordítja, nem lehet tudni, hogy melyik definíciót hol használja.

38
Q

Példa az összes név hivatkozására egy namespaceből.

A

include

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
39
Q

Láthatóság (osztályszintű)

Mi a public?

A

A public specifikátor alatt deklarált összes osztálytag mindenki számára elérhető lesz. A publicként deklarált adattagok és tagfüggvények más osztályok és függvények számára is elérhetők. Egy osztály nyilvános tagjai a program bármely pontjáról elérhetők a közvetlen tagelérési operátor (.) használatával az adott osztály objektumával.

40
Q

mi a private?

A

A private-ként deklarált osztálytagokat csak az osztályon belüli tagfüggvények érhetik el. Az osztályon kívüli objektumok vagy függvények nem érhetik el őket közvetlenül. Csak a tagfüggvények érhetik el az osztály private tagjait.

41
Q

mi a protected?

A

A Protected hozzáférés módosító hasonló a private hozzáférés módosítóhoz abban az értelemben, hogy nem lehet hozzáférni az osztályon kívül, a különbség az, hogy a Protectedként deklarált osztálytagokhoz az osztály bármely alosztálya (származtatott osztály) is hozzáférhet.

42
Q

Hatókör:

Mit jelent a hatókör?

A

A hatókör lényegében egy határt definiál, amin belül a változókat használni/elérni tudjuk.

43
Q

Mi az a lokális hatókör?

A

Az első típus a lokális változók kategóriája. Ezek azok a változók, amik egy kódblock-on belül lettek deklarálva. Magyarul egy {} zárójelpáron belül. A lokális változók nem elérhetők ezeken a blockokon kívül, mivel nem léteznek a saját blockjukon kívül. De például egy a main függvényben deklarált függvényt vagy változót a main függvényben deklarált egy másik függvény látja és eléri. Osztályoknál ugyanúgy működik ez.

44
Q

mi az a globális hatókör?

A

A második típus a globális változók, amiknek lényege, hogy a programon belül bárhol elérhetők. A program ’tetején’ szokás deklarálni ezeket, függvényeken (tehát a mainen is) kívül. Ezek a változók a program futása alatt végig elérhetők, tehát életciklusuk a program végéig tart. Felmerülhet ugyanakkor, hogy mi van akkor, ha két ugyanolyan nevű változó van a programban, az egyik globális a másik egy lokális és egyszerre kellene használni a kettőt. Ha így, különböző hatókörben vannak, akkor a program nem fog fordításidejű hibát dobni. Ebben az esetben a precedencia a lokális változóé, tehát a program azzal fog dolgozni az adott függvény esetében.

45
Q

Függvények túlterhelése.

Miért lehet egy fgvt túlterheln? Hogyan zajlik ez a folyAMAT?

A

Egy függvénynek 0 vagy több bemenő paramétere lehet. Ha több azonos nevű, de különböző paraméterű függvény van, akkor ezeket a függvényeket túlterheltnek nevezzük. A függvényeket az argumentumok számának és/vagy típusának megváltoztatásával lehet túlterhelni.

46
Q

mutass példát a függvény túlterhelésre.

A

include

using namespace std;
class Geeks
{
public:

    // function with 1 int parameter
    void func(int x)
    {
        cout << "value of x is " << x << endl;
    }
    // function with same name but 1 double parameter
    void func(double x)
    {
        cout << "value of x is " << x << endl;
    }
    // function with same name and 2 int parameters
    void func(int x, int y)
    {
        cout << "value of x and y is " << x << ", " << y << endl;
    }
};

int main() {

Geeks obj1;
    // Which function is called will depend on the parameters passed
    // The first 'func' is called 
    obj1.func(7);
    // The second 'func' is called
    obj1.func(9.132);
    // The third 'func' is called
    obj1.func(85,64);
    return 0;
}
47
Q

operátor túlerhelés.

mi az operátor túlterhelés?

A

A C++ lehetőséget biztosít az operátorok túlterhelésére is. Például, a string osztályban az operátort (‘+’) két karakterlánc összekapcsolására használhatjuk. Tudjuk, hogy ez az összeadási operátor, amelynek feladata két operandus összeadása. Tehát egyetlen ‘+’ operátor, ha egész szám operandusok közé helyezzük, összeadja őket, ha pedig string operandusok közé helyezzük, összekapcsolja őket.