Современный C++ и альтернативы на C

Объектно-ориентированное программирование (ООП)

Изучите инкапсуляцию, наследование и полиморфизм в C++ в сравнении с явной реализацией на C.

Что такое объектно-ориентированное программирование в C++?

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

Четыре основных принципа ООП

  • Инкапсуляция защищает инварианты, управляя внутренним состоянием.
  • Абстракция предоставляет небольшой открытый интерфейс.
  • Наследование специализирует корректный контракт базового класса.
  • Полиморфизм выбирает поведение конкретного объекта виртуальным вызовом.

Представление в C и C++

C

C объединяет структуры и указатели на функции; соглашения и API поддерживают инварианты и владение.

C++

C++ использует закрытое состояние, наследование и override с проверкой компилятором.

Совет: Добавляйте виртуальный деструктор, избегайте владеющих сырых указателей и предпочитайте композицию.

Примеры кода на C и C++

C
Запустить →
main.c
#include <stdio.h>

typedef struct Account Account;
typedef void (*MonthEnd)(Account *account);

struct Account {
    const char *owner;
    double balance;
    double interest_rate;
    MonthEnd month_end;
};

void standard_month_end(Account *account) {
    (void)account;
}

void savings_month_end(Account *account) {
    account->balance *= 1.0 + account->interest_rate;
}

void print_account(Account *account) {
    account->month_end(account);
    printf("%s: %.2f\n", account->owner, account->balance);
}

int main(void) {
    Account accounts[] = {
        {"Ada", 150.0, 0.0, standard_month_end},
        {"Lin", 200.0, 0.05, savings_month_end}
    };

    for (int i = 0; i < 2; ++i) {
        print_account(&accounts[i]);
    }
    return 0;
}
Результат выполнения
Ada: 150.00
Lin: 210.00
C++
Запустить →
main.cpp
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

class Account {
    std::string owner_;
    double balance_;

protected:
    void add_balance(double amount) { balance_ += amount; }

public:
    Account(std::string owner, double balance)
        : owner_(std::move(owner)), balance_(balance) {}

    virtual ~Account() = default;
    virtual void month_end() {}

    const std::string& owner() const { return owner_; }
    double balance() const { return balance_; }
};

class SavingsAccount final : public Account {
    double interest_rate_;

public:
    SavingsAccount(std::string owner, double balance, double rate)
        : Account(std::move(owner), balance), interest_rate_(rate) {}

    void month_end() override {
        add_balance(balance() * interest_rate_);
    }
};

int main() {
    Account standard("Ada", 150.0);
    SavingsAccount savings("Lin", 200.0, 0.05);
    std::vector<Account *> accounts{&standard, &savings};

    std::cout << std::fixed << std::setprecision(2);
    for (Account *account : accounts) {
        account->month_end();
        std::cout << account->owner() << ": "
                  << account->balance() << '\n';
    }
}
Результат выполнения
Ada: 150.00
Lin: 210.00

Сравнение C и C++

В C структура хранит состояние и указатель на функцию. В C++ баланс закрыт, общий интерфейс наследуется, а виртуальный метод переопределяется. Клиенту не нужно проверять конкретный тип.

C

C использует соглашения об именах, обратные вызовы, макросы и struct с контекстом.

C++

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

Упражнения для практики

Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.

  • Сначала напишите механизм на C, а затем используйте аналогичную возможность C++.
  • Замените ручное освобождение ресурсов на RAII.
  • Проверьте, не вызывает ли эта возможность выделение памяти или вызовы виртуальных функций.

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи