struct в C и class в C++
В этом уроке вы опишете банковский счёт с помощью struct в C и class в C++, чтобы увидеть разницу между подходами.
Введение
В C struct объединяет связанные данные, а функции для их обработки пишутся отдельно. В C++ class объединяет данные и функции-члены (member functions) в один тип и может скрыть данные через private, чтобы защитить целостность объекта.
Главное
- Определите условия, которые всегда должны выполняться (инварианты), прежде чем писать операции.
- Обрабатывайте случаи пустой и заполненной структуры и ошибки выделения памяти.
- Оценивайте вместе сложность и управление памятью для каждой операции.
Примеры кода на C и C++
#include <stdio.h>
typedef struct {
const char *owner;
double balance;
} Account;
void deposit(Account *account, double amount) {
if (amount > 0) {
account->balance += amount;
}
}
int main(void) {
Account account = {"Ada", 100.0};
deposit(&account, 25.0);
printf("%s: %.2f\n", account.owner, account.balance);
return 0;
}
Ada: 125.00
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
class Account {
std::string owner_;
double balance_;
public:
Account(std::string owner, double balance)
: owner_(std::move(owner)), balance_(balance) {}
void deposit(double amount) {
if (amount > 0) {
balance_ += amount;
}
}
void print() const {
std::cout << owner_ << ": " << std::fixed
<< std::setprecision(2) << balance_ << '\n';
}
};
int main() {
Account account("Ada", 100.0);
account.deposit(25.0);
account.print();
}
Ada: 125.00
Сравнение C и C++
В версии на C функция deposit получает указатель на struct Account и прибавляет сумму, только если она положительна, но любой код может изменить balance напрямую. В версии на C++ поле balance_ объявлено до public:, поэтому по умолчанию оно private и меняется только через допустимые методы вроде deposit(). Так очень трудно получить неверное состояние, например произвольно выставленный баланс.
Данные (struct) и операции разделены, а память выделяется и освобождается вручную.
Классы и контейнеры защищают целостность данных и сами управляют своими ресурсами.
Упражнения для практики
Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.
- Добавьте тесты для пустого состояния и момента, когда достигнута максимальная ёмкость.
- Напишите освобождение памяти и убедитесь, что утечек нет.
- Сравните сложность с аналогичным контейнером стандартной библиотеки.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
Все задачи