Ugrás a tartalomhoz

C++ reference

A Wikiszótárból, a nyitott szótárból


Főnév

C++ reference (tsz. C++ references)

  1. (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
  • &: referenciajel
  • name: a referencia neve
  • original: 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.