Membri statici ai unei clase
Membri statici ai unei clase sunt variabilele membre statice și funcțiile membre statice.
Pentru a înțelege mai bine care este diferența dintre o variabilă membră statică și o variabilă membră obișnuită, dau următorul exemplu: Într-o clasă de elevi, fiecare copil are câte un creion, iar la tablă se află o bucată de cretă. Când un elev scrie în caiet, consumă creionul propriu, iar când scrie la tablă, consumă aceeași bucată de cretă, comună tuturor elevilor. Deci acest lucru înseamnă că o variabilă statică este comună tuturor obiectelor clasei. Exemplu:
#include <iostream>
using namespace std;
class Test
{
private:
static int a;
int b;
public:
Test()
{
b = 0;
}
void Modifica()
{
a++;
b++;
}
void Afisare()
{
cout << a << " " << b << "\n";
}
};
int Test::a = 0;
int main()
{
Test x, y, z;
x.Modifica();
y.Modifica();
z.Modifica();
x.Afisare();
y.Afisare();
z.Afisare();
return 0;
}
Remarcați în exemplul de mai sus modul în care se inițializează (în afara clasei) variabila statică a. Se observă că deoarece obiectele x, y, z au mărit cu 1 valoarea variabilei statice, valoarea afișată pentru a este 3. În schimb, variabila membră b este 1 pentru toate cele 3 obiecte.
Funcțiile membre statice nu aparțin unui obiect anume. Din acest motiv o funcție statică se apelează în forma:
NumeClasa :: NumeFunctieStatica() unde : : este operatorul de domeniu (resolution operator). Exemplu:#include <iostream> using namespace std; class Test { private: static int a; int b; public: static void FunctieStatica() { //b = 0; // eroare! cout << "Apel functie statica"; } }; int main() { Test::FunctieStatica(); return 0; }
În exemplul de mai jos am construit o clasă a tablourilor unidimensionale în care variabila membră nrInstante contorizează numărul obiectelor:
#include <<iostream>
#include <<fstream>
#include <<algorithm>
using namespace std;
class Tablou
{
private:
int t[1000];
int n;
public:
static int nrInstante;
Tablou()
{}
Tablou(int dim, int val)
{
n = dim;
for (int i = 0; i < n; ++i)
t[i] = val;
nrInstante++;
}
Tablou(char *numeFisier)
{
ifstream fin(numeFisier);
fin >> n;
for (int i = 0; i < n; ++i)
fin >> t[i];
fin.close();
nrInstante++;
}
// constructor de copiere
Tablou(Tablou &a)
{
n = a.n;
for (int i = 0 ;i < n; ++i)
t[i] = a.t[i];
nrInstante++;
}
int Length()
{
return n;
}
int operator[](int k)
{
if (k < 0) return t[0];
if (k >= n) return t[n - 1];
return t[k];
}
friend ostream& operator << (ostream &out, Tablou &a)
{
for (int i = 0; i < a.Length(); ++i)
out << a[i] << " ";
out << "\n";
return out;
}
void Sortare()
{
sort(t, t + n);
}
void Inserare(int poz, int x)
{
for (int i = n; i > poz; --i)
t[i] = t[i - 1];
t[poz] = x;
n++;
}
void Sterge(int poz)
{
for (int i = poz + 1; i < n; ++i)
t[i - 1] = t[i];
n--;
}
int Cautare(int x)
{
for (int i = 0; i < n; ++i)
if (t[i] == x)
return i;
return -1;
}
static void AfisVarStatica()
{
cout << "Numar instantieri folosite : " << Tablou::nrInstante << "\n";
}
};
int Tablou::nrInstante = 0;
int main()
{
Tablou a(20, 3), b(10, 1), c(b);
cout << a << b << c;
Tablou::AfisVarStatica();
return 0;
}