name binding
Főnév
name binding (tsz. name bindings)
- (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?
- Az
objegyAlaposztaly*típusú pointer, de egyLeszarmazottobjektumra mutat. - 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.
- name binding - Szótár.net (en-hu)
- name binding - Sztaki (en-hu)
- name binding - Merriam–Webster
- name binding - Cambridge
- name binding - WordNet
- name binding - Яндекс (en-ru)
- name binding - Google (en-hu)
- name binding - Wikidata
- name binding - Wikipédia (angol)