Teste de informatică pentru liceu, articole C#, C/C++, PHP
Membrii 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; }
Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică