Что именно является переменной в C ++? - PullRequest
6 голосов
/ 27 мая 2010

Стандарт гласит

переменная вводится объявлением объекта. Имя переменной обозначает объект.

Но что на самом деле означает это определение?

Дает ли переменная имя объекту, т. Е. Являются ли переменные механизмом именования анонимных объектов? Или переменная сама по себе имя?

Или переменная является именованным объектом в том смысле, что каждая переменная также является объектом?

Или переменная - это просто "прокси" с именем, которое "делегирует" все операции реальному объекту?

Чтобы еще больше запутать, во многих книгах по С ++ переменные и объекты рассматриваются как синонимы.

Что вы думаете об этом?


О сущностях, цитирование из черновика C ++ 0x:

Сущность - это значение, объект, ссылка, функция [...]

Каждое имя, обозначающее сущность, вводится объявлением.

Переменная вводится объявлением объекта

Из этих утверждений я делаю вывод, что переменная является именем и, следовательно, не может быть объектом. Это действительно запутывает меня до чертиков:)

Ответы [ 7 ]

16 голосов
/ 27 мая 2010

Переменные являются именованными объектами. Следующее создает объекты, которые не являются переменными

new int // create one int object
std::string() // create one string object

Следующее создает одну переменную массива с именем "foo" и 5 неназванных (под) объектов типа "int"

int foo[5];

Следующее не является переменной в C ++ 03, но стало переменной в C ++ 0x (объявленные ссылки являются переменными в C ++ 0x, подробности см. По ссылке)

extern int &r;

Дает ли переменная имя объекту, т. Е. Являются ли переменные всего лишь механизмом именования для анонимных в противном случае объектов?

Переменные - это объекты (или ссылки соответственно). Список сущностей (3/3 в C ++ 03) C ++ содержит несколько таких is-a отношений. Например, подобъект - это объект, а элемент массива - это объект, а член класса - это объект или функция, или тип, или шаблон, или перечислитель.

Список сущностей в C ++ 0x выглядит для меня немного чище, и в нем нет «переменных», «экземпляров функции» (что это за сущность, даже для меня, никогда не была очевидна), «подобъект» и «элемент массива» больше. Вместо этого он добавил «специализацию шаблонов», которые являются функциями, классами или шаблонами (частичные специализации).

Объектная модель C ++ в 1.8 говорит

Объект может иметь имя (пункт 3).

Так что, если хотите, вы можете сформулировать утверждение как «Имя объекта обозначает объект».

2 голосов
/ 27 мая 2010

Переменные - это имена, которые вы присваиваете объектам, так что да, объекты, по большому счету, анонимны.

1 голос
/ 27 мая 2010

Переменная - это просто сущность с типом и именем

1 голос
/ 27 мая 2010

Что вы думаете об этом?

Переменная - это блок памяти в стеке или в сегменте кода, или значение в регистре (если размер переменной достаточно мал, хотя обычно это все еще значение в памяти, в то время как регистры содержат временные результаты), с именем предусмотрено для удобства программиста. Имя переменной не существует после компиляции (здесь мы не говорим о трюках с макросами). Любой доступ к переменной разрешается в доступе к памяти, поэтому технически переменная является адресом соответствующего блока данных, и этот адрес нигде не сохраняется. Подумайте об объявлении переменных в ассемблере - переменная «своего рода» существует, но она все еще является просто смещением блока данных.

0 голосов
/ 27 мая 2010

Переменная - это имя объекта. Вы получаете доступ к объекту через эту именованную сущность.

0 голосов
/ 27 мая 2010

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

На самом деле, в двух словах, переменная должна помочь программисту определить точки выполнения соединения, на которые ссылается эта переменная в терминах машинного кода.

0 голосов
/ 27 мая 2010

Я думаю, что это определение вполне понятно.

Переменная вводится объявлением и обозначает объект. Кто вводит переменную? Вы делаете, конечно, и, следовательно, это вы, кто использует его.

Переменная действительно удобна для вас, разработчик. Это фундаментальный аспект большинства языков программирования, а не только C ++. Переменная обычно дает символическое имя пригодной для использования сущности, которая занимает хранилище, так что на нее можно ссылаться и использовать в будущем в вашем исходном коде.

Например, если вы объявите переменную в методе следующим образом:

int x = 5;

Это будет уменьшено компилятором до некоторого смещения от указателя стека, скажем, SP + 0x003.

Через некоторое время вы можете сказать:

x = 52;

В этом случае область стековой памяти SP + 0x003 будет содержать байты, описывающие число 52.

Вы объявляете переменную определенного типа, чтобы компилятор мог определить, сколько места занимают данные в памяти. Без переменных вам пришлось бы самостоятельно управлять всем размещением информации, и вы, вероятно, будете кодировать в сборке или ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...