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


9

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

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


C # e Java differiscono dal C ++ in due modi interessanti. Innanzitutto, tentano di unificare i tipi primitivi con i tipi di oggetto (e struct) (in modo da poter parlare di un'istanza di int), mentre C ++ no. In secondo luogo, in C # e Java, le variabili dei tipi di oggetto sono implicitamente riferimenti alle istanze (delle classi) nell'heap e anche che non si parla di puntatori agli oggetti, mentre in C ++, come la risposta di @ coredump, le variabili locali dei tipi di oggetto sono associazioni alle istanze nello stack e distinguiamo esplicitamente tra oggetti e puntatori agli oggetti.
Erik Eidt,

Risposte:


8

Per quanto ne so, è corretto chiamare valori di istanze di tipi primitivi di quel tipo (vedere ad esempio "Sistema di tipi C ++" , 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 è stato creato da un costruttore definito nella 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 const). Una volta compilato un programma, le variabili non ci sono più. Invece, i dati vengono letti e scritti in registri, memoria, ecc.


2
"I valori dei tipi primitivi non sono generalmente considerati istanze di quel tipo; è riservato a oggetti e classi. " Non è affatto vero. In nessun punto dello standard sono valori di tipi primitivi non considerati oggetti. Né la definizione di una variabile cambia in alcun modo a seconda che si tratti di una classe definita dall'utente o di un tipo primitivo.
Nicol Bolas,

@NicolBolas Non ho mai sentito nessuno riferirsi agli interi come istanze di qualcosa nel contesto di C ++, e sono abbastanza sicuro che sia corretto affermare che non sono istanze di nulla, anche se lo standard non lo menziona esplicitamente. In caso contrario, di cosa sono istanze? Inoltre non vedo dove questa risposta affermi che la definizione di una variabile cambia tra tipi e oggetti primitivi; sembra (afaik correttamente) affermare che le "istanze" semplicemente non hanno nulla a che fare con la definizione di una variabile.
Ixrec,

2
@Ixrec: "In caso contrario, di cosa sono istanze? " Il tipo int. Lo standard C ++ non fa una distinzione tra tipi primitivi e tipi non primitivi quando si parla di cosa fanno le dichiarazioni variabili. T t;Dichiara quindi un oggetto di tipo T, indipendentemente dal tipo T.
Nicol Bolas,

1
@Ixrec: Nota che i letterali sono un tipo diverso di cose. I letterali sono una specie di valore. Ma non puoi creare variabili letterali, quindi questa è una discussione diversa.
Nicol Bolas,

5

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

Per dirla nel modo più conciso possibile per C ++

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

Giusto per essere chiari:

  • Non tutte le aree della memoria contengono oggetti. Ad esempio, alcune aree della memoria possono contenere valori "spazzatura".
  • Non tutti gli oggetti che memorizzano memoria avranno ricevuto un nome nel codice. Gli oggetti possono risiedere in aree senza nome della memoria come una posizione in un array o in qualche punto dell'heap a cui fa riferimento un puntatore.
  • Quando un'area di memoria contiene immondizia, di solito è perché nessun oggetto è stato inizializzato in quella posizione o perché alcuni oggetti precedentemente esistenti sono stati distrutti.

1
I POD sono oggetti in C ++. Non tutte le regioni di memoria sono oggetti, ma i POD non sono solo regioni di memoria.
Nicol Bolas,

1
Secondo NicolBolas: i POD sono oggetti. Tuttavia, hai un punto quando parli di un malloc()buffer appena edito, ma non inizializzato: è un'area di memoria che non è ancora un oggetto. Allo stesso modo, un oggetto che è stato esplicitamente distrutto: è una regione di memoria che non è più un oggetto.
cmaster - ripristina monica il

@NicolBolas, giusto commento, ho leggermente modificato questa formulazione
Ben Cottrell,

1

Bene, cosa significa "correggere"?

Se vogliamo essere super severi al riguardo, dobbiamo distinguere tra:

  • Il lato della sintassi : le espressioni hanno tipi (statici)
  • Il lato semantico : gli oggetti sono istanze di classi

Allora una variabile a essere espressione-dovrebbe avere un tipo. Il suo valore - l'oggetto a cui si riferisce - sarebbe un'istanza di una classe. E nota che il tipo della variabile e la classe dell'oggetto non sono generalmente la stessa cosa: il tipo statico della variabile pone un limite superiore sulle classi di runtime degli oggetti, quindi le classi devono essere un sottotipo della classe che corrisponde al tipo.

Vuoi ripetere quel grosso boccone tutto il tempo? Diamine no. Quanto rigorosamente contro vagamente vogliamo parlare dipende dal contesto. Così spesso non c'è davvero nessun problema a dire che "la variabile è un'istanza di questo tipo". Quello che sta succedendo lì è che stiamo usando la variabile e il tipo metonimicamente per riferirci all'oggetto e ad una superclasse della sua classe di runtime.


1

A meno che tu non voglia passare tutta la tua vita in purismo e sofismo ... sì.

Ogni volta che conservi qualcosa che è stato identificato in modo univoco, puoi creare altre istanze identificabili in modo univoco.

  • Un progetto crea un'istanza in prodotti
  • Un'istanza di origine in eseguibili
  • Un'istanza di modello in tipi.
  • Un'istanza di tipo in variabili.

Alcune di queste istanze possono avere nomi più precisi, ma in generale funziona.


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 (con ogni probabilità potresti contare le strutture come classi in quel contesto, sono quasi completamente lo stesso). In Java o Objective-C, le variabili non sarebbero mai istanze ma probabilmente riferimenti ad istanze.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.