Есть ли операторы new, new[], delete, delete[] - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть ли операторы new, new[], delete, delete[] в Си? И, если есть, чем они отличаются? Тихо подозреваю, что их не было, ведь new пораждает исключения, но всё же.

Решение задачи: «Есть ли операторы new, new[], delete, delete[]»

textual
Листинг программы
// конструкторы-деструкторы
object_t* create_object(void);
void init_object(object*);
void destroy_object(object_t*);
 
// методы
void do_something(object_t *this);
 
// виртуальные функции
typedef struct object_ {
    struct {
        void (*print)(struct object_ *this, FILE *stream);
    } methods;
} object_t;
 
object_t foo;
foo->methods->print(foo, stdout);
// (в С11 наконец сделали анонимные структуры и можно methods не писать)
 
// инкапсуляция держится на честном слове, как в Питоне
// мы все тут взрослые и знаем, куда лазить не надо
 
// наследование как наследование внутреннего состояния
// overrated, но при необходимости можно и его наворотить
struct base {
    struct { /* ... */ } methods;
    int a, b, c;
};
 
struct derived {
    struct base parent;
    int d;
};
 
struct derived *d = ...;
struct base *b = (struct base*)d; // и добраться до полей base можно

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

В представленном коде:

  1. 1 Объявлены функции create_object, init_object и destroy_object. Эти функции занимаются созданием, инициализацией и уничтожением объектов типа object_t. Предполагается, что объект нужно уничтожать, когда он больше не нужен, и инициализировать перед использованием.
  2. 2 Объявлена функция do_something. Она выполняет некоторое действие с объектом.
  3. 3 Объявлен тип object_t. Это структура, которая содержит указатель на функцию print и, возможно, другие данные.
  4. 4 Объявлен объект foo типа object_t.
  5. 5 Вызывается функция foo->methods->print(foo, stdout);. Это вызывает функцию print для объекта foo, записывая результат в стандартный вывод.
  6. 6 Объявлены структуры base и derived. Структура base содержит поля a, b и c, а также указатель на функцию print. Структура derived наследует поля и функции структуры base.
  7. 7 Объявлен указатель d на объект типа derived.
  8. 8 Выполняется операция приведения типа d к base* с целью получить доступ к полям и функциям структуры base через указатель d. Аналогично, можно добраться до полей base через указатель b.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5