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