Est-il correct de dire qu'une variable est une instance d'un type de données?

9

(qui peut changer sa valeur au cours du programme)

Ou bien «l'instance de quelque chose» est-elle strictement liée aux classes et aux objets? Si oui, comment définiriez-vous le concept de «variable» en ce qui concerne le C ++?

Zakkor
la source
C # et Java diffèrent de C ++ de deux manières intéressantes. Tout d'abord, ils tentent d'unifier les types primitifs avec les types objet (et struct) (afin que vous puissiez parler d'une instance de int), contrairement à C ++. Deuxièmement, en C # et Java, les variables de types d'objets sont implicitement des références à des instances (de classes) dans le tas et aussi que nous ne parlons pas de pointeurs vers des objets, alors qu'en C ++, comme la réponse de @ coredump, les variables locales de types d'objets sont des liaisons aux instances de la pile, et nous distinguons explicitement les objets et les pointeurs vers les objets.
Erik Eidt

Réponses:

8

Pour autant que je sache, il est correct d'appeler des valeurs d' instances de types primitifs de ce type (voir par exemple "C ++ Type System" , du manuel de Visual Studio, mais je cherche toujours une autre source), bien que je pense que ce terme est surtout utilisé pour discuter des objets. Un objet est une instance d'une classe C s'il a été construit à partir d'un constructeur défini soit dans la classe C, soit dans l'une de ses sous-classes.

Une variable en C ++ n'est pas un concept d'exécution. Il existe à l'intérieur de votre compilateur en tant que liaison lexicale entre le nom de la variable et un emplacement abstrait (mutable sinon const). Une fois qu'un programme est compilé, les variables ne sont plus là. Au lieu de cela, les données sont lues et écrites dans des registres, de la mémoire, etc.

coredump
la source
2
"Les valeurs des types primitifs ne sont généralement pas considérées comme des instances de ce type; elles sont réservées aux objets et aux classes. " Ce n'est pas vrai du tout. Nulle part dans la norme les valeurs des types primitifs ne sont considérées comme des objets. La définition d'une variable ne change pas non plus selon qu'il s'agit d'une classe définie par l'utilisateur ou d'un type primitif.
Nicol Bolas
@NicolBolas Je n'ai jamais entendu personne se référer à des entiers comme des instances de quelque chose dans le contexte de C ++, et je suis presque sûr qu'il est correct de dire que ce ne sont des instances de rien, même si la norme ne le mentionne pas explicitement. Sinon, de quoi s'agit-il? Je ne vois pas non plus où cette réponse prétend que la définition d'une variable change entre les types primitifs et les objets; il semble (afaik correctement) prétendre que les "instances" n'ont tout simplement rien à voir avec la définition d'une variable.
Ixrec
2
@Ixrec: " Sinon, de quoi s'agit-il? " Le type int. Le standard C ++ ne fait pas de distinction entre les types primitifs et les types non primitifs quand on parle de ce que font les déclarations de variables. T t;Déclare donc un objet de type T, quel que soit le type T.
Nicol Bolas
1
@Ixrec: Notez que les littéraux sont une chose différente. Les littéraux sont une sorte de valeur. Mais vous ne pouvez pas créer de variables littérales, c'est donc une discussion différente.
Nicol Bolas
5

Ou bien «l'instance de quelque chose» est-elle strictement liée aux classes et aux objets? Si oui, comment définiriez-vous le concept de «variable» en ce qui concerne le C ++?

Pour le dire aussi concis que possible pour C ++

  • Une variable est un nom (en code) pour un emplacement en mémoire à déterminer lors de l'exécution.
  • Une instance est un objet qui réside en mémoire lors de l'exécution.

Juste pour être clair:

  • Toutes les zones de mémoire ne contiennent pas d'objets. Par exemple, certaines zones de mémoire peuvent contenir des valeurs «poubelles».
  • Tous les objets stockant de la mémoire n'auront pas reçu de nom dans le code. Les objets peuvent résider dans des zones de mémoire non nommées telles qu'une position dans un tableau, ou quelque part sur le tas référencé par un pointeur.
  • Lorsqu'une zone de mémoire contient des déchets, c'est généralement soit parce qu'aucun objet n'a été initalisé à cet endroit, soit parce qu'un objet déjà existant a été détruit.
Ben Cottrell
la source
1
Les POD sont des objets en C ++. Toutes les régions de la mémoire ne sont pas des objets, mais les POD ne sont pas seulement des régions de la mémoire.
Nicol Bolas
1
J'appuie NicolBolas: les POD sont des objets. Cependant, vous avez un point lorsque vous parlez d'un malloc()tampon nouvellement édité mais non initialisé: c'est une zone de mémoire qui n'est pas encore un objet. De même, un objet qui a été explicitement détruit: c'est une région mémoire qui n'est plus un objet.
cmaster - réintègre monica
@NicolBolas fair comment, j'ai légèrement changé cette formulation
Ben Cottrell
1

Eh bien, que signifie «correct»?

Si nous voulons être très stricts à ce sujet, nous devons faire la distinction entre:

  • La syntaxe côté: expressions ont (statiques) types
  • La sémantique côté: les objets sont des instances de cours

Alors une variable-être une expression aurait avoir un type. Sa valeur - l'objet auquel il fait référence - serait une instance d'une classe. Et notez que le type de la variable et la classe de l'objet ne sont généralement pas la même chose - le type statique de la variable met une limite supérieure sur les classes d'exécution des objets, de sorte que les classes doivent être un sous - type de la classe qui correspond au type.

Voulez-vous répéter cette grosse bouchée tout le temps? Heck non. La façon dont nous voulons parler strictement ou vaguement dépend du contexte. Si souvent, il n'y a vraiment aucun problème à dire que "la variable est une instance de ce type". Ce qui se passe là-bas, c'est que nous utilisons la variable et le type métonymiquement pour faire référence à l'objet et à une superclasse de sa classe d'exécution.

sacundim
la source
1

A moins que vous ne vouliez passer votre vie entière dans le purisme et le sophisme ... oui.

Chaque fois que vous conservez quelque chose qui est identifié de façon unique, vous pouvez forger d' autres choses identifiables de manière unique que vous faites une instanciation.

  • Un projet instancier en produits
  • Une source instanciée en exécutables
  • Un modèle instancie en types.
  • Un type instancie en variables.

Certaines de ces instanciations peuvent avoir des noms plus précis, mais en général cela fonctionne.

Emilio Garavaglia
la source
0

Beaucoup de gens réservent "instance" aux instances de classes. Si vous le faites alors en C ++, une variable pourrait être une instance d'une classe, une référence à une instance, un pointeur vers une instance ou un type primitif (vous compteriez probablement des structures comme classes dans ce contexte, elles sont presque complètement le même). En Java ou Objective-C, les variables ne seraient jamais des instances mais éventuellement des références à des instances.

Oublié: Pendant un court instant, un pointeur C ++ peut être un pointeur vers la mémoire brute, par exemple "ceci" avant que le constructeur ne commence à s'exécuter. Vous n'appeleriez probablement pas * this une instance pour l'instant.

gnasher729
la source