encapsulation (tsz. encapsulations)
Az enkapszuláció célja, hogy egy osztályon belül elrejtsük az adatok belső állapotát, és csak megfelelően definiált interfészeken (metódusokon) keresztül engedjük meg azok elérését vagy módosítását. Ez azt jelenti, hogy a privát változókat nem lehet közvetlenül kívülről módosítani, csak meghatározott függvények (getterek és setterek) használatával.
Az enkapszuláció előnyei:
C++-ban az enkapszulációt három hozzáférési szinttel valósítjuk meg:
#include <iostream>
using namespace std;
class Auto {
private:
string marka;
int sebesseg;
public:
// Konstruktor
Auto(string m, int s) {
marka = m;
sebesseg = s;
}
// Getter a márkához
string getMarka() {
return marka;
}
// Getter a sebességhez
int getSebesseg() {
return sebesseg;
}
// Setter a sebességhez
void setSebesseg(int ujSebesseg) {
if (ujSebesseg >= 0) {
sebesseg = ujSebesseg;
} else {
cout << "Hibás sebességérték!" << endl;
}
}
};
int main() {
Auto a("Ford", 120);
cout << "Autó márkája: " << a.getMarka() << endl;
cout << "Sebesség: " << a.getSebesseg() << " km/h" << endl;
// Módosítás setterrel
a.setSebesseg(140);
cout << "Új sebesség: " << a.getSebesseg() << " km/h" << endl;
return 0;
}
Autó márkája: Ford Sebesség: 120 km/h Új sebesség: 140 km/h
Ebben a példában az Auto osztály privát változókkal dolgozik, amelyeket csak a getter és setter metódusok segítségével érhetünk el.
A getterek és setterek az osztályon belüli adatokhoz való hozzáférést biztosítják.
A setter függvényekbe beépíthetünk adatellenőrzést, például megakadályozhatjuk a negatív értékeket egy sebességnél.
Az információ elrejtése (data hiding) az enkapszuláció egyik fontos aspektusa. Lényege, hogy az adatok közvetlen módosítása tiltott, így a program stabilabb és biztonságosabb lesz.
Példa egy helytelen megoldásra, ahol az osztály változói nyilvánosak:
class HibasAuto {
public:
string marka;
int sebesseg;
};
int main() {
HibasAuto a;
a.marka = "Toyota";
a.sebesseg = -100; // Hibás érték!
return 0;
}
Ebben az esetben a sebesseg
értéke lehet negatív, ami logikai hibát okozhat a programban.
Ha egy getter nem módosítja az osztály adatait, akkor const kulcsszóval jelezhetjük ezt:
string getMarka() const {
return marka;
}
Ha egy változó értékét kívülről nem akarjuk módosítani, akkor elhagyhatjuk a settert.
A friend kulcsszó lehetővé teszi, hogy egy külső függvény vagy másik osztály hozzáférjen a privát tagokhoz.
Példa:
class Bar {
private:
int x;
public:
Bar(int a) : x(a) {}
friend void mutasdAzX(const Bar& b);
};
void mutasdAzX(const Bar& b) {
cout << "Az x értéke: " << b.x << endl;
}
int main() {
Bar b(10);
mutasdAzX(b);
return 0;
}
Az enkapszuláció egy kulcsfontosságú OOP fogalom, amely biztosítja az adatok védelmét és a programok stabilitását. C++-ban privát változókat és publikus getter/setter függvényeket használunk az adatok biztonságos kezelésére. Az enkapszuláció segítségével könnyebben karbantartható és moduláris programokat készíthetünk.