ŽIVLJENSKA DOBA SPREMENLJIVKE (”lifetime”):
čas med njeno rezervacijo in sprostitvijo
DOSEG SPREMENLJIVKE (”scope”):
tisti del programa kjer spremenljivko lahko uporabljamo
LOKALNA SPREMENLJIVKA :
spremenljivka ima doseg in življensko dobo od mesta definicije do konca bloka, v katerem je definirana
GLOBALNA SPREMENLJIVKA:
spremenljivka je globalna, če je definirana izven bloka funkcije
Primer prekrivanja spremenljivke
{
int i=2;
i=i+1;
{
int i=4;
i=i+1;
}
i=i+1;
}
Vrste spremenljivk
v C++ imamo dve vrsti spremenljivk (lokalne in globalne)
če je spremenljivka redefinirana znotraj bloka, potem je lokalna znotraj bloka
Določila za življensko dobo
auto- ko pridemo v blok in naletimo na deklaracijo, se prostor alocira, ko izstopimo iz bloka, se prostor sprosti (to je
privzet način delovanja)
auto int a,b,c;
register - ko vstopimo v blok, se prostor rezervira v CPE (tako pohitrimo izvajanje)
for (register int i=0; …
extern - spremenljivke napravimo vidne v vseh prevajalnikenotah. Če uporabimo to določilo, ni potrebno uporabiti direktive #include
extern int stevec;
extern double izr(double x);
static - lokalne spremenljivke, ki imajo določilo static, se ohranijo, ko se funkcija konča;
- globalne spremenljivke ali funkcije, ki so definirane s static, so vidne samo znotraj te datoteke (modula). Na ta način skrijemo takšne spremenljivke ali funkcije, pred uporabo od zunaj.
const - če dodamo const, to pomeni, da ima spremenljivka
konstantno vrednost.
Poglejmo si naslednji primer:
#include <iostream>
using namespace std;
void a(void); // funkcijski prototip
void b(void); // "
void c(void); // "
int x = 1; // globalna spremenljivka
int main() {
int x = 5; // lokalna spremenljivka v main
cout << "lokalna sprem. x v zunanjem bloku "<< "v main je " << x << endl;
{ // novi blok -> novi doseg
int x = 7;
cout << "lokalna sprem. x v notranjem bloku "<< "v main je " << x << endl;
} // konec bloka in dosega
cout << "lokalna sprem. x v zunanjem bloku "<< "v main je " << x << endl;
a(); // a vsebuje automaticno lokalno spremenljivko x
b(); // b vsebuje staticno lokalno x
c(); // c uporablja globalno x
a(); // a reinicializira automaticno lokalno spremenljivko x
b(); // staticna lokala sprem. x ohrani prejsnjo vrednost
c(); // globalna sprem. x tudi ohrani svojo vrednost
cout << "lokalna sprem. x v main je " << x << endl;
system("pause");
return 0;
}
void a(void)
{
int x = 25; // inicializirana vsakokrat, ko je funkcija a poklicana
cout << endl << "lokalna sprem. x v funkciji a"
<< " je " << x << " po vstopu v a" << endl;
++x;
cout << endl << "globalna sprem. x v funkciji a"
<< " je " << ::x << " po vstopu v a"
<< endl;
cout << endl << "lokalna sprem. x v funkciji a"
<< " je " << x << " pred izstopom iz a"
<< endl;
}
void b(void)
{
static int x = 50; // staticna inicializacija samo pri prvem klicu
// funkcije b
cout << endl << " lokalna staticna sprem. x"
<< "je " << x << " pri vstopu v b" << endl;
++x;
cout << " lokalna staticna sprem. x je " << x
<< " pri izstopu iz b" << endl;
}
void c(void)
{
cout << endl << " globalna sprem. x je " << x
<< " pri vstopu v c " << endl;
x *= 10;
cout << " globalna sprem. x je " << x
<< " pri izstopu iz c " << endl;
}