Top.Mail.Ru
Ответы

Что такое Объект с точки зрения ООП?

Говорят что в Си нет объекта, а в C++, Java есть.
Но когда они об этого пишут они приводят пример собаку

class Dog{
public int year;
public int weight;
private boolean sleep{
}
}


Но в Си же тоже можно так делать.
Почему:

typedef struct Dog{
int year;
int weight;
bool sleep{
}
}

Почему в одном случае он объект, а вдругом неОбъект? Это такая же Абстракция. Которая может реализовать наследовние и вроде как полиморфизм (по крайне мере так говорят).

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок

Структура в C - это только данные. А объект в страуступовском ООП - объединение в один компонент и данных, и кода, который эти данные обрабатывает.

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

Но даже если в С нет ООП, ничего не мешает его использовать. Добавим в структуру поля - указатели на функции. И получим имитацию виртуальных функций, прекрасно реализующую полиморфизм. Именно такой подход использовался в те времена, когда C++ ещё не было.

Собственно, только полиморфизм в ООП и важен. И всё, что делает ООП - упрощает использование полиморфизма на уровне базовых конструкция языка программирования.

Наследование? - оно создаёт куда больше геморроя, чем решает проблем. Композиция обеспечивает не меньшую гибкость без проблем, создаваемых длинными цепочками наследования.

Инкапсуляция? - достаточно просто не лезть напрямую к полям структур. Тот же JavaScript много лет прекрасно обходился без инкапсуляции. В программировании добровольных соглашений, которых должны придерживаться разработчики, не меньше, чем правил языка программирования. Ну так введём ещё одно такое соглашение.

Аватар пользователя
Гений

>Что такое Объект с точки зрения ООП?
Экземпляр класса
>Говорят что в Си нет объекта
Гонят, есть. Равно как ООП. Даже больше - практически весь код на чистом Си написанный профессиональными программистами является объектно-ориентированным.
>Но в Си же тоже можно так делать.
Нельзя

typedef struct Dog{
int year;
int weight;
bool sleep{} // Здесь будет ошибка компиляции. И что здесь вообще подразумевалось?
// метод вида bool sleep() {...} ? Его тоже нельзя вставить
}

В сишных структурах не могут содержаться функции, но могут содержаться указатели на функции. Если же компилировать в режиме c++, то все структуры в плюсах превратятся в классы и туда можно будет засовывать и функции/методы.

В Си нет встроенной поддержки наследования и полиморфизма. Они могут быть без проблем реализованы, первые компиляторы c++ компилировали исходник в другой исходник на языке си, который уже компилировался в машинный как обычно.

Поддержку можно реализовывать руками, но не нужно - ООП может вполне существовать без наследования и полиморфизма, а инкапсуляция в Си проводится не на уровне структуры, а на уровне модуля (пары файлов .h и .c).

Аватар пользователя
Искусственный Интеллект

Объектоподобность реализуется через структуры и указатели. А ООП — это более высокий уровень абстракций.

Структура задается примерно так:

1234567891011121314151617181920212223
 #include <stdio.h> 
#include <stdbool.h> 
 
typedef struct { 
    int year; 
    int weight; 
    bool sleep; 
} Dog; 
 
 
int main() { 
    Dog my_dog; 
    my_dog.year = 5; 
    my_dog.weight = 15; 
    my_dog.sleep = 1; 
 
    printf("Year: %d\n", my_dog.year); 
    printf("Weight: %d\n", my_dog.weight); 
    printf("Sleeping: %s\n", my_dog.sleep ? "Yes" : "No"); 
 
    return 0; 
} 
 
Аватар пользователя
Искусственный Интеллект

>Что такое Объект с точки зрения ООП?
Объект реального мира, выраженный через его свойства и поведение.

>Почему в одном случае он объект, а вдругом неОбъект?
А ты попробуй унаследовать что-нибудь в С или изменить поведение предка - сразу ощутишь разницу.

Аватар пользователя
Мыслитель

в СИ нет функций и наследование