È corretto dire che una variabile è un'istanza di un tipo di dati?

8

(che può cambiare il suo valore nel corso del programma)

O l'istanza di qualcosa è strettamente correlata a classi e oggetti? In tal caso, come definiresti il concetto di 'variabile' quando si tratta di C ++?

    
posta Zakkor 25.03.2016 - 18:15
fonte

5 risposte

8

Per quanto ne so, è corretto chiamare valori di tipi primitivi istanze di quel tipo (vedere ad esempio " C ++ Type System ", dal manuale di Visual Studio, ma sto ancora cercando un'altra fonte), anche se credo che questo termine sia usato principalmente quando si discute di oggetti. Un oggetto è un'istanza di una classe C se è stata creata da un costruttore definito in classe C o in una delle sue sottoclassi.

Una variabile in C ++ non è un concetto di runtime. Esiste all'interno del compilatore come un legame lessicale tra il nome della variabile e una posizione astratta (mutabile se non costante). Una volta che un programma è compilato, le variabili non ci sono più. Invece, i dati vengono letti e scritti in registri, memoria, ecc.

    
risposta data 25.03.2016 - 18:42
fonte
4

Or is 'instance of something' strictly related to classes and objects? If so, how would you define the concept of 'variable' when it comes to C++?

Per dirla in modo conciso possibile per C ++

  • Una variabile è un nome (nel codice) per una posizione in memoria da determinare in fase di runtime.
  • Un'istanza è un oggetto che risiede in memoria in fase di runtime.

Per essere chiari:

  • Non tutte le aree della memoria contengono oggetti. Ad esempio, alcune aree della memoria potrebbero contenere valori "garbage".
  • A tutti gli oggetti che memorizzano la memoria non è stato assegnato un nome nel codice. Gli oggetti possono risiedere in aree non nominate della memoria, come una posizione in un array, o in qualche punto del Heap a cui fa riferimento un puntatore.
  • Quando un'area della memoria contiene spazzatura, di solito è perché nessuno oggetto è stato initalizzato in quella posizione o perché alcuni oggetti precedentemente esistenti sono stati distrutti.
risposta data 25.03.2016 - 21:11
fonte
1

Bene, cosa significa "corretto"?

Se vogliamo essere super-severi su questo, dobbiamo distinguere tra:

  • La sintassi lato: espressioni ha (statico) tipi
  • Il lato semantics : oggetti sono istanze di classi

Quindi una variabile, essendo un'espressione, dovrebbe avere un tipo. Il suo valore, l'oggetto a cui si riferisce, sarebbe un'istanza di qualche classe. E si noti che il tipo di variabile e la classe dell'oggetto non sono generalmente la stessa cosa: il tipo statico della variabile mette un limite superiore sulle classi di runtime degli oggetti, in modo che le classi debbano essere un sottotipo della classe corrispondente al tipo.

Vuoi ripetere quel grande boccone tutto il tempo? Diamine no. Quanto strettamente e liberamente vogliamo parlare dipende dal contesto. Così spesso non c'è davvero alcun problema nel dire che "la variabile è un'istanza di questo tipo". Quello che sta succedendo è che usiamo la variabile e il tipo metonimicamente per fare riferimento all'oggetto e una superclasse della sua classe di runtime.

    
risposta data 25.03.2016 - 19:06
fonte
1

A meno che tu non voglia trascorrere tutta la tua vita nel purismo e nel sofisma ... sì.

Ogni volta che mantieni qualcosa che è identificato in modo univoco un uso per forgiare altre cose identificabili in modo univoco che stai facendo istanziazione.

  • Un progetto che istanzia nei prodotti
  • Un'origine crea un'istanza negli eseguibili
  • Un modello crea un'istanza in tipi.
  • Un tipo istanziato in variabili.

Alcuni di questi istanziamenti possono avere nomi più precisi, ma in generale questo funziona.

    
risposta data 26.03.2016 - 17:40
fonte
0

Molte persone riservano "istanza" per istanze di classi. Se lo fai in C ++, una variabile potrebbe essere un'istanza di una classe, un riferimento a un'istanza, un puntatore a un'istanza o un tipo primitivo (probabilmente conteggi le strutture come classi in quel contesto, sono quasi completamente uguale). In Java o Objective-C, le variabili non sarebbero mai istanze ma probabilmente riferimenti a istanze.

Dimenticato: per un breve periodo, un puntatore C ++ può essere un puntatore alla memoria grezza, ad esempio "questo" prima che il costruttore inizi l'esecuzione. Probabilmente non chiamerai * questa istanza ancora a questo punto.

    
risposta data 29.03.2016 - 15:46
fonte

Leggi altre domande sui tag