Domanda

Ho sentito che ci sono differenze tra le lingue sul significato della parola chiave statico , ma non ho trovato un buon elenco che consolidi tali differenze.

Ecco quello che so sul significato di statico in C ++:

  • Per le variabili statiche locali all'interno di una funzione, la variabile viene inizializzata all'avvio e il valore viene salvato tra le chiamate di funzione.
  • I membri di dati statici sono condivisi tra tutte le istanze di una classe. In altre parole, esiste solo un'istanza di un membro di dati statici. I membri statici dei dati devono essere inizializzati nell'ambito del file.
  • Le funzioni dei membri statici hanno accesso solo ai membri statici.
  • Nel codice ricorsivo, è garantito che un oggetto statico o una variabile abbiano lo stesso stato in diverse istanze di un blocco di codice.
  • Gli oggetti statici e le variabili definiti nell'ambito del file hanno solo un collegamento interno. Nessun altro file può usarli.

Come cambia il significato di statico in altre lingue?

È stato utile?

Soluzione

C


  • La parola chiave può modificare il collegamento o la durata (durata) di un oggetto.
  • Le variabili sono sempre inizializzate su 0
  • Le funzioni hanno un collegamento interno.
  • Se dichiarato nell'ambito del livello del file: le variabili hanno un collegamento interno e una durata statica (ovvero esiste per tutta la durata del programma)
  • Se dichiarato nell'ambito del blocco: le variabili non hanno alcun collegamento ma durata statica
  • Ci possono essere più dichiarazioni della stessa variabile statica in un'unità di traduzione. Tuttavia, si noti che devono essere uguali. Ad esempio: nell'ambito di file:

int a;        // a has external linkage

static int a; // a now has static linkage
              // same as if you wrote: static int a = 0;

//...

static int b; // static linkage

extern int b; // extern loses its meaning, b still has internal linkage

//...

extern int b; // b has external linkage

static int b; // error

//...

void func() {
  static int x; // automatic linkage, static duration
                // same as if you wrote: static int x = 0;
}

C ++


  • A livello di file l'utilizzo è stato deprecato sia per le variabili che per i membri a favore di spazi dei nomi anonimi. Esiste solo come compatibilità
  • Le variabili vengono comunque inizializzate per impostazione predefinita (come in C) su 0
  • " 6.7 L'inizializzazione zero (8.5) di tutti gli oggetti locali con durata dell'archiviazione statica (3.7.1) o durata dell'archiviazione del thread (3.7.2) viene eseguita prima di qualsiasi altra inizializzazione [... ] "
  • Le variabili hanno una durata di memorizzazione statica a meno che non siano accompagnate da un identificatore thread_local (da C ++ 0x in poi)
  • In un'unità di traduzione può esserci solo una definizione di statico
  • Le variabili / funzioni del membro indicano che sono proprietà della classe e non delle istanze Sintassi dell'accesso legale: instance.property o Class :: property
  • Le funzioni dei membri statici possono accedere solo alle variabili dei membri statici Nessun questo puntatore per tali funzioni
  • I membri non statici possono comunque accedere a qualsiasi membro statico
  • A livello di file gli oggetti hanno un collegamento interno ad eccezione dei membri della classe che hanno un ambito di classe
  • I membri della classe devono essere definiti nella dichiarazione della classe o all'esterno esplicitamente tramite il nome della classe e l'operatore di risoluzione dell'ambito
  • Impossibile utilizzare this in un metodo statico

ActionScript


  • Metodi di classe come in C ++
  • non può usare this o super in un metodo statico
  • Accesso solo tramite il nome della classe e non il nome dell'istanza
  • Non ereditato
  • Le classi derivate hanno comunque accesso alle proprietà statiche delle basi
  • Le variabili dichiarate con le parole chiave sia statiche che const devono essere inizializzate contemporaneamente alla dichiarazione della costante

Design orientato agli oggetti


  • Il modello di progettazione Singleton è considerato da molti come un oggetto statico glorificato
  • Utilizzato nel modello di progettazione di fabbrica

Potrei aver perso molte altre cose: sentiti libero di entrare.

Altri suggerimenti

In Delphi la parola chiave statica viene utilizzata esclusivamente per definire i metodi di classe. In Delphi un metodo di classe normale può essere dichiarato virtuale e sovrascritto in una sottoclasse. Inoltre Delphi ha una variabile self , simile al puntatore this in altre lingue. Tuttavia, in un metodo di classe self punta alla classe in cui viene chiamato il metodo anziché a un'istanza.

Dichiarare un metodo di classe statico significa:

  1. Non può essere sovrascritto in una sottoclasse
  2. Non ha un auto puntatore

Ciò significa che un metodo di classe statico può accedere solo ai membri della classe nella classe in cui è stato definito, mentre un metodo di classe normale può accedere ai membri della classe sovrascritti nelle classi derivate.

Ci sono altri usi informali di static nella documentazione di Delphi che di solito si riferiscono a una immutabilità della funzione (è una parola?). Ad esempio una matrice statica contro una matrice dinamica. Tutti i metodi di istanza in Delphi sono statici se non diversamente indicato.

In VB.NET, una variabile Static è proprio come una variabile statica locale C ++.

Tuttavia, non esiste un statico a livello di classe; usa invece Shared .

In C # ci sono 3 modi per usare una parola chiave statica:

  • Sulla definizione della classe, il che significa che la classe esporrà solo membri statici e non potrà essere istanziata
  • Su un membro della classe, ciò significa che il membro può essere chiamato senza dover istanziare la classe.
  • Su un costruttore, il che significa che il costruttore statico verrà sempre chiamato prima che venga chiamato un membro statico. (Questi sono principalmente colli di bottiglia delle prestazioni e quindi non sono consigliati)

Spero che questo aiuti.

In C # significa quasi sempre: " relativo a un tipo piuttosto che un'istanza del tipo "

Python ha il decoratore @staticmethod, che quando applicato a un membro della classe, rende il metodo disponibile sulla classe anziché sulle istanze e non passa argomenti automatici al metodo. Il decoratore @classmethod svolge una funzione simile, ma passa la classe come primo argomento, rendendolo molto più utile.

In C, statico contrassegna una funzione o una variabile globale come locale sul file in cui si trova.

È un po 'come privato in altre lingue. Sorta.

Se è in una funzione, allora preallocazione statica di quella variabile nella sezione dati del binario, piuttosto che nello stack in fase di esecuzione.

In VB.NET statico viene utilizzato a livello di procedura per indicare che la variabile è associata a tutte le esecuzioni della procedura (viene preservata da una chiamata all'altra). Questo è un po 'un uso arcano in un'applicazione orientata agli oggetti.

La controparte è " Condivisa " il che significa che il metodo o il membro è a livello di tipo (non è necessaria un'istanza per accedervi).

Wikipedia riassume molti significati diversi di statico :

Metodi statici , variabili statiche , digitazione statica .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top