Przesłanianie

Z Wikipedii, wolnej encyklopedii

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[edytuj | edytuj kod]

  1. 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.).
  2. Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.).
  3. 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.).
  4. 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.).
  5. Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
  6. 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.).
  7. 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.).

Bibliografia[edytuj | edytuj kod]