Что такое объект на С++?

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

Мой вопрос: не могли бы вы показать мне простой английский Что такое объект на С++ вне мира ООП? или, по крайней мере, указать мне, где я могу найти что-то хорошее, конкретное и простое для чтения об этом.

И, пожалуйста, оставьте комментарий. Это также является источником для изучения

Ответ 1

Стандарт C++11 довольно ясен:

1.8 Объектная модель С++ [ intro.object ]

Объект - это область хранения. [Примечание. Функция не является объектом, независимо от того, занимает она или нет хранилище так, как это делают объекты. - конечная нота]

Что это. Объект представляет собой кусок памяти, в котором данные могут быть сохранены.

Если вы думаете об этом OO или O bject O, то становится более понятным, когда вы понимаете, что в старые времена программы были организованы вокруг функций, которые воздействовали на объекты (или данные).

Термин "объект" был вокруг задолго до ориентации объекта.

Какова была ориентация на объект, это изменение организации программы от организации вокруг функций для организации вокруг самих данных - объектов.

Следовательно, термин ориентирован на объект.

Изменение парадигмы.

Здесь мы видим сдвиг парадигмы со старых дней:

struct my_object
{
    int i;
    char s[20];
};

void function(my_object* o)
{
    // function operates on the object (procedural / procedure oriented)
}

К тому, что у нас есть сейчас:

struct my_object
{
    void function()
    {
        // object operates on itself (Object Oriented)
    }

    int i;
    char s[20];
};

Ответ 2

Короткий ответ

От https://timsong-cpp.github.io/cppwp/n3337/intro.object

Объект - это область хранения.


Несколько более длинный ответ

В традиционных OOP и OOD объект используется для описания класса объектов несколько раз и экземпляра класса несколько раз.

В С++, class и struct представляют классы.

Объект в С++ может быть экземпляром class или struct, но также может быть экземпляром фундаментального типа.

Несколько простых примеров:

int i;

i - это объект. Он связан с областью хранения, которая может использоваться программой.

struct foo { int a; int b;};
foo f;

f также является объектом. Он также связан с областью хранения, которая может быть использована программой.

int* ptr = new int[200];

ptr - это указатель, который указывает на 200 объектов типа int. Эти объекты также связаны с областью хранения, которая может использоваться программой.

Ответ 3

Не для bash для существующих ответов, но у них отсутствует элемент (это, возможно, стандартный дефект).

Объект - это область хранения. [Примечание. Функция не является объектом, независимо от того, занимает она или нет хранилище так, как это делают объекты. - конечная нота]

Объект создается определением ([basic.def]), новым выражением ([expr.new]) или реализацией ([class.temporary]), когда это необходимо.

Свойства объекта определяются при создании объекта.

Объект - это область хранения, в которой происходило объединение. Фактически, большая часть времени "объект" относится к этому построенному объекту с его значением и состоянием, тогда как "хранилище" означает только память (или что-то еще), на котором оно записано.

Разница может быть простой:

// `s` names an object that has been constructed... somewhere.
// That storage will live exactly as long as necessary to back `s`
// as long as the object exists -- no need to worry about it.
std::string s = "hello";

// Using the object
std::cout << s << '\n';

Но вы также можете (хотя и очень редко полезно) отделить время жизни объекта от времени его хранения:

// `storage` points at a chunk of... storage.
// It hasn't been initialized, nor does it have a type.
void *storage = malloc(sizeof(std::string));

// Now we constructed an `std::string`:
// we have an actual object inhabiting the storage!
std::string *s = new (storage) std::string("hello");

// Using the object, through the pointer we have
std::cout << *s << '\n';    

// Now we destruct the object: it exists no more.
s->~basic_string();

// Now we destroy the storage.
free(storage);

Я должен подчеркнуть, что этот последний пример предназначен только для демонстрационных целей. Это техника, с которой вы, вероятно, не столкнетесь, и была выполнена здесь без каких-либо проверок ошибок. Не пытайтесь это дома:)

Теперь, как это относится к объекту ООП? Ну... совсем нет. "Объект" - очень общий термин, и основатели ООП просто решили использовать его, независимо.

Ответ 4

Ссылаясь на §1.8 стандарта С++ (N4618), объект:

  • занимает область хранения в течение своего периода строительства, через его время жизни и период ее разрушения;

  • имеет время жизни (для нетривиальных объектов он запускается, когда инициализация завершается и останавливается при запуске деструктора);

  • имеет продолжительность хранения (статическая, динамическая, потоковая или автоматическая)

  • имеет тип: тип объекта, который является уникальным (строгий псевдоним).

  • может иметь имя


О типе объекта

(В других ответах уже подробно указано значение продолжительности хранения.)

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

Для компилятора он ограничивает только ансамбль операции, который может быть применен к области хранения: методы, связанные с типом объекта (в этом случае тип определяется class или struct), и все функции, принимающие объект в качестве аргумента (видимые).

Для программиста тип также указывает, каковы будут последствия применения последовательности операций к объекту в течение его жизненного цикла. Тип содержит гораздо больше информации, чем может быть известно компилятору. Например, после проверки того, что размер объекта, an_obj типа std::vector<int> равен 0, программист знает, что an_obj.at(0) всегда будет бросать, компилятор может этого не делать.

Ответ 5

В мире С++ объект является экземпляром класса. Он ведет себя (методы/функции) определенным образом и имеет атрибуты (элементы данных), которые изображают его состояние.

Объект имеет время жизни. Он создается (через конструктор), он живет, и он умирает (через деструктор).

Класс похож на план, с помощью которого вы определяете поведение и атрибут объекта.