Необработанные объекты первого класса указателей C++?

Согласно Википедии:

Объект является первоклассным когда это:

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

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

8
задан alex 23 April 2010 в 00:12
поделиться

5 ответов

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

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

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

Следующий абзац из книги «Современный дизайн C ++» прекрасно поясняет эту мысль.

Я цитирую главу о смарт-указателях:

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

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

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

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

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

1
ответ дан 5 December 2019 в 20:14
поделиться

Определение в Википедии слова «первоклассный» неверно. В языке программирования объект считается «первоклассным», если он не требует специальной обработки компилятором и может быть интерпретирован, понят, использован и т. Д.точно так же, как любой другой объект на языке. Причина, по которой указатели в C ++ не являются объектами первого класса, состоит в том, что * p для указателя p не интерпретируется как простой вызов перегруженного оператора *, как это было бы для любого другого объекта; вместо этого компилятор должен обрабатывать p специально на основании того факта, что это тип указателя. При передаче указателя или ссылки вы не можете просто передать какой-либо объект значения (и некоторые из этих объектов значения оказываются указателями), но на самом деле вы говорите, что это другой тип (тип указателя или ссылочный тип вместо тип значения), и его интерпретация / использование зависит от его типа.

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

>>> 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 в сообщении на C ++, но трудно объяснить концепцию без контраста.

3
ответ дан 5 December 2019 в 20:14
поделиться

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

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

2
ответ дан 5 December 2019 в 20:14
поделиться

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

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

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

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

1
ответ дан 5 December 2019 в 20:14
поделиться

Из wiki :

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

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

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

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

1
ответ дан 5 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: