Salve!!
Qualcuno può spiegarmi , per favore, il significato dello specificatore static davanti al metodo di una classe??
Grazie
Salve!!
Qualcuno può spiegarmi , per favore, il significato dello specificatore static davanti al metodo di una classe??
Grazie
andry80
static serve per la comunicazione ad ambiente condiviso, ovvero un membro static è lo stesso per ogni istanza, un po come se ci fosse un membro e un puntatore in ogni istanza che punta allo stesso spezio di memoria.
Quando si crea un metodo static lo si vincola a poter accedere solo a variabili static e non avrà bisogna di sapere a quale oggetto riferisce quindi(dato che i membri statici sono condivisi da tutte le istanze).
Facendo qualche ricerca si trovano anche ivantaggi nel dichiarare un metodo statico:
maggiore controllo su possibili fonti di errore: dichiarando un metodo static, chiediamo al compilatore di accertarsi che il metodo non acceda ad altre categorie di attributi;
minor overhead di chiamata: i metodi non static per sapere a quale oggetto devono riferire, ricevono dal compilatore un puntatore all'istanza di classe per la quale il metodo e` stato chiamato; i metodi static per loro natura non hanno bisogno di tale parametro e quindi non richiedono tale overhead;
i metodi static oltre a poter essere chiamati come un normale metodo, associandoli ad un oggetto (con la notazione del punto), possono essere chiamati come una normale funzione senza necessita` di associarli ad una particolrare istanza, ricorrendo al risolutore di scope.
Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)
Piccolo esempio:
Una volta in esecuzione il programma la variabile aNumber esiste prima che venga invocata f()(il compilatore assegna per default 0) e alla prima chiamata prende il valore di inizializzazione fornito dall'assegnamento all'interno di f(). Le successive chiamate ad f() incrementano aNumber di un unita'(++ preincremento) in fase di restituzione della funzione, ma incrementa la variabile precedentemente incrementata, quindi lavariabile aNumber ha una permanenza statica nella memoria(quindi non e' una variabile automatica che viene distrutta all'uscita di f()).codice:include "iostream" using nomespace str; int f(void);//prototipo main() { cout<<f();//stampa 1 cout<<f();//stampa 2 cout<<f();//stampa 3 return 0; } int f(void){ static aNumber = 0; return ++aNamber; }
Da questo ragionamento di base si arriva anche alle nozioni piu' complese rendendo statiche anche delle classi.
Ciao
Nulla, ma e' sempre qualcosa.