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[1][2][3], C++[3]
|
język Pascal[4][5]
|
język PL/I[6][7]
|
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
- ↑ Brian W. Kernighan, Dennis M. Ritche: Język C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1067-3. (pol.). Brak numerów stron w książce
- ↑ Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.). Brak numerów stron w książce
- ↑ a b Jan Bielecki: Od C do C++, programowanie obiektowe w języku C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990. ISBN 83-204-1332-X. (pol.). Brak numerów stron w książce
- ↑ Michał Iglewski, Jan Madey, Stanisław Matwin: Pascal. Język wzorcowy – Pascal 360. Wyd. trzecie – zmienione. Warszawa: Wydawnictwa Naukowo-Techniczne, 1984, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.). Brak numerów stron w książce
- ↑ Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.). Brak numerów stron w książce
- ↑ Jan Bielecki: Rozszerzony PL/I i JCL w systemie OS/RIAD. Warszawa: Państwowe Wydawnictwo Naukowe, 1986, seria: Biblioteka Informatyki. ISBN 83-01-06146-4. (pol.). Brak numerów stron w książce
- ↑ M. I. Auguston i inni: Programowanie w języku PL/1 OS JS. Warszawa: Państwowe Wydawnictwo Naukowe, 1988. ISBN 83-01-07463-9. (pol.). Brak numerów stron w książce
Bibliografia
- Michael Marcotty, Henry Ledgord, tłumaczenie: Krystyna Jerzykiewicz: W kręgu języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1342-7. (pol.). Brak numerów stron w książce
- John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Informatyka. ISBN 83-204-0246-8. (pol.). Brak numerów stron w książce