reference
Főnév
reference (tsz. references)
A referencia (reference) a C++ egyik fontos fogalma, amely lehetővé teszi, hogy egy változóra egy másik névvel hivatkozzunk anélkül, hogy új példányt hoznánk létre. Ez különösen hasznos memóriahatékonyság szempontjából, mivel elkerülhetjük az objektumok felesleges másolását.
Mi az a referencia?
A referencia egy másik változóra mutató alternatív név. Ha egy referenciát egy változóhoz kötünk, azután a referencia és az eredeti változó ugyanazt az adatot jelenti, bármelyik néven is érjük el.
Referencia létrehozása
A referenciákat az &
(és jelkent ismert ampersand) operátorral deklarálhatjuk:
int a = 10;
int& ref = a; // ref mostantól egy referencia 'a'-ra
Ebben a példában: - ref
nem egy új változó, hanem egy másik név az a
változóra. - Ha ref
értékét megváltoztatjuk, akkor a
értéke is módosul, mivel ugyanarra a memóriaterületre mutatnak.
Referencia használata példákon keresztül
Egyszerű példa referencia használatára
#include <iostream>
using namespace std;
int main() {
int szam = 42;
int& ref = szam; // referencia létrehozása
cout << "szam: " << szam << ", ref: " << ref << endl;
ref = 100; // módosítjuk a referencia értékét
cout << "szam módosítva: " << szam << endl; // 'szam' is megváltozik!
return 0;
}
Kimenet:
szam: 42, ref: 42 szam módosítva: 100
A ref
és szam
ugyanarra a memóriaterületre mutat, így bármelyik változó módosítása a másikra is hatással lesz.
Referencia függvényparaméterként
A referenciák nagyon gyakran használtak függvényparaméterként, mert lehetővé teszik az adatok átadását másolás nélkül.
Referencia átadása függvénynek
Ha egy változót referenciaként adunk át egy függvénynek, akkor az a függvényen belül is módosítható lesz, anélkül, hogy másolat készülne róla.
void novel(int& x) {
x += 10; // Az x változó módosul, mivel referenciaként kaptuk meg
}
int main() {
int ertek = 5;
novel(ertek);
cout << "ertek: " << ertek << endl; // 15 lesz az értéke
return 0;
}
Itt a novel
függvény közvetlenül módosítja az ertek
változót.
Ha nem referenciát használnánk, hanem érték szerinti paraméterátadást:
void novel(int x) { // NEM referencia
x += 10;
}
Ebben az esetben a novel(ertek);
meghívása nem változtatná meg az ertek
értékét, mert az x
csak egy másolat lenne.
Const referencia
Ha nem akarjuk, hogy a függvény módosítsa a bemeneti paramétert, használhatunk konstans referenciát (const &
).
void kiir(const int& x) {
cout << "Érték: " << x << endl;
}
int main() {
int szam = 20;
kiir(szam);
return 0;
}
Itt a const int& x
azt biztosítja, hogy x
értéke ne legyen módosítható a függvényen belül. Ez különösen akkor hasznos, ha nagy objektumokat szeretnénk átadni a függvényeknek anélkül, hogy lemásolnánk őket.
Mikor érdemes konstans referenciát használni?
- Ha egy nagy objektumot akarunk átadni egy függvénynek másolás nélkül.
- Ha biztosak akarunk lenni abban, hogy a függvény nem módosítja az eredeti adatot.
Referencia visszatérési értékként
A függvények referenciát is visszaadhatnak, amely lehetővé teszi az eredeti változó módosítását.
int& visszaadReferencia(int& x) {
return x;
}
int main() {
int szam = 50;
int& ref = visszaadReferencia(szam);
ref += 10;
cout << "szam: " << szam << endl; // 60 lesz az értéke
return 0;
}
Ebben az esetben a visszaadReferencia
függvény egy referencia visszatéréseként adja vissza az x
változót.
Fontos szabály!
Nem szabad olyan függvényből referenciát visszaadni, amely egy lokális változóra hivatkozik:
int& rosszFuggveny() {
int szam = 100;
return szam; // HIBA! Lokális változóra mutató referencia visszaadása
}
Ez nem működik, mert a szam
változó megsemmisül, amikor a függvény befejeződik.
Referencia mint osztály adattagja
Referenciát osztályokon belül is használhatunk adattagként:
class Auto {
private:
int& sebesseg;
public:
Auto(int& seb) : sebesseg(seb) {}
void gyorsit() { sebesseg += 10; }
};
int main() {
int seb = 60;
Auto a(seb);
a.gyorsit();
cout << "Sebesség: " << seb << endl; // 70 lesz
return 0;
}
Itt az Auto
osztály egy referenciát tárol a seb
változóra, így bármilyen módosítás visszahat az eredeti változóra is.
Fontos: Az osztály adattagjaként lévő referenciát kötelező inicializálni a konstruktornál.
Összegzés
- A referencia egy másik név egy változóra.
- Hatékonyabb, mint másolatokat készíteni, mivel nem foglal új memóriát.
- Függvényparaméterként használva lehetővé teszi az értékek módosítását a függvényen belül.
- A
const
referencia biztosítja, hogy a függvény nem módosíthatja a paramétert. - Vigyázni kell a függvényből visszaadott referenciákkal, hogy ne mutassanak megsemmisült memóriaterületekre.