[[oktatas:programozás:cpp|< CPP]] ====== CPP Objektum Orientált Programozás ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2011, 2014 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Struktúra ===== A C++ nyelvben a struktúrákban már az osztályok is meghatározhatók: #include using namespace std; struct Dolgozo { string nev; void beallitNev(string ujNev) { nev = ujNev; } string lekerNev() { return nev; } }; int main(int argc, char **argv) { Dolgozo mari; mari.beallitNev("Nagy Mária"); cout << mari.lekerNev() << endl; return 0; } Az egységbezárás így még magasabb szinten valósul meg. ===== A struktúra és az osztály ===== A struktúra és az osztály között a különbség, hogy az osztályban minden tag alapértelmezetten private elérésű, míg a struktúrában public. #include using namespace std; class Dolgozo { string nev; public: void beallitNev(string ujNev) { nev = ujNev; } string lekerNev() { return nev; } }; int main(int argc, char **argv) { Dolgozo mari; mari.beallitNev("Nagy Mária"); cout << mari.lekerNev() << endl; return 0; } ===== Függvény megvalósítása osztályban ===== A tagfüggvényeket ugyan megvalósíthatjuk osztályon belül, mint az alábbi példában látjuk, azonban az osztályokat külön fejlécfájlba szokás rakni. A fejlécfájlokban pedig nem szokás függvényeket megvalósítani. #include using namespace std; class Dolgozo { string nev; public: void allitNev(string nev) { this->nev = nev; } }; int main(int argc, char **argv) { Dolgozo mari; mari.allitNev("Mária"); return 0; } ===== Az osztály külön állományban ===== #include using namespace std; class Dolgozo { string nev; int kor; double fizetes; public: void beallitNev(string ujNev); string lekerNev(); Dolgozo(); ~Dolgozo(); }; #include "dolgozo.h" using namespace std; Dolgozo::Dolgozo () { nev = "Névtelen"; kor = 0; } Dolgozo::~Dolgozo () { //Destruktor } void Dolgozo::beallitNev(string ujNev) { nev = ujNev; } string Dolgozo::lekerNev() { return nev; } #include #include "dolgozo.h" using namespace std; int main(int argc, char **argv) { Dolgozo joska; std::cout << joska.lekerNev() << std::endl; joska.beallitNev("Nagy Lajos"); std::cout << joska.lekerNev() << std::endl; return 0; } TARGET = main CXX = g++ RM = rm CPPFLAGS = -Wall -g LDFLAGS = SRCS = main.cxx dolgozo.cxx HEADS = dolgozo.h OBJS = main.o dolgozo.o ${TARGET}: ${OBJS} ${CXX} ${LDFLAGS} -o ${TARGET} ${OBJS} ${OBJS}.o:${SRCS} ${HEADS} ${CXX} ${CPPFLAGS} -c ${SRCS} clean: ${RM} ${OBJS} ${TARGET} ===== Osztály létrehozása ===== #include using namespace std; class Dolgozo { string nev; int kor; double fizetes; public: void beallitNev(string ujNev); string lekerNev(); Dolgozo(); ~Dolgozo(); }; Dolgozo::Dolgozo () { nev = "Névtelen"; kor = 0; } Dolgozo::~Dolgozo () { //Destruktor } void Dolgozo::beallitNev(string ujNev) { nev = ujNev; } string Dolgozo::lekerNev() { return nev; } int main(int argc, char **argv) { Dolgozo joska; std::cout << joska.lekerNev() << std::endl; joska.beallitNev("Nagy Lajos"); std::cout << joska.lekerNev() << std::endl; return 0; } ===== Többalakú konstruktor ===== #include using namespace std; class Dolgozo { string nev; public: Dolgozo() { nev = "Névtelen"; } Dolgozo(string ujNev) { nev = ujNev; } string lekerNev() { return nev; } }; int main(int argc, char **argv) { Dolgozo mari("Nagy Mária");; cout << mari.lekerNev() << endl; return 0; } ===== Destruktor ===== A destruktorban törölhetjük a dinamikusan létrehozott (mutató) tagokat: #include using namespace std; class Dolgozo { public: double *fizetes; Dolgozo() { fizetes = new double; } ~Dolgozo() { delete fizetes; cout << "A destruktor lefutott" << endl; } }; int main(int argc, char **argv) { Dolgozo janos; *janos.fizetes = 820000; cout << *janos.fizetes << endl; return 0; } ===== Öröklés ===== class Szemely { protected: string nev; string szuletes; }; class Dolgozo : Szemely { double fizetes; public: void beallitNev(string ujNev); string lekerNev(); Dolgozo(); ~Dolgozo(); }; ===== Többszörös öröklés ===== #include class A { int a; }; class B { int b; }; class C : public A, public B { }; int main(int argc, char **argv) { C o; o.a = 3; o.b = 5; std::cout << o.a << std::endl; std::cout << o.b << std::endl; return 0; } ===== Dinamikus adattagokat tartalmazó osztály ===== #include using namespace std; class Dolgozo { string nev; public: Dolgozo() { nev = "Névtelen"; } Dolgozo(string ujNev) { nev = ujNev; } string lekerNev() { return nev; } }; int main(int argc, char **argv) { Dolgozo* peti = new Dolgozo("Kék Péter"); cout << peti->lekerNev() << endl; return 0; }