Programmazione D: membri statici di una classe

Possiamo definire i membri della classe staticutilizzando la parola chiave statica. Quando dichiariamo un membro di una classe come statico, significa che non importa quanti oggetti della classe vengono creati, c'è solo una copia del membro statico.

Un membro statico è condiviso da tutti gli oggetti della classe. Tutti i dati statici vengono inizializzati a zero quando viene creato il primo oggetto, se non sono presenti altre inizializzazioni. Non è possibile inserirlo nella definizione della classe ma può essere inizializzato al di fuori della classe come nell'esempio seguente dichiarando nuovamente la variabile statica, utilizzando l'operatore di risoluzione dell'ambito :: per identificare a quale classe appartiene.

Proviamo il seguente esempio per comprendere il concetto di membri di dati statici:

import std.stdio;

class Box { 
   public: 
      static int objectCount = 0;

      // Constructor definition 
      this(double l = 2.0, double b = 2.0, double h = 2.0) { 
         writeln("Constructor called."); 
         length = l; 
         breadth = b; 
         height = h; 
          
         // Increase every time object is created
         objectCount++; 
      } 

      double Volume() { 
         return length * breadth * height; 
      }

   private: 
      double length;     // Length of a box 
      double breadth;    // Breadth of a box 
      double height;     // Height of a box 
};
  
void main() { 
   Box Box1 = new Box(3.3, 1.2, 1.5);    // Declare box1 
   Box Box2 = new Box(8.5, 6.0, 2.0);    // Declare box2  
   
   // Print total number of objects. 
   writeln("Total objects: ",Box.objectCount);  
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Constructor called. 
Constructor called. 
Total objects: 2

Membri della funzione statica

Dichiarando un membro di funzione come statico, lo rendi indipendente da qualsiasi oggetto particolare della classe. Una funzione membro statica può essere chiamata anche se non esistono oggetti della classe e il filestatic si accede alle funzioni utilizzando solo il nome della classe e l'operatore di risoluzione dell'ambito ::.

Una funzione membro statico può accedere solo a membri dati statici, altre funzioni membro statiche e qualsiasi altra funzione dall'esterno della classe.

Le funzioni membro statiche hanno un ambito di classe e non hanno accesso a thispuntatore della classe. È possibile utilizzare una funzione membro statica per determinare se alcuni oggetti della classe sono stati creati o meno.

Proviamo il seguente esempio per comprendere il concetto di membri di funzione statica:

import std.stdio;

class Box { 
   public: 
      static int objectCount = 0; 
      
      // Constructor definition 
      this(double l = 2.0, double b = 2.0, double h = 2.0) { 
         writeln("Constructor called."); 
         length = l; 
         breadth = b; 
         height = h; 

         // Increase every time object is created 
         objectCount++; 
      }

      double Volume() {
         return length * breadth * height; 
      }

      static int getCount() { 
         return objectCount; 
      } 
   
   private: 
      double length;     // Length of a box 
      double breadth;    // Breadth of a box 
      double height;     // Height of a box 
};
  
void main() { 
   // Print total number of objects before creating object. 
   writeln("Inital Stage Count: ",Box.getCount());  
   
   Box Box1 = new Box(3.3, 1.2, 1.5);    // Declare box1 
   Box Box2 = new Box(8.5, 6.0, 2.0);    // Declare box2 
   
   // Print total number of objects after creating object. 
   writeln("Final Stage Count: ",Box.getCount()); 
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Inital Stage Count: 0 
Constructor called. 
Constructor called
Final Stage Count: 2