Являются ли исходные объекты класса С++ исходными?

Согласно Wikipedia:

Объект является первоклассным, если он:

  • может храниться в переменных и структурах данных
  • может быть передан как параметр подпрограмме
  • может быть возвращен в результате подпрограммы
  • может быть сконструирован во время выполнения
  • имеет внутреннюю идентичность (независимо от любого имени)

Кто-то однажды сказал мне, что raw указатели не являются объектами первого класса, в то время как интеллектуальные указатели, такие как std:: auto_ptr. Но для меня необработанный указатель (на объект или на функцию) в С++ мне кажется удовлетворительным, чтобы условия, указанные выше, квалифицировались как объект первого класса. Я что-то упускаю?

Ответ 1

Фактически оба - "Указатели - FCO" и "Указатели не являются FCO" - правильны. Мы должны принимать заявления в соответствующем контексте. (FCO - объект первого класса)

Когда мы говорим о "указателе" в С++, мы говорим о типе данных, в котором хранится адрес некоторых других данных. Теперь, будь то FCO или нет, в действительности зависит от того, как мы планируем его использовать. К сожалению, эта семантика использования не встроена для указателей в С++.

Если мы используем указатели, чтобы просто "указывать" на данные, он будет удовлетворять требованиям FCO. Однако, если мы используем указатель на "удержание" данных, его больше нельзя считать FCO, поскольку его семантика копирования и присваивания не работает. Такие "указатели на обработку ресурсов" (или более непосредственно называемые "сырыми указателями" ) представляют собой наш интерес к контексту исследования Smart Pointer. Это не FCO, а соответствующие Умные указатели. Напротив, простые указатели отслеживания будут по-прежнему соответствовать требованиям для FCO.

В следующем абзаце из книги "Современный дизайн С++" хорошо разъясняется точка.

Я цитирую главу "Умные указатели":

Объект со значениями семантики является объект, который вы можете скопировать и назначить к. Тип int является прекрасным примером объект первого класса. Вы можете создавать, копировать и изменять целочисленные значения свободно. Указатель, который вы используете для итерация в буфере также имеет значение семантика - вы ее инициализируете к началу буфера, и вы ударяете его, пока не дойдете до конца. По пути вы можете скопировать его значение другим переменным для временного Результаты.

С указателями, которые содержат значения выделено новым, однако, рассказом очень отличается. Как только вы написано

Виджет * p = новый виджет;      переменная p не только указывает на, но и владеет памятью выделен для объекта Widget. Эта потому что позже вы должны выпустить delete p, чтобы убедиться, что объект Widget уничтожен и его память освобождена. Если в строке после строки просто показал, что вы пишете

p = 0;//присваиваем что-то еще p      вы теряете право собственности на объект, на который указывалось p, и вы не имеют шансов на снова. У вас есть утечка ресурсов, и утечки ресурсов никогда не помогают.

Надеюсь, это прояснится.

Ответ 2

Определение в Википедии "первоклассное" неверно. На языке программирования сущность считается "первоклассной", если она не требует специальной обработки компилятором и может быть интерпретирована, понята, использована и т.д., Как и любой другой объект на этом языке. Указатели причин в С++ не являются объектами первого класса, так это то, что *p для указателя p не интерпретируется как просто вызов перегруженного оператора *, как это было бы для любого другого объекта; вместо этого компилятор должен обрабатывать p специально, основываясь на том, что это тип указателя. При передаче указателя или ссылки вы не можете просто передать какой-либо объект значения (и некоторые из этих объектов значений оказываются указателями), но вы на самом деле говорите, что это другой тип (тип указателя или ссылочный тип вместо тип значения), а его интерпретация/использование подчиняется его типу.

Хорошим примером языка, где все объекты являются первоклассными, является Python. В Python все связано с каким-то типом, его можно рассматривать как объект, он может иметь элементы, функции и т.д. В качестве крайнего примера даже функции на Python - это объекты, которые просто содержат код и могут быть вызываемыми; на самом деле, если вы попытаетесь вызвать функцию с помощью функции-члена __call__ (которая сродни перегрузке оператора() в С++ и какие другие не-функциональные объекты могут предоставить), обычная функция вернет в результате оболочку функции ( так что вам не нужно рассматривать функции как особый случай). Вы даже можете добавлять участников к таким функциям, как к другим объектам. Вот пример такой вещи:

>>> def f(x):
...     return x;
... 
>>> func = f;
>>> print f.__class__

>>> print f(5)
5
>>> print f.__call__(5)
5
>>> f.myOwnMember = "Hello world!"
>>> print f.myOwnMember
Hello world!

Я извиняюсь за Python на пост С++, но трудно объяснить концепцию без контраста.

Ответ 3

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

Если кто-то захочет добровольно помочь мне с некоторыми поисками через Google Scholar, я бы очень хотел, чтобы статья Wikipedia была исправлена. Я эксперт по предметным вопросам, но я также очень занят. Мне бы хотелось, чтобы с этим работал партнер.

Ответ 4

От wiki:

При вычислении объект первого класса (также стоимость, сущность и гражданин), в контекст конкретного язык программирования, является сущностью который может быть передан как параметр, возвращается из подпрограммы или присваивается переменной. 1 В информатика термин овеществление используется при обращении к процессу (техника, механизм) создания что-то первоклассное объект. [править]

Я включил всю запись в wiki-pedia для контекста. Согласно этому определению - объект, который может быть передан как параметр - указатель С++ будет объектом первого класса.

Дополнительные ссылки, поддерживающие аргумент: catalysoft wapedia

reification: обращение к процессу (технике, механизму) создания чего-то первоклассного объекта

Ответ 5

Как прокомментировал Майк, похоже, что есть немного путаницы со словом Object здесь. Кажется, что ваш друг смешивает объекты, как в "объектах первого класса", и "Объекты" как "экземпляры классов С++", две разные вещи, где объект слова используется для двух вещей, совершенно разных.

В объектно-ориентированном программировании слово Object используется, чтобы говорить о некоторой структуре данных, собирающей поля данных и методы для их манипулирования. С С++ вы определяете их в классах, получаете наследование и т.д.

С другой стороны, в выражении "объект первого класса" объект слова имеет гораздо более широкий смысл, не ограничиваясь объектами объектно-ориентированных языков. Целое число квалифицируется как объект первого класса, также указатель. Я считаю, что "Объекты" с другим значением на самом деле не квалифицируются как объекты первого класса в С++ (они выполняются на других языках программирования OO) из-за ограничений на них при передаче параметров (но вы можете передавать их по указателям или ссылкам, разница не так велик).

Тогда все действительно противоположно тому, что вы сказали другу: указатели являются объектами первого класса, но не являются экземплярами классов С++, интеллектуальные указатели являются экземплярами классов С++, но не являются объектами первого класса.