Jump to content
View in the app

A better way to browse. Learn more.

T.M.I IThub

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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


Зачем нам применять ООП в C

ООП дает следующие важные преимущества:

  • Модульность и инкапсуляция. Код структурируется вокруг объектов, а не процедур, что облегчает разделение ответственности и управление сложностью.

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

Упрощённая поддержка. В больших проектах изменения в одном объекте не требуют полномасштабной переработки остального кода.

Чёткие интерфейсы. Абстрагирование внутренних деталей объектов делает использование API понятным и безопасным.

Тем не менее, реализация ООП в C требует ручного управления памятью и структурой, а также дополнительных усилий для имитации механизмов, которые в других языках реализованы на уровне компилятора.


Основная идея: структура плюс функции

В традиционных объектно-ориентированных языках (например, Java или C++) класс содержит поля (состояние) и методы (поведение). В C аналог класса достигается через:

  • struct — описание набора данных, представляющего объект.

Функции, принимающие указатель на struct — имитация методов, которые работают с объектом

Указатели на функции в структуре — позволяют эмулировать полиморфизм и виртуальные методы.


Простой пример: объект «Point»

/* point.h */
#ifndef POINT_H
#define POINT_H

typedef struct Point Point;

/* Конструктор */
Point* Point_new(int x, int y);

/* «Методы» */
void Point_move(Point *self, int dx, int dy);
void Point_print(const Point *self);

/* Деструктор */
void Point_delete(Point *self);

#endif

/* point.c */
#include "point.h"
#include <stdlib.h>
#include <stdio.h>

struct Point {
    int x;
    int y;
};

Point* Point_new(int x, int y) {
    Point *p = malloc(sizeof(Point));
    if (p) {
        p->x = x;
        p->y = y;
    }
    return p;
}

void Point_move(Point *self, int dx, int dy) {
    if (self) {
        self->x += dx;
        self->y += dy;
    }
}

void Point_print(const Point *self) {
    if (self) {
        printf("Point at (%d, %d)\n", self->x, self->y);
    }
}

void Point_delete(Point *self) {
    free(self);
}

/* main.c */
#include "point.h"

int main(void) {
    Point *p = Point_new(10, 20);
    Point_print(p);
    Point_move(p, 5, -3);
    Point_print(p);
    Point_delete(p);
    return 0;
}

В этом примере структура Point представляет объект, а функции Point_move, Point_print работают как методы. Объект создаётся через конструктор, а затем использует «методы». Такой подход соответствует эмуляции классов в C.


Инкапсуляция и сокрытие данных

Хотя C не обладает уровнями доступа (private, public), инкапсуляцию можно приблизить с помощью неполных типов (opaque type): в заголовке объявляется только указатель на структуру, а сама структура определена в .c-файле. Это скрывает внутренние поля объекта от пользователя API.


Полиморфизм с помощью указателей на функции

Для поддержки поведения, похожего на виртуальные методы, объект может содержать указатели на функции:

typedef struct {
    void (*speak)(void *);
} Animal;

void dogSpeak(void *self) { printf("Woof\n"); }
void catSpeak(void *self) { printf("Meow\n"); }

int main(void) {
    Animal dog = { dogSpeak };
    Animal cat = { catSpeak };
    dog.speak(&dog);
    cat.speak(&cat);
}

Это позволяет разным объектам иметь разную реализацию поведения через динамическое связывание.


Наследование: структурное встраивание

Хотя прямого механизма наследования в C нет, его можно приблизить через встраивание структур:

typedef struct {
    int value;
} Base;

typedef struct {
    Base base;
    int extra;
} Derived;

Это позволяет обращаться к общей части как к «базовому классу». Такие техники широко используются в практике написания крупных библиотек на C (например, в Linux kernel).


Когда стоит и когда не стоит использовать ООП в C

Когда стоит

  • Пишете сложные библиотеки или драйверы, где нужно чёткое разделение ответственности.

Проект должен быть расширяемым и легко поддерживаемым в долгосрочной перспективе.

Вы хотите приблизить архитектуру к индустриальным стандартам, но обязаны использовать ANSI C.

Когда не стоит

  • Проект очень мал, и усложнение архитектуры не оправдано.

Требуется высокая производительность и минимальные накладные расходы.

Вы работаете в команде, где стандартные C++ механизмы ООП предпочтительнее и доступны.


Заключение

Объектно-ориентированное программирование в C возможно и полезно в задачах, где требуется структурирование больших систем и разделение интерфейса от реализации. Хотя язык не предоставляет встроенных механик классов, наследования и полиморфизма, эти свойства можно эффективно имитировать через структуры, указатели и хорошо продуманные API. Такой подход усиливает поддерживаемость, модульность и переиспользуемость кода в серьёзных проектах на С.

User Feedback

There are no reviews to display.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.