UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 4. Gyakorlat Függvény paraméterek, dinamikus tömbök, névterek
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Paraméter átadás Paramétereket három féle módon adhatunk át függvényeknek: Érték szerint (C…) Változó (vagy objektum) címének átadásával (C…) Referencia alapján (C++, Java…)
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Érték szerinti paraméter átadás A változó vagy objektum értéke lemásolódik a verembe a függvény hívásakor. A függvény belsejében nem az eredeti változóval vagy objektummal dolgozunk. A függvény végén ezek a változók vagy objektumok felszabadulnak.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Érték szerinti paraméter átadás példa void function( int a ) { a++; } int main( int argc, char** argv ) { int a = 5; function( a ); std::cout << a << std::endl; }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Pointer (cím) átadása A változó vagy objektum nem másolódik le. A függvény belsejében az eredeti változóval vagy objektummal dolgozunk. A függvény végén nem szabadulnak fel. Gyakorlatilag egy pointert állítunk a változóra és a pointeren keresztül érjük azt el.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Pointer (cím) átadása példa void function( int* a ) { (*a)++; } int main( int argc, char** argv ) { int a = 5; function( &a ); std::cout << a << std::endl; }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Referencia A pointerek nehézkes használata miatt a C++-ban bevezették a referencia típust. Nagyon hasonló a pointerhez, de referenciánál nem kell képezni a változó címét, közvetlen a változóra mutat rá. Nem kell gondolkodni, hogy most a pointer címét akarjuk vagy a pointer által mutatott változót,stb… Megszorítás: referenciát a létrehozáskor inicializálni kell! Nem lehet belőle tömböt képezni! Referencia képzése (&): int a = 5; int& b = a;
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Referencia Nagyon hasonló, mint a cím szerinti paraméter átadás. A C++ nem tesz különbséget referencia és pointer paraméter között, ezért nem tehető meg, hogy ugyanolyan névvel létrehozunk kettő függvényt, úgy, hogy az egyik paramétere egy pointer a másiké egy referencia.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Referencia példa void ref_function( int& a ) { a++; } int main( int argc, char** argv ) { int a = 5; function( a ); std::cout << a << std::endl; }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Dinamikus tömbök Dinamikus tömböknek memóriát new-val kell lefoglalni. int* array = new int[ size ]; Saját osztálynál: OneParameter* object = new OneParameter[size]; Azonban ez csak olyan osztályoknál működik, ahol van default konstruktor.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Delete[ ] Tömböket a delete[] operátorral töröljük. delete[] array; delete[] object;
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Névterek - namespace Egy függvény vagy osztály írásakor könnyen előfordulhat, hogy az általunk választott név ütközik egy meglévővel. A névterek felhasználásával a különböző definíciók névhierarchiába szervezhetőek. Így akár logikai csoportosítás is elérhető. Névterekkel tetszőleges mélységű névtér hierarchia alakítható ki. Megkezdett névtér folytatható, akár külön másik forrás file-ban. Azonos névtérben nem lehet két egyforma definíció (osztály, függvény, változó).
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Névterek - namespace Névtér létrehozása: namespace Math { class Multiple{}; } namespace House { class Door{}; class Wall{}; }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Névterek elérése Névterek elérési útja programozható. Névtér feloldó operátor (scope operátor) :: Példa: std::cout Teljes elérési útvonalat meg kell adni, ha az elérni kívánt tag több névtérbe van ágyazva: House::Room::Bed bed;
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Névterek elérése Ahhoz, hogy minden hivatkozáskor ne kelljen megadni a teljes elérési útvonalat, „használni” kell a névteret: using namespace Math; Multiple mult; using namespace House::Room; Bed beg; using namespace std;