struct и class в C++: в чём разница и когда что использовать
Поисковый запрос «struct и class в C++ разница» популярен не случайно: новички часто думают, что struct — это «просто набор данных», а class — «настоящий объект». В C++ это не совсем так. Структуры и классы почти одинаковы по возможностям, но отличаются настройками доступа по умолчанию и стилем использования.
Главное отличие struct и class в C++
В C++ 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 уместен:
Когда использовать 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 BaseStruct {
void hello() {}
};
struct DerivedStruct : BaseStruct {
// public-наследование по умолчанию
};
class BaseClass {
public:
void hello() {}
};
class DerivedClass : BaseClass {
// private-наследование по умолчанию
};
Чтобы не создавать путаницу, лучше всегда писать тип наследования явно:
class Derived : public BaseClass {
// так понятнее для читающего код
};
Типичные ошибки новичков
Итог
Разница между struct и class в C++ технически небольшая: доступ по умолчанию и наследование по умолчанию. Но стилистически она важна. struct обычно говорит читателю: «это простые данные». class говорит: «у объекта есть поведение, ограничения и инкапсуляция».
Если вы хотите не просто запомнить синтаксис, а уверенно разобраться в классах, структурах, объектах и других основах языка, посмотрите курс «Программирование на C++ с Нуля до Гуру» — с практикой и понятным движением от простого к сложному.




