2013-04-11 7 views
5

Помогите мне понять это. Если я рассмотрю все стандарты C++, в том числе C++ 11, правильно сказать, что единственный объект , с которым я могу иметь дело, является экземпляром класса?В C++ «экземпляр класса» является единственным типом объекта?

Что касается других игроков, таких как лямбды? экземпляр POD считается объектом?

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

+0

'int x;' является 'x' экземпляром класса? – Pubby

+0

@Pubby, но мой вопрос: что такое объект? Какое определение существует для этого слова в мире программирования и каковы последствия в определениях C++? Для того, что я знаю, int - это тип из std :: int, поэтому он является классом, поэтому x в этом случае является меткой для объекта, но я еще не определил, что такое объект. – user2269624

+1

Существует не такой класс, как 'std :: int'. –

ответ

8

Если я рассматриваю все стандарты C++, включая C++ 11, правильно сказать, что единственным объектом, с которым я могу иметь дело, является экземпляр класса?

No, это неверно.

В C++ термин «объект» относится к области хранения, которой задана конкретная интерпретация в соответствии со свойствами (такими как ее тип), которые передаются объекту.

в соответствии с пунктом 1.8/1 C++ 11 Стандарт на:

конструктов в программе C++ создавать, уничтожать, см, доступ и манипулировать объектами. Объект регион хранения. [Примечание. Функция не является объектом, независимо от того, занимает она или нет хранилище в способе, который делают объекты . -end note] Объект создается определением (3.1), новым выражением (5.3.4) или реализацией (12.2), когда это необходимо. Свойства объекта определяются при создании объекта . Объект может иметь имя (раздел 3). Объект имеет продолжительность хранения (3.7), что влияет на его время жизни (3.8). Объект имеет тип (3.9). Термин тип объекта относится к типу, с которым создается объект . Некоторые объекты являются полиморфными (10.3); реализация генерирует информацию, связанную с , каждый такой объект, который позволяет определять тип этого объекта во время выполнения программы. Для других объектов интерпретация найденных в них значений определяется типом выражений (раздел 5) , используемых для доступа к ним.

Так основном int является объектом, экземпляром POD является объектом, и, конечно, является экземпляром класса типа является объектом. В ООП термин «объект» обычно означает только последний объект, но в C++ это не так.

что касается других игроков, таких как лямбды?

Лямбда фактически синтаксический сахар для определения неназванных функторов (пункт 5.1.2/1):

лямбда-выражения создают лаконичный способ для создания простых объектов функций. [...]

Также (в пункте 5.1.2/2):

Оценка выражения лямбда приводит к временному присвоению (12.2). Это временное название закрытие объект. [...] [Примечание: Объект закрытия ведет себя как объект функции (20.8). - конец примечание]

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

+0

Я не понимаю, почему факт _temporary_ так важен, если определение заключается в сохранении состояния, почему факт, который является временным, имеет значение, я имею в виду, что что-либо в коде на C++ имеет всю жизнь, тот факт, что что-то предлагает более короткий срок службы для данных, которые так уместны? так почему лямбды не являются объектами? – user2269624

+0

@ user2269624: Временный объект. Вот что должен был подчеркнуть смелый шрифт. Но да, тот факт, что лямбда-выражения оценивают объекты, изложено еще позже в том же параграфе, поэтому, я думаю, я могу удалить акцент –

2

в C++ с объекта это область хранения с соответствующим типом

например, int

область нуждается не обязательно должны быть смежными

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

2

Традиционный ООП имеет тенденцию определять понятие «объект» как «полиморфный объект», который несет методы и данные и может ссылаться на другие объекты на алгоритмы.

Определение объекта на С ++ - в сущности - «любая вещь занимает пространство, чтобы сохранить состояние». Это приводит к основному отличию в том, что «объекты» C++ имеют «поведение ценности» и что «методы» не обязательно являются членами, а объекту необязательно нужно поддерживать полиморфизм во время выполнения.

Программа C++, соответствующая традиционному определению ООП, заканчивается классами, на которые ссылаются (умные) - (базовые) - (указатели | ссылки), используя механизм косвенности в качестве ключа для разрешения полиморфизма во время выполнения.

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

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

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

Так говорят, что они объекты неприлично: a+b это не сам объект: он производит объект (результат выражения).То же самое для [](){}: он сам не является объектом: он производит объект, вы можете даже магазин, как в

auto fn = [](){}; //create a lambda and assign to fn. 
fn();    //just calls it 

типа п-то вроде

class lambda_uniquename 
{ 
public: 
    void operator()() 
    {} 
}; 

объект, здесь, не является классом lambda, но переменная fn.

Смежные вопросы