Przesłanianie w programowaniu, to właściwość występująca w językach programowania, polegająca na tym, iż deklarowany i definiowany w pewnym bloku (np. podprogramie, instrukcja blokowej itp.) obiekt lokalny (np. stała, zmienna, podprogram itp.), o nazwie (identyfikatorze) identycznym z pewnym obiektem zewnętrznym (globalnym), staje się w tym bloku widoczny i wszystkie odwołania występujące w kodzie źródłowym realizowane za pomocą wybranej nazwy w obrębie tego bloku, są kierowane do obiektu lokalnego (element przesłaniający), natomiast obiekt zewnętrzny staje się w danym bloku niewidoczny, tzn. nie można się do niego odwołać wprost, za pomocą jego nazwy (element przesłaniany). Można się do obiektu globalnego odwołać jedynie za pomocą innych konstrukcji językowych, o ile są w danym języku programowania dostępne, takich jak wskaźniki, selekcje, przemianowania, nakładanie zmiennych, itp. Nowo zdefiniowany obiekt lokalny przesłaniający element zewnętrzny, może mieć całkowicie inne znaczenie i atrybuty – jest całkowicie nowym obiektem programu istniejącym niezależnie i w sposób niezwiązany z wcześniej utworzonym obiektem zewnętrznym. Charakterystyczną cechą elementów przesłaniających jest to, że ich czas istnienia jest krótszy niż elementu przesłanianego (pewnym wyjątkiem są elementy statyczne, np. zmienna statyczna).
Przykłady:
+ Przykłady przesłaniania zmiennych język C, C++ język Pascal język PL/I int a; /* zmienna globalna a */ void get_a() { int a; /* zmienna lokalna a */ scanf("Podaj a: %d",&a); } main() { a=1; get_a(); printf("a=%d",a); }var a:integer; { zmienna globalna a } procedure get_a; var a:integer; { zmienna lokalna a } begin write('Podaj a: '); readln(a) end; begin a:=1; get_a; write('a=',a) end.dcl a fixed(6,0); /* zmienna globalna a */ get_a: proc; dcl a fixed(6,0); /* zmienna lokalna a */ call put('Podaj a: '); call get(a); end proc; main: proc options(main); a=1; call get_a; call put('a='); call put(a); end proc;
W powyższych programach realizujących podobny przebieg, wypisany zostanie komunikat: a=1, bez względu na wartość wczytaną w podprogramie get_a, gdyż podprogram ten wczyta daną do zmiennej lokalnej, która przesłania w bloku tego podprogramu zmienną globalną o tym samym identyfikatorze, natomiast w podprogramie głównym odwołanie następuje do zmiennej globalnej, której przypisano wartość 1 – w podprogramie głównym nie zdefiniowano lokalnej zmiennej o tym identyfikatorze, a więc w podprogramie głównym nie nastąpiło przesłonięcie zmiennej globalnej.
Jednakże dla języka C istnieje metoda "dostania się" do zmiennej globalnej 'a'. Należy zdobyć adres zmiennej 'a', następnie skorzystać ze wskaźnika o innej nazwie. W takowy sposób ze środka funkcji get_a() otrzymamy dostęp do zmiennej globalnej 'a'.
Przypisy
Bibliografia
Kategoria:Konstrukcje programistyczne