Правильно ли говорить, что переменная является экземпляром типа данных?

9

(это может изменить его значение в течение программы)

Или «экземпляр чего-то» строго связан с классами и объектами? Если да, то как бы вы определили понятие «переменная», когда речь заходит о C ++?

Zakkor
источник
C # и Java отличаются от C ++ двумя интересными способами. Во-первых, они пытаются объединить примитивные типы с объектными (и struct) типами (так что вы можете говорить об экземпляре типа int), тогда как C ++ этого не делает. Во-вторых, в C # и Java переменные типов объектов являются неявными ссылками на экземпляры (классов) в куче, а также на то, что мы не говорим об указателях на объекты, тогда как в C ++, как и в ответе @ coredump, локальные переменные типов объектов являются привязками к экземплярам в стеке, и мы явно различаем объекты и указатели на объекты.
Эрик Эйдт

Ответы:

8

Насколько я знаю, правильно вызывать значения экземпляров примитивных типов этого типа (см., Например, «Система типов C ++» из руководства Visual Studio, но я все еще ищу другой источник), хотя я считаю, что этот термин в основном используется при обсуждении предметов. Объект является экземпляром класса C, если он был построен из конструктора, определенного либо в классе C, либо в одном из его подклассов.

Переменная в C ++ не является концепцией времени выполнения. Он существует внутри вашего компилятора как лексическая связь между именем переменной и абстрактным (изменяемым, если не константным) местоположением. Как только программа скомпилирована, переменных там больше нет. Вместо этого данные читаются и записываются в регистры, память и т. Д.

CoreDump
источник
2
« Значения примитивных типов обычно не называются экземплярами этого типа; они зарезервированы для объектов и классов». Это совсем не так. Нигде в стандарте значения примитивных типов не считаются объектами. Кроме того, определение переменной никак не изменяется в зависимости от того, является ли он определяемым пользователем классом или типом примитива.
Николь Болас
@NicolBolas Я никогда не слышал, чтобы кто-нибудь называл целые числа экземплярами чего-либо в контексте C ++, и я вполне уверен, что было бы правильно сказать, что они не являются экземплярами чего-либо, даже если стандарт явно не упоминает об этом. Если нет, то к чему они относятся? Я также не вижу, где этот ответ утверждает, что определение переменной изменяется между примитивными типами и объектами; Кажется, он (на самом деле правильно) утверждает, что «экземпляры» просто не имеют ничего общего с определением переменной.
Иксрек
2
@Ixrec: « Если нет, то к чему они относятся? » Тип int. Стандарт C ++ не делает различий между примитивными типами и не примитивными типами, когда речь идет о том, что делают объявления переменных. Поэтому T t;объявляется объект типа T, независимо от того, какой тип Tпроисходит.
Николь Болас
1
@Ixrec: Обратите внимание, что литералы - это разные вещи. Литералы являются своего рода prvalue. Но вы не можете создавать буквальные переменные, так что это другое обсуждение.
Николь Болас
5

Или «экземпляр чего-то» строго связан с классами и объектами? Если да, то как бы вы определили понятие «переменная», когда речь заходит о C ++?

Чтобы выразить это как можно более кратко для C ++

  • Переменная является имя (в коде) для расположения в памяти , чтобы определить во время выполнения.
  • Экземпляр является объектом , который находится в памяти во время выполнения.

Просто быть чистым:

  • Не все области памяти содержат объекты. Например, некоторые области памяти могут содержать значения «мусора».
  • Не всем объектам хранения памяти будет дано имя в коде. Объекты могут находиться в неименованных областях памяти, таких как позиции в массиве или где-то в куче, на которую ссылается указатель.
  • Когда область памяти содержит мусор, это обычно либо потому, что в этом месте не было инициализировано ни одного объекта, либо потому, что какой-то ранее существующий объект был уничтожен.
Бен Коттрелл
источник
1
POD - это объекты в C ++. Не все области памяти являются объектами, но POD - это не просто области памяти.
Николь Болас
1
Я второй NicolBolas: PODы являются объектами. Однако у вас есть момент, когда вы говорите о вновь malloc()редактируемом, но неинициализированном буфере: это область памяти, которая еще не является объектом. Аналогично, объект, который был явно разрушен: это область памяти, которая больше не является объектом.
cmaster - восстановить монику
@NicolBolas справедливый комментарий, я немного изменил эту формулировку
Бен Коттрелл
1

Ну, что значит «исправить»?

Если мы хотим быть очень строгими, мы должны различать:

  • Синтаксис сторона: выражения имеют (статические) типы
  • Семантика сторона: объекты являются экземплярами из классов

Таким образом, переменная, являющаяся выражением, будет иметь тип. Его значение - объект, на который он ссылается - будет экземпляром некоторого класса. И обратите внимание, что тип переменной и класс объекта обычно не одно и то же - статический тип переменной устанавливает верхнюю границу для классов времени выполнения объектов, так что классы должны быть подтипом класса, соответствующего типу.

Вы хотите повторять этот большой глоток все время? Черт возьми нет. Насколько строго и свободно мы хотим говорить, зависит от контекста. Поэтому часто нет проблем с утверждением, что «переменная является экземпляром этого типа». На самом деле происходит то, что мы используем переменную и тип метонимически для ссылки на объект и суперкласс его класса времени выполнения.

sacundim
источник
1

Если только вы не хотите провести всю свою жизнь в пуризме и софизме ... да.

Каждый раз, когда вы сохраняете что-то однозначно идентифицированное, вы используете его для создания других уникально идентифицируемых вещей, которые вы делаете, создавая экземпляр.

  • Реализация проекта в продуктах
  • Исходный экземпляр в исполняемые файлы
  • Шаблон создания экземпляров в типах.
  • Тип создания экземпляра в переменные.

Некоторые из этих экземпляров могут иметь более точные имена, но в целом это работает.

Эмилио Гаравалья
источник
0

Многие люди оставляют за собой «экземпляр» для занятий. Если вы сделаете это, то в C ++ переменная может быть экземпляром класса, ссылкой на экземпляр, указателем на экземпляр или типом примитива (в этом контексте вы, скорее всего, считаете структуры классами, они почти полностью то же самое). В Java или Objective-C переменные никогда не будут экземплярами, но могут ссылаться на экземпляры.

Забыл: на короткое время указатель C ++ может быть указателем на необработанную память, например, «this» до того, как конструктор начнет выполняться. Скорее всего, вы еще не назвали бы это экземпляром.

gnasher729
источник