Pagina informaticii

Teste de informatică pentru liceu, articole C#, C/C++, PHP

Membrii statici ai unei clase

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

Despre autor
Author

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ă

Scrie un comentariu
Nume:

Comentariu:

15 + 10 =