Какое из этих утверждений об объектах является правдой? - PullRequest
6 голосов
/ 20 января 2010

Учитывая это:

struct { int x; } ix;

struct A { A() {}; int x; };
A ia;

Что из этого верно?

a. ix is an object
b. ia is an object
c. both are objects
d. both are not objects.

Ответы [ 9 ]

10 голосов
/ 20 января 2010

Многие из этих ответов игнорировали тег C ++. В C ++ «объект является областью хранения. [Примечание: функция не является объектом, независимо от того, занимает ли она память так же, как объекты.]» (Стандарт C ++, 1.8 / 1).

Если вопрос о домашнем задании касается C ++, тогда никакое другое определение объекта неприменимо, даже «что-либо видимое или материальное и относительно стабильное по форме» (dictionary.reference.com). Он не спрашивает ваше мнение о принципах ООП, а фактически спрашивает, являются ли ix и ia переменными.

Поскольку это домашнее задание, я не скажу вам ответ, но учтите, что struct { int x; } ix; - это , а не - то же самое, что и struct ix { int x; };.

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

3 голосов
/ 20 января 2010

Учитывая тег C++, ответ в значительной степени "сделай свой выбор".

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

В Smalltalk (скорее наоборот) ответом будет то, что ни один из них не является объектом - объект никогда не имеет общедоступных данных. Его поведение полностью определяется с точки зрения ответов на сообщения.

1 голос
/ 20 января 2010

Существует два обычно используемых определения «объекта» в C ++.

Одно является официальным в соответствии со стандартом C ++ и говорит, что все, для чего выделено хранилище, является объектом.Структура - это объект, int - это объект, bool - это объект, указатель - это объект, строковый литерал - это объект и т. Д.По этому определению ix, ia и x являются объектами.Но это, вероятно, не то, что имел в виду ваш учитель.Вы должны быть немного языковым адвокатом, чтобы использовать это определение, и оно не так широко известно среди "средних" пользователей C ++.Это также не очень уместное определение для кого-то, кто только изучает язык.

Определение, которое вы вероятно ожидаете использовать, это определение "объекта" в объектно-ориентированном смысле.Здесь (по крайней мере, в семействе языков C ++) объект обычно является экземпляром класса.

Что оставляет следующий очевидный вопрос: является ли экземпляр структуры также объектом?Зависит.В C ++ класс и структура по сути одинаковы, так что семантически, да, но технически вы не используете ключевое слово class, поэтому синтаксически, вероятно, нет.

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

1 голос
/ 20 января 2010

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

В этом случае, если объявления сделаны в области имен, объявление ix недопустимо.Недопустимо использовать безымянный тип класса (у которого нет связи) для объявления объекта с внешней связью.Объявление ix будет работать в локальной области действия

void foo() {
  struct { int x; } ix; // OK, no linkage
}

Это также может работать, если ix было объявлено с внутренней связью в области имен

static struct { int x; } ix; // OK? Internal linkage?

, хотя я лично считаю, чтоэто также должно было быть неправильно сформировано (Comeau каким-то образом это позволяет).

Но объявление области пространства имен с внешней связью некорректно

// In namespace scope
struct { int x; } ix; // ERROR

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

В противном случае, если ix объявлено без связи (локальной) или с внутренней связью, тогда ix является объектом.

Что касается ia,это объект независимо от того, где он объявлен, поскольку тип класса с именем .

Обратите внимание, что понятие object в C ++ не имеет ничего общего склассы.Объект в C ++ является областью хранения (памяти).Переменная типа int - это объект в C ++, например.

Добавлено позже: Немного о легальности объявления ix - интересная проблема.Очевидно, C ++ 98 допускал такие декларации, что было предложено объявить вне закона в DR # 132 .Однако позже предложение было отклонено (по довольно странной причине), и все осталось как есть.Тем не менее, Comeau Online отказывается принять объявление объекта с внешней связью безымянного типа (внутренняя связь в порядке).Вполне возможно, что это может быть формальная ошибка в компиляторе Comeau (не то, чтобы я жаловался на это).

Добавлено даже позже: О, я вижу, что есть даже позже DR # 389 , который в конечном итоге запрещает такие заявления, но статус этого DR по-прежнему CD1.

1 голос
/ 20 января 2010

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

Ни ix, ни ia не имеют всех трех; ix терпит неудачу, потому что ему не хватает идентичности или поведения, а ia терпит неудачу, потому что у него нет поведения. Обе они, по сути, просто сгустки данных.

0 голосов
/ 20 января 2010

Реальный ответ: «д. Кто бы ни писал подобный код, его нужно тренировать, чтобы улучшить их читаемость».Хорошо, это была шутка.

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

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

И не пишите код только для того, чтобы он работал.Это не достаточно высокий стандарт.Будет запущен худший мусор в мире, но это кошмар, чтобы исправить или обновить.

0 голосов
/ 20 января 2010

Объект является экземпляром типа (будь то POD или класс).

Таким образом, вы можете извлечь адрес объекта. Все объекты занимают как минимум один байт. Причина этого заключается в том, что вам не нужно добавлять специальный код для обработки объектов нулевого размера, потому что каждый объект в памяти имеет адрес назначения (при создании всего по крайней мере одного байта компилятор автоматически получит уникальный адрес для каждого объекта).

int main()
{
    struct { int x; } ix; 

    struct A { A() {}; int x; }; 
    A ia;

    ix.x = 5; // Assigned a value.
              // Thus it has state and thus is an object.

    ia.x = 6; // Assigned a value.
}

Итак, они оба объекты.

0 голосов
/ 20 января 2010

Технически, объект является экземпляром класса, но истинная полезность объектов заключается в их способности инкапсулировать информацию и помогать в проектировании систем. Они являются инструментом анализа.

0 голосов
/ 20 января 2010

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

Вы можете ударить по мячу, вы можете вторгнуться в страну, и вы можете есть, доить или бить корову.Следовательно, это объекты.

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

Я понимаю, что это определение может не работать в 100% случаев, но оно достаточно близко для моих нужд.

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