Falsi amici? Parola chiave "statica" in C rispetto a C ++, C # e Java

8

Per me, l'uso della parola chiave static in C e lingue come C # e Java sono "falsi amici" come "diventare" in inglese e "bekommen" in tedesco (= "ottenere" in inglese), perché significano cose diverse.

In C static significa che la funzione o la variabile è accessibile solo tramite le funzioni all'interno dello stesso file sorgente, paragonabile a private funzioni e membri in C ++, Java e C #.

In C ++, Java e C # static significa che i metodi non sono membri di un'istanza di classe, ma effettivamente sono più o meno come le funzioni C più lo spazio dei nomi.

IMHO questi due concetti sono molto diversi, quindi perché i progettisti di C ++ e in seguito di Java e C # hanno scelto la parola chiave static per quel comportamento? C'è una connessione logica che mi manca?

Modifica Lo so, che static in C non governa l'accessibilità in modo simile a private in C ++, ma può essere usato in questo modo, vedi link

    
posta Residuum 28.03.2012 - 12:35
fonte

5 risposte

7

Ho un libro sul design di C ++ di Bjarne Stroustrup (l'inventore di C ++). Non ce l'ho proprio qui, quindi non posso cercare la citazione esatta adesso, ma in essa ammette che quando ha aggiunto static a C ++, non ha capito completamente cosa significasse in C. Ecco perché in C ++ ha un significato diverso rispetto a C.

Java e C # hanno ereditato il significato da C ++.

    
risposta data 28.03.2012 - 14:32
fonte
14

In particolare, C ++ ha entrambi gli usi di static , e penso che ci sia un terzo da qualche parte.

In generale, penso che l'uso C di static non corrisponda affatto a qualsiasi uso inglese della parola, mentre penso che static come variabile membro static , ad esempio, faccia molto di più senso.

Ricorda che come designer del linguaggio, hai il giusto incentivo a introdurre meno parole chiave nella lingua, per non applicare meno codice, specialmente quando stai cercando di essere compatibile con la sorgente con C, come in C ++ e con static keyword già esistente, quindi non potevano rompere alcun programma C cercando di compilare come C ++ riutilizzandolo.

Modifica: sapevo che c'era un terzo. C ha variabili static a livello di funzione. Il membro static è solo una versione con ambito di questa funzionalità. Pertanto, entrambi gli usi di static hanno origine da C.

    
risposta data 28.03.2012 - 12:42
fonte
7

In C ++, static ha i seguenti quattro usi:

  • Funzione globale (a livello di file) e dichiarazioni variabili : con statico, stai specificando linkage interno . Ciò significa che il simbolo viene utilizzato solo in quell'unica unità di compilazione (file .cpp / cc / qualunque, non un'intestazione). Questo è ciò a cui ti stai riferendo come "privato".

  • Variabili locali : la durata di archiviazione statica specifica che la variabile deve mantenere il suo valore tra le chiamate di funzione.

  • Membri dati : i membri dei dati statici sono condivisi tra le istanze della classe (cioè c'è solo una copia del membro). Questo è simile a C # e Java statico.

  • Funzioni membro : le funzioni membro statiche sono funzioni membro che non hanno un puntatore this implicito; possono essere invocati senza un'istanza. Anche questo è molto simile a C # o Java.

Quindi, come puoi vedere, hanno lasciato cadere due dei significati sopra. Per lo scope è abbastanza comprensibile il perché: sia C # che Java (e anche C ++) si affidano agli spazi dei nomi per farlo. C ++ ha probabilmente la funzione di collegamento interno per la retrocompatibilità. Eliminare le variabili locali statiche è probabilmente duplice: per una volta, può essere difficile comprenderne appieno le conseguenze, e questi linguaggi mirano alla semplicità. In secondo luogo, sia Java che C # hanno un garbage collector che (posso immaginare) causa difficoltà nell'implementare un simile comportamento.

    
risposta data 28.03.2012 - 13:24
fonte
3

C ++ l'ha preso da C, perché a C ++ piace riutilizzare le parole chiave esistenti invece di introdurne di nuove, per ridurre al minimo l'interruzione del codice esistente.

Java e C # poi lo hanno preso da C ++.

    
risposta data 28.03.2012 - 12:48
fonte
3

C static non governa l'accessibilità e non è analogo a private nel modo in cui viene suggerito.

Nell'ambito del file, governa la disponibilità del nome (simbolo del linker), non della cosa - puoi passare un puntatore a una funzione static o globale da l'unità di traduzione in cui è definita per codificare in un altro file e funzionerà correttamente.

Il modo in cui C ++ fa questo (come dice DeadMG, il modo C è ancora disponibile) è quello di usare uno spazio dei nomi anonimo.

Nell'ambito della funzione, sostituisce essenzialmente la variabile locale con un globale che è accessibile solo (di nuovo nome!) all'interno di quella funzione - questo è identico in C ++ (quindi, non c'è un altro C ++ y modo di farlo)

Per quanto riguarda il motivo per cui C ++ ha utilizzato il qualificatore static per i membri della classe; probabilmente è giusto dire che questo è per minimizzare il numero di nuove parole chiave introdotte. (Notare il recente riutilizzo di auto per il confronto).

Chiamare dati per classe statici (quindi i dati implicitamente per istanza sono dinamici ) mi sembra abbastanza intuitivo, ma poiché non ricordo il processo di formazione questa intuizione, non posso davvero commentare obiettivamente se avesse senso all'inizio.

    
risposta data 28.03.2012 - 12:56
fonte

Leggi altre domande sui tag