RkBlog

Hardware, programming and astronomy tutorials and reviews.

Zmienna w C++

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" :)
RkBlog

C/C++ i Java, 14 July 2008, Piotr Maliński

Comment article