Menu
Coddy logo textTech

Struct против Class

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 37 из 104.

В C++, struct и class почти идентичны. Both могут иметь переменные-члены, функции-члены, constructor и поддерживают inheritance. Единственное различие — их уровень доступа по умолчанию.

В class члены по умолчанию являются закрытыми. В struct члены по умолчанию являются открытыми:

struct Point {
    int x;    // public по умолчанию
    int y;    // public по умолчанию
};

class Circle {
    double radius;    // private по умолчанию
    
public:
    double getRadius() { return radius; }
};

Это также относится к inheritance. struct наследует публично по умолчанию, тогда как class наследует приватно:

struct DerivedStruct : Base {};    // публичное наследование
class DerivedClass : Base {};      // приватное наследование

Помимо этих значений по умолчанию, технических различий нет. Однако соглашения имеют значение.

Большинство программистов на C++ используют struct для простых контейнеров данных с общедоступными членами (например, для координаты или конфигурации), а class — когда важны инкапсуляция и поведение. Следование этому соглашению помогает другим разработчикам лучше понимать назначение вашего кода.

challenge icon

Задание

Легко

Давайте создадим простую систему конфигурации, которая демонстрирует, когда следует использовать struct и когда class, исходя из соглашений C++. Вы создадите struct для простых данных, которые должны быть открыто доступны, и class для данных, которым нужны инкапсуляция и контролируемый access.

Вы создадите два файла, чтобы организовать свой код:

  • Config.h: Define и struct, и class, представляющие разные виды данных конфигурации.

    Сначала создайте struct с именем Dimensions: простой контейнер данных для ширины и высоты (обе имеют тип int). Поскольку у struct по умолчанию есть public-члены, к ним следует обращаться directly, без getter-ов. Include метод area(), который возвращает произведение ширины и высоты.

    Затем создайте class с именем AppConfig, который управляет настройками приложения с proper инкапсуляцией. Он должен хранить имя приложения (строку) и объект Dimensions для размера окна. Поскольку члены class по умолчанию являются private, вам потребуется явно сделать свой public interface доступным. Предоставьте:

    • Constructor, принимающий имя приложения, ширину и высоту
    • getter getAppName(), возвращающий имя
    • getter getWindowSize(), возвращающий Dimensions
    • Метод displayConfig(), который выводит: "App: <name>, Window: <width>x<height>, Area: <area>"
  • main.cpp: Продемонстрируйте разницу между использованием struct и class. Считайте из input имя приложения, ширину и высоту (три отдельные строки), затем:
    • Создайте struct Dimensions directly, используя значения ширины и высоты: обратитесь к его членам directly, чтобы вывести: "Direct struct access: <width> x <height>"
    • Создайте объект AppConfig со всеми тремя значениями
    • Вызовите displayConfig(), чтобы показать полную конфигурацию
    • Используйте getter, чтобы получить размеры окна, и выведите: "Via getter - Area: <area>"

Эта задача демонстрирует соглашение: используйте struct, когда у вас есть простые прозрачные данные (например, координаты или размеры), и используйте class, когда вы хотите контролировать access и добавлять поведение к своим данным.

Преобразуйте входные значения ширины и высоты из строк в целые числа с помощью std::stoi(). Не забудьте добавить header guards в файл заголовка.

Попробуйте сами

#include <iostream>
#include <string>
#include "Config.h"

using namespace std;

int main() {
    // Прочитать ввод
    string appName;
    string widthStr;
    string heightStr;
    
    getline(cin, appName);
    getline(cin, widthStr);
    getline(cin, heightStr);
    
    int width = stoi(widthStr);
    int height = stoi(heightStr);
    
    // TODO: Создайте структуру Dimensions с width и height
    // Access its members directly to print: "Direct struct access: <width> x <height>"
    
    // TODO: Создайте объект AppConfig с appName, width и height
    
    // TODO: Вызовите displayConfig() у объекта AppConfig
    
    // TODO: Use getWindowSize() getter to get dimensions and print: "Via getter - Area: <area>"
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C++