C++ reference
Főnév
C++ reference (tsz. C++ references)
- (informatika) A referencia a C++ nyelvben egy másik változó alternatív neve. Nem másolat, hanem egy alias (álnév), ami mindig ugyanarra a memóriacímre mutat, mint az eredeti változó.
int a = 10;
int& ref = a; // ref és a ugyanazt a memóriacímet használja
A ref változó ezután teljes értékű helyettesítője a-nak – minden módosítás a-ra is hatással lesz.
⚙️ Referencia szintaxis
type& name = original;
type: a típus, amelyhez tartozik&: referenciajelname: a referencia neveoriginal: a hivatkozott objektum
✅ Referencia tulajdonságai
| Tulajdonság | Leírás |
|---|---|
Nem lehet null |
Minden referencia kell hogy mutasson valamire |
| Nem változtatható | Referencia mindig ugyanarra az objektumra mutat |
| Inicializálás kötelező | int& x; hiba, ha nincs azonnali hozzárendelés |
| Módosíthat | Ha az objektum nem const, akkor módosítható rajta keresztül |
🔄 Példa: érték szerint vs referencia szerint
void valtoztat(int x) {
x = 99; // csak másolatot módosít
}
void valtoztatRef(int& x) {
x = 99; // az eredeti változót módosítja
}
int main() {
int a = 42;
valtoztat(a); // a == 42
valtoztatRef(a); // a == 99
}
🧪 const referencia
A const kulcsszóval létrehozhatunk olyan referenciát, amely nem módosíthatja a hivatkozott objektumot.
void kiir(const std::string& szoveg) {
std::cout << szoveg << std::endl;
}
Előnyök:
- Nem jön létre másolat → hatékony
- Megakadályozza a véletlen módosítást
🧠 Miért hasznos a referencia?
- Hatékony függvényparaméter-átadás
- Objektumokon belül könnyű hivatkozás
- Operátor túlterhelésnél elengedhetetlen
- Kód olvashatóságának javítása
🛠️ Hivatkozás visszatérési értékként
int& get(int tomb[], int index) {
return tomb[index]; // referenciát ad vissza!
}
int main() {
int x[3] = {1, 2, 3};
get(x, 1) = 99; // x[1] = 99
}
Figyelem! Soha ne térj vissza olyan referenciával, ami lokális változóra mutat – az megszűnik a függvény után:
int& hibas() {
int x = 5;
return x; // HIBA: referencia a már nem létező x-re
}
🧬 Referencia tömbök, tömb referenciák
Tömb referencia:
int tomb[3] = {1,2,3};
int (&ref)[3] = tomb;
ref[1] = 99;
Tömb elemei:
int* ptr = tomb; // pointer
int& r = tomb[0]; // referencia az első elemre
🧮 Referencia typedef és auto
typedef int& IntRef;
IntRef x = a;
auto& y = x; // típus dedukció referenciával
🧲 Láncolt referencia
int a = 10;
int& r1 = a;
int& r2 = r1;
r2 = 5; // a is megváltozik → a == 5
A referencia „láncban” is ugyanarra a memóriára mutat.
🔄 Referencia paraméter sablonban
template<typename T>
void csere(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
A referencia segítségével a csere() bármilyen típusra alkalmazható, másolás nélkül.
🛑 Hibák, amiket kerülni kell
1. Inicializálatlan referencia
int& x; // HIBA!
2. Visszatérés lokális változóra
int& hibas() {
int x = 10;
return x; // HIBA!
}
3. Referencia literálra (csak const-ként működik)
int& r = 5; // HIBA
const int& r = 5; // OK
📦 Különbség: referencia vs pointer
| Jellemző | Referencia | Pointer |
|---|---|---|
| Szintaxis | int& r |
int* p |
| Null érték | Nem lehet | Lehet nullptr |
| Módosítható hivatkozás? | Nem | Igen |
| Dereferálás szükséges? | Nem | Igen (*p) |
| Inicializálás kötelező? | Igen | Nem |
👷♂️ Modern C++: Rvalue referencia (C++11)
void f(int&& r) { } // csak ideiglenes értékeket fogad
f(10); // OK
int a = 5;
f(a); // HIBA: a lvalue
Ez az ún. move semantics és perfect forwarding alapja.
🧭 Összegzés
| Fogalom | Részletek |
|---|---|
| Célja | Másik változó aliasa |
| Fő előnye | Hatékony, nem másol, biztonságosabb a pointernél |
| Inicializálás | Kötelező és végleges |
| Használat | Függvényparaméter, visszatérés, operátorok, sablonok |
const |
Olvasásra szánt referencia |
| Veszélyek | Lokális referenciavisszatérés, literálra való hivatkozás |
| Modern kiterjesztés | C++11-től: rvalue reference (&&) |
🔚 Zárógondolat
A referencia a C++ nyelv egyik legfontosabb fogalma, amely mélyen beágyazódott a függvényhívások, az osztálystruktúrák, a sablonok és a memóriakezelés működésébe. Bár egyszerűnek tűnik, nagy körültekintést igényel – főleg a const és a rvalue referencia esetén.
- C++ reference - Szótár.net (en-hu)
- C++ reference - Sztaki (en-hu)
- C++ reference - Merriam–Webster
- C++ reference - Cambridge
- C++ reference - WordNet
- C++ reference - Яндекс (en-ru)
- C++ reference - Google (en-hu)
- C++ reference - Wikidata
- C++ reference - Wikipédia (angol)