E-gradiva > Računalništvo > Programiranje > Upravljanje s programirljivimi napravami > Funkcije > Doseg in življenjska doba

Prijava

Doseg in življenjska doba

 

 

Ž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;
}