Являются ли переменные простого типа объектами в C ++? - PullRequest
2 голосов
/ 26 февраля 2011

Являются ли переменные простого типа объектами в C ++?

int x = 0;

Очевидно, это зависит от определения объекта. Так будет ли x объектом в этом случае? Это не может быть определено стандартом в любом случае, но, пожалуйста, сделайте это, если вы уверены, что это либо объект, либо нет.

Ответы [ 3 ]

10 голосов
/ 26 февраля 2011

Да (объект в стандарте - это просто область хранения - 1.8 / 1)

Объект является областью хранения. [Примечание: функция не является объектом, независимо от того, занимает ли она память так же, как объекты. ] Объект создается определением , новым выражением _ или реализацией при необходимости.

А для переменной (3/4)

A name - это использование идентификатора, который обозначает сущность, или label . переменная вводится объявлением объекта. Имя переменной обозначает объект.

Для любопытных определение унаследовано от C (с изменениями, необходимыми для C ++). Стандарт C 90 гласит:

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

2 голосов
/ 26 февраля 2011

От 1.8.1

-1- Конструкции в программе на C ++ создают, уничтожают, ссылаются на объекты, обращаются к ним и манипулируют ими.Объект - это область хранения.[Примечание: функция не является объектом, независимо от того, занимает ли она память так же, как объекты.] Объект создается определением (basic.def), выражением new (expr.new) или реализацией (class.teilitary), когда это необходимо.Свойства объекта определяются при его создании.Объект может иметь имя (пункт basic).У объекта есть срок хранения (basic.stc), который влияет на его время жизни (basic.life).Объект имеет тип (basic.types).Термин тип объекта относится к типу, с которым объект создается.

Это также подразумевается в этом утверждении из 3.9.1:

Типы описывают объекты (intro.object), ссылки (dcl.ref) или функции (dcl.fct).

Очевидно, что для "объектов" для группировки всего, что напечатано, кроме ссылок или функций, оно должно включать int и др.

Стоит отметить, что основные типыкак int не являются объектами в «объектно-ориентированном» смысле, но это довольно очевидно из того факта, что они такие же, как в C, который не является объектно-ориентированным языком.

0 голосов
/ 26 февраля 2011

Да, это так. Согласно §7 / ​​5:

Если decl-specier-seq содержит спецификатор typedef, объявление называется объявлением typedef, а имя каждого init-объявлений объявляется как имя typedef, синонимичное с его связанным типом (7.1.3). Если decl-specier-seq не содержит спецификатора typedef, объявление называется объявлением функции, если тип, связанный с именем, является типом функции (8.3.5) и в противном случае декларацией объекта.

Итак, у вас есть объявление объекта (которое также является определением объекта).

...