Ugrás a tartalomhoz

name binding

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


Főnév

name binding (tsz. name bindings)

  1. (informatika) A name binding (névkötés) a C++ programozásban azt jelenti, hogy egy változót, függvényt vagy egyéb azonosítót összekapcsolunk egy adott memóriacímmel vagy értékkel. A névkötés határozza meg, hogy egy adott azonosító mikor és hol kapja meg a jelentését a programban.



1. Statikus és dinamikus névkötés

A C++ egy statikusan típusos nyelv, ami azt jelenti, hogy a legtöbb névkötés fordítási időben (compile-time) történik. Ugyanakkor léteznek olyan helyzetek is, amikor a névkötés futási időben (run-time) zajlik.

Típus Leírás Példa
Statikus névkötés Fordítási időben történik, a kód szerkezetéből egyértelmű, melyik azonosítóra hivatkozunk. Lokális változók, normál függvényhívások
Dinamikus névkötés Futási időben dől el, hogy egy azonosító pontosan milyen objektumra hivatkozik. Virtuális függvények, polimorfizmus



2. Statikus névkötés (Compile-time Binding)

A statikus névkötés azt jelenti, hogy az azonosítóhoz való kötés fordítási időben megtörténik.

Példa statikus névkötésre:

#include <iostream>
using namespace std;

void hello() {
    cout << "Hello, statikus névkötés!" << endl;
}

int main() {
    hello(); // A fordító tudja, hogy a hello() függvény melyik kódra hivatkozik
    return 0;
}

Fordítási időben eldől, hogy a hello() függvény az hello() definíciójára hivatkozik.



Statikus névkötés változóknál

A legtöbb változó statikus névkötéssel rendelkezik, mivel a fordító pontosan tudja, hogy egy adott név milyen memóriaterületre mutat.

int main() {
    int x = 10; // 'x' azonosító a fordítási időben egyértelműen kötődik egy memóriacímhez
    cout << x << endl;
    return 0;
}

A x változóhoz tartozó névkötés már fordításkor eldől.



3. Dinamikus névkötés (Run-time Binding)

A dinamikus névkötés esetén futási időben dől el, hogy egy adott azonosító melyik objektumot jelenti. Ez leggyakrabban öröklődés és virtuális függvények esetén fordul elő.

Példa dinamikus névkötésre (polimorfizmus és virtuális függvények):

#include <iostream>
using namespace std;

class Alaposztaly {
public:
    virtual void print() { // Virtuális függvény (dinamikus névkötés)
        cout << "Alaposztaly print()" << endl;
    }
};

class Leszarmazott : public Alaposztaly {
public:
    void print() override {
        cout << "Leszarmazott print()" << endl;
    }
};

int main() {
    Alaposztaly* obj = new Leszarmazott(); // Az obj pointer egy leszármazott objektumra mutat
    obj->print(); // Dinamikus névkötés miatt a Leszarmazott osztály függvénye hívódik meg
    delete obj;
    return 0;
}

Mi történik itt?

  1. Az obj egy Alaposztaly* típusú pointer, de egy Leszarmazott objektumra mutat.
  2. Mivel a print() virtuális függvény, a futási időben történő névkötés biztosítja, hogy a helyes verzió (Leszarmazott::print()) hívódjon meg.

Kimenet:

Leszarmazott print()

✅ A névkötés futási időben történik, mert a függvény virtuális.



4. Késleltetett névkötés (Late Binding) vs. Korai névkötés (Early Binding)

Típus Időpont Használat
Korai névkötés (Early Binding) Fordítási időben Normál függvények, statikus változók
Késleltetett névkötés (Late Binding) Futási időben Virtuális függvények, polimorfizmus

🔹 C++ alapértelmezés szerint statikusan köt (early binding).
🔹 A késleltetett névkötés csak akkor történik, ha a függvény virtuális (virtual).



5. Példa névkötési problémára: Árnyékolás (Name Shadowing)

Ha egy lokális változó ugyanazzal a névvel rendelkezik, mint egy globális vagy tagváltozó, akkor árnyékolás (shadowing) lép fel.

Árnyékolás egy osztályban:

#include <iostream>
using namespace std;

class Pelda {
    int x;
public:
    Pelda(int x) { // A konstruktor paramétere árnyékolja az osztályváltozót
        this->x = x; // 'this' használatával különböztetjük meg
    }
    void print() {
        cout << "x = " << x << endl;
    }
};

int main() {
    Pelda obj(5);
    obj.print(); // Kimenet: x = 5
    return 0;
}

🔹 A this->x = x; használata biztosítja, hogy a tagváltozó (this->x) ne legyen árnyékolva a paraméter által.



6. Összegzés

🔹 A névkötés (name binding) meghatározza, hogy egy azonosító melyik memóriahelyre vagy függvényre vonatkozik.
🔹 Statikus névkötés (early binding) – Fordítási időben történik (normál függvények, lokális változók).
🔹 Dinamikus névkötés (late binding) – Futási időben dől el (virtuális függvények, polimorfizmus).
🔹 Árnyékolás (shadowing) – Ha egy lokális változó elrejti egy magasabb szintű változót.
🔹 C++ alapértelmezés szerint statikus névkötést használ, kivéve virtuális függvények esetén.