Zasięg deklaracji to ta część programu, gdzie deklaracja jest aktywna. Zakres
widoczności to ten fragment (fragmenty) kodu, w którym nazwa identyfikatora jest związana z tą deklaracją. Zakres widoczności może być węższy niż zasięg deklaracji na skutek
przesłonięcia.
- Zmienne zadeklarowane poza funkcjami (zmienne globalne) są widoczne od miejsca deklaracji do końca pliku. Mogą być widoczne w innych modułach/plikach jeżeli są zadeklarowane z identyfikatorem extern.
- Zmienne lokalne definiowane są wewnątrz funkcji. Ich zasięg obejmuje część programu od miejsca deklaracji do końca funkcji.
- Zmienne globalne mogą być przesłonięte. Jeżeli wewnątrz funkcji zadeklarujemy zmienną o tej samej nazwie to przesłoni ona zmienną globalną.
- Dostęp do przesłoniętej zmiennej globalnej uzyskamy poprzez operator zasięgu
:: dodany przed nazwą zmiennej:
::Zmienne
#include<iostream>
using namespace std;
int zmienna = 5;
int main()
{
char zmienna = 'A';
cout << zmienna << endl;
cout << ::zmienna << endl;
}
-
Zmienne statyczne to takie, które nie znikają po wykonaniu się danej funkcji (zmienne lokalne). Zmienne statyczne deklaruje się z modyfikatorem static. Dla zmiennych globalnych niby nic się niezmienia - ale - do zmiennych globalnych statycznych nie można się odwołać w innych modułach/plikach. Dla zmiennych lokalnych wartość zmiennych nie znika po wyjściu sterowania z tejże funkcji. Oto przykład:
#include<iostream>
using namespace std;
void nic(int param)
{
int stat;
if (param > 1)
{
stat = 10;
}
cout << "STAT: " << stat << " PARAM: " << param << endl;
}
int main()
{
nic(2);
cout << "Bla bla bla" << endl;
nic(1);
}
Funkcja main wywołuje funkcję nic, która oczekuje jednego parametru, liczby całkowitej. Jeżeli parametr jest większy od 1 to zmiennej stat przypisywana jest wartość 10 i do konsoli leci ładny tekst, jeżeli jest mniejsza, równa to tylko wyświetli się tekst. Wykonanie programu da nam:
STAT: 10 PARAM: 2
Bla bla bla
STAT: 0 PARAM: 1
W drugim wywołaniu z parametrem 1 funkcja
nic nie przypisuje wartości zmiennej stat i otrzymujemy 0 - straciliśmy wcześniejszą wartość zmiennej bo zmienna przestała istnieć... A ze
static:
#include<iostream>
using namespace std;
void nic(int param)
{
static int stat;
if (param > 1)
{
stat = 10;
}
cout << "STAT: " << stat << " PARAM: " << param << endl;
}
int main()
{
nic(2);
cout << "Bla bla bla" << endl;
nic(1);
}
STAT: 10 PARAM: 2
Bla bla bla
STAT: 10 PARAM: 1
Wartość zmiennej stat (jak i ona sama) "przeżyła" :)
- Dodane: 14.07.2008 przez riklaunim