call by value

Üdvözlöm, Ön a call by value szó jelentését keresi. A DICTIOUS-ban nem csak a call by value szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a call by value szót egyes és többes számban mondani. Minden, amit a call by value szóról tudni kell, itt található. A call by value szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Acall by value és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

call by value (tsz. call by values)

  1. (informatika) A call by value (magyarul: érték szerinti paraméterátadás) egy fontos fogalom a programozásban, amely arra vonatkozik, hogy hogyan adunk át változókat függvényeknek. Azt határozza meg, hogy amikor egy függvényt hívunk meg, a paraméterként átadott adatok hogyan viselkednek: vajon a függvény képes-e az eredeti változót módosítani, vagy csak egy másolatával dolgozik.

A call by value esetén a függvény paraméterei másolatot kapnak az átadott értékből. Vagyis a függvény belsejében végzett módosítások nem hatnak vissza az eredeti változóra a függvényen kívül.

Ez a paraméterátadási mechanizmus sok programozási nyelvben az alapértelmezett (pl. C, Java primitív típusoknál, C++, Python speciális módon). Nézzük meg részletesen.



Hogyan működik?

Amikor egy függvényt hívsz meg, és paraméterként egy értéket adsz át, a következő történik:

  1. A függvény számára a paraméterhez lefoglalnak egy külön memóriaterületet.
  2. Ebbe a memóriaterületbe lemásolják az átadott értéket.
  3. A függvény ezen a másolaton dolgozik.
  4. Ha a függvény módosítja ezt a másolatot, az eredeti változó az eredeti helyén érintetlen marad.



Példa C nyelven

#include <stdio.h>

void modify(int x) {
    x = x + 10;
    printf("A függvényben x: %d\n", x);
}

int main() {
    int a = 5;
    printf("Hívás előtt a: %d\n", a);
    modify(a);
    printf("Hívás után a: %d\n", a);
    return 0;
}

Kimenet:

Hívás előtt a: 5
A függvényben x: 15
Hívás után a: 5

Látható, hogy bár a függvényben x értékét megnöveltük, az a változó a main függvényben nem változott. Miért? Mert a függvény csak a másolatán dolgozott (x).



Lépésről lépésre

1️⃣ Függvényhívás

Amikor meghívod a modify(a) függvényt, a main-ben lévő a értéke (5) lemásolódik az x paraméterbe.

2️⃣ Másolat létrejön

Az x változó egy teljesen különálló példány, nem ugyanaz a memóriahely, mint a.

3️⃣ Műveletek a másolaton

A x = x + 10; sor csak az x másolatát módosítja. a továbbra is 5 marad.

4️⃣ Függvény vége

Amikor a függvény lefutott, az x változó megszűnik (stack-ről lekerül), és az a változó a main-ben változatlan marad.



Grafikus ábrázolás

+---------+     +---------+
|  a (5)  | --> |   x (5) |
+---------+     +---------+

Függvény belül:
x = x + 10 -> x = 15

Függvény vége után:
+---------+  
|  a (5)  |  (változatlan)
+---------+  

Előnyök

  • Egyszerű: könnyen megérthető, nincs meglepetés, hogy mi változik.
  • Biztonságos: az eredeti adatokat nem lehet véletlenül megváltoztatni.
  • Könnyen párhuzamosítható: mivel nincs megosztott adat.



Hátrányok

  • Nagy adatszerkezeteknél (pl. tömbök, objektumok) a másolat készítése lassú és memóriapazarló lehet.
  • Ha azt akarod, hogy a függvény módosítsa az eredeti adatokat, akkor ez nem működik, más mechanizmust kell használni (pl. call by reference, vagy mutatók C-ben).



Mikor használjuk?

  • Ha azt akarjuk, hogy a függvény csak feldolgozza az adatokat, de ne változtassa meg azokat.
  • Ha az adatok kicsik (pl. int, float, char).
  • Ha fontos a biztonságos viselkedés.



Ellenpélda — Call by reference

Hogy lássuk a különbséget, nézzünk call by reference példát C++-ban:

#include <iostream>
using namespace std;

void modify(int &x) { // referencia
    x = x + 10;
    cout << "A függvényben x: " << x << endl;
}

int main() {
    int a = 5;
    cout << "Hívás előtt a: " << a << endl;
    modify(a);
    cout << "Hívás után a: " << a << endl;
    return 0;
}

Kimenet:

Hívás előtt a: 5
A függvényben x: 15
Hívás után a: 15

Itt a függvény már az eredeti a változót módosította, mert referenciát kapott, nem másolatot.



Call by value különböző nyelvekben

Nyelv Alapértelmezett paraméterátadás
C call by value
C++ call by value (de van referencia is)
Java primitívek: call by value, objektum referenciák: call by value of reference
Python call by object reference (speciális, de viselkedése call by value-hez hasonlít)
JavaScript call by value (de objektumok referenciái értékként másolódnak)



Gyakori félreértések

1️⃣ „De én módosítottam egy objektumot, mégis látszik kívül is!”

Ez például Java és Python esetén így tűnhet. Miért?

Mert az objektum referenciáját adjuk át értékként (call by value of reference). A referencia ugyan másolat, de ugyanarra az objektumra mutat, így az objektum belső állapotát lehet módosítani. Viszont ha a referenciát teljesen újra próbálnád mutatni, az nem hat ki az eredeti változóra.



Összefoglalás

  • A call by value esetén a függvény paraméterként másolatot kap az átadott értékből.
  • A függvényben történő módosítások nem hatnak vissza az eredeti változóra.
  • Sok nyelvben ez az alapértelmezett viselkedés.
  • Előnye, hogy biztonságos, hátránya, hogy nagy adatoknál lassú lehet.
  • Ha azt akarjuk, hogy a függvény módosítsa az eredeti változót, akkor call by reference-et vagy hasonló mechanizmust kell alkalmazni.