struct и class в C++: в чём разница и когда что использовать
Поисковый запрос «struct и class в C++ разница» популярен не случайно: новички часто думают, что struct — это «просто набор данных», а class — «настоящий объект». В C++ это не совсем так. Структуры и классы почти одинаковы по возможностям, но отличаются настройками доступа по умолчанию и стилем использования.
Главное отличие struct и class в C++
В C++ struct и class отличаются двумя правилами по умолчанию:
- у struct поля и методы по умолчанию public;
- у class поля и методы по умолчанию private;
- при наследовании struct наследуется публично по умолчанию;
- при наследовании class наследуется приватно по умолчанию.
Во всём остальном они очень похожи: и там, и там можно объявлять методы, конструкторы, деструкторы, операторы, статические поля и использовать наследование.
#include <iostream>
#include <string>
struct UserStruct {
std::string name; // public по умолчанию
int age;
};
class UserClass {
std::string name; // private по умолчанию
int age;
};
int main() {
UserStruct user;
user.name = "Alex";
user.age = 25;
std::cout << user.name << " " << user.age << std::endl;
// UserClass user2;
// user2.name = "Bob"; // ошибка: поле private
}
Если в class нужно открыть доступ к полям или методам, надо явно написать public:.
#include <iostream>
#include <string>
class User {
public:
std::string name;
int age;
};
int main() {
User user;
user.name = "Maria";
user.age = 30;
std::cout << user.name << std::endl;
}
Можно ли в struct писать методы?
Да. В C++ структура может иметь методы точно так же, как класс. Это важное отличие от языка C, где struct действительно является только набором полей.
#include <iostream>
#include <string>
struct Point {
int x;
int y;
void print() const {
std::cout << "(" << x << ", " << y << ")" << std::endl;
}
};
int main() {
Point p{10, 20};
p.print();
}
Такой код абсолютно нормален. Если структура представляет простую сущность вроде точки, размера, цвета, координат или настроек, метод внутри struct часто делает код удобнее.
Когда использовать struct
Обычно struct используют для простых типов данных, где поля можно безопасно читать и менять напрямую. Хороший признак: объект не требует сложной проверки состояния.
struct Size {
int width;
int height;
};
struct Color {
int red;
int green;
int blue;
};
Примеры, где struct уместен:
- координаты: Point, Vector2D;
- размеры: Size, Rectangle;
- простые настройки: Config, Options;
- результаты вычислений: ParseResult, SearchResult.
Когда использовать class
class лучше выбирать, когда объект должен защищать свои данные и поддерживать корректное внутреннее состояние. Например, банковский счёт не должен позволять установить отрицательный баланс прямым присваиванием.
#include <iostream>
#include <stdexcept>
class BankAccount {
private:
double balance = 0.0;
public:
void deposit(double amount) {
if (amount <= 0) {
throw std::invalid_argument("Amount must be positive");
}
balance += amount;
}
bool withdraw(double amount) {
if (amount <= 0 || amount > balance) {
return false;
}
balance -= amount;
return true;
}
double getBalance() const {
return balance;
}
};
int main() {
BankAccount account;
account.deposit(1000);
account.withdraw(250);
std::cout << account.getBalance() << std::endl;
}
Здесь balance скрыт, а изменить его можно только через методы с проверками. Это и есть инкапсуляция: объект сам контролирует свои данные.
Практическое правило выбора
Можно запомнить простое правило:
- используйте struct, если тип в основном хранит данные и не имеет сложных правил;
- используйте class, если нужно скрыть детали реализации и контролировать изменение состояния;
- не бойтесь методов в struct, если они делают работу с данными удобнее;
- не делайте все поля public в классе просто ради быстроты — это часто приводит к ошибкам.
Наследование: ещё одно отличие по умолчанию
При наследовании разница тоже связана с доступом по умолчанию.
struct BaseStruct {
void hello() {}
};
struct DerivedStruct : BaseStruct {
// public-наследование по умолчанию
};
class BaseClass {
public:
void hello() {}
};
class DerivedClass : BaseClass {
// private-наследование по умолчанию
};
Чтобы не создавать путаницу, лучше всегда писать тип наследования явно:
class Derived : public BaseClass {
// так понятнее для читающего код
};
Типичные ошибки новичков
- Думать, что struct не может иметь методы. В C++ может.
- Забывать точку с запятой после объявления типа. После закрывающей фигурной скобки нужна ;.
- Открывать все поля класса. Если у объекта есть правила, поля лучше скрывать.
- Использовать get/set для всего подряд. Иногда простая структура с публичными полями читается лучше.
Итог
Разница между struct и class в C++ технически небольшая: доступ по умолчанию и наследование по умолчанию. Но стилистически она важна. struct обычно говорит читателю: «это простые данные». class говорит: «у объекта есть поведение, ограничения и инкапсуляция».
Если вы хотите не просто запомнить синтаксис, а уверенно разобраться в классах, структурах, объектах и других основах языка, посмотрите курс «Программирование на C++ с Нуля до Гуру» — с практикой и понятным движением от простого к сложному.
-
Создано 17.08.2026 17:00:31
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.