<MyRusakov.ru />

Создание игр на Unreal Engine 5

Создание игр на Unreal Engine 5

Данный курс научит Вас созданию игр на Unreal Engine 5. Курс состоит из 12 модулей, в которых Вы с нуля освоите этот движок и сможете создавать самые разные игры.

В курсе Вы получите всю необходимую теоретическую часть, а также увидите массу практических примеров. Дополнительно, почти к каждому уроку идут упражнения для закрепления материала.

Помимо самого курса Вас ждёт ещё 8 бесплатных ценных Бонусов: «Chaos Destruction», «Разработка 2D-игры», «Динамическая смена дня и ночи», «Создание динамической погоды», «Создание искусственного интеллекта для NPC», «Создание игры под мобильные устройства», «Создание прототипа RPG с открытым миром» и и весь курс «Создание игр на Unreal Engine 4» (актуальный и в 5-й версии), включающий в себя ещё десятки часов видеоуроков.

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

static в C++: статические переменные, функции и члены класса простыми словами

static в C++: статические переменные, функции и члены класса простыми словами

static в C++ — одно из тех ключевых слов, которое встречается рано, но долго остаётся «туманным». Оно может менять время жизни переменной, ограничивать видимость функции или делать поле общим для всех объектов класса. В этой статье разберём основные варианты использования static в C++ простыми словами и с практическими примерами.

1. Что означает static в C++

Ключевое слово static в C++ используется в нескольких контекстах. Самые важные для новичка:

  • статическая локальная переменная внутри функции;
  • статическая глобальная переменная или функция в файле;
  • статическое поле класса, общее для всех объектов;
  • статический метод класса, который можно вызвать без создания объекта.

Главная идея: static часто означает, что сущность живёт дольше обычной локальной переменной или принадлежит не конкретному объекту, а более широкому контексту.

2. Статическая локальная переменная

Обычная локальная переменная создаётся при входе в функцию и уничтожается при выходе. Статическая локальная переменная создаётся один раз и сохраняет значение между вызовами функции.

#include <iostream>

void counter() {
    static int count = 0;
    ++count;
    std::cout << "Вызов номер: " << count << '\n';
}

int main() {
    counter();
    counter();
    counter();
}

Вывод будет таким:

Вызов номер: 1
Вызов номер: 2
Вызов номер: 3

Переменная count инициализируется только при первом вызове counter(). После выхода из функции она не исчезает, а хранит последнее значение.

Когда это полезно

  • подсчёт количества вызовов функции;
  • ленивая инициализация ресурса;
  • сохранение внутреннего состояния без глобальной переменной.

Но не злоупотребляйте: функция со скрытым состоянием может быть сложнее для тестирования и отладки.

3. static на уровне файла: ограничение видимости

Если объявить глобальную переменную или функцию как static вне класса и функции, она будет доступна только внутри текущего файла .cpp.

// logger.cpp
#include <iostream>

static int logCount = 0;

static void printPrefix() {
    std::cout << "[LOG] ";
}

void logMessage(const std::string& message) {
    ++logCount;
    printPrefix();
    std::cout << message << '\n';
}

Здесь logCount и printPrefix() не будут видны из других файлов проекта. Это помогает избежать конфликтов имён.

Современная рекомендация: в новом C++ для ограничения видимости часто используют анонимное пространство имён:

namespace {
    int logCount = 0;

    void printPrefix() {
        std::cout << "[LOG] ";
    }
}

Оба подхода встречаются в реальном коде, поэтому важно понимать и static, и анонимные пространства имён.

4. Статическое поле класса

Обычное поле принадлежит конкретному объекту. Статическое поле принадлежит классу в целом и является общим для всех объектов.

#include <iostream>

class User {
public:
    User() {
        ++count;
    }

    ~User() {
        --count;
    }

    static int count;
};

int User::count = 0;

int main() {
    User a;
    User b;

    std::cout << "Пользователей: " << User::count << '\n';
}

Обратите внимание на строку:

int User::count = 0;

В классической форме C++ статическое поле нужно не только объявить внутри класса, но и определить снаружи. Начиная с C++17 можно использовать inline static и писать короче:

class User {
public:
    inline static int count = 0;
};

5. Статический метод класса

Статический метод вызывается без объекта. Он не имеет доступа к this, поэтому не может напрямую обращаться к обычным полям объекта.

#include <iostream>

class MathUtils {
public:
    static int square(int x) {
        return x * x;
    }
};

int main() {
    std::cout << MathUtils::square(5) << '\n';
}

Такой подход удобен для вспомогательных функций, которые логически относятся к классу, но не требуют состояния конкретного объекта.

6. Частая ошибка: попытка обратиться к обычному полю

Новички часто пишут так:

class Player {
private:
    int score = 0;

public:
    static void printScore() {
        // Ошибка: у static-метода нет this
        // std::cout << score;
    }
};

Статический метод не знает, score какого именно игрока нужно вывести. Правильный вариант — передать объект параметром или сделать метод обычным.

class Player {
private:
    int score = 0;

public:
    void printScore() const {
        std::cout << score << '\n';
    }
};

7. Практический пример: генератор ID

Один из понятных сценариев для static в C++ — выдача уникальных идентификаторов объектам.

#include <iostream>
#include <string>

class Product {
private:
    inline static int nextId = 1;

    int id;
    std::string name;

public:
    Product(std::string productName)
        : id(nextId++), name(std::move(productName)) {}

    void print() const {
        std::cout << "#" << id << " " << name << '\n';
    }
};

int main() {
    Product laptop("Laptop");
    Product phone("Phone");

    laptop.print();
    phone.print();
}

Поле nextId общее для всех товаров, а id у каждого объекта свой.

8. Советы по использованию static

  • Используйте static осознанно. Скрытое состояние усложняет понимание программы.
  • Не заменяйте static глобальными переменными без необходимости. Глобальное состояние часто приводит к трудноуловимым ошибкам.
  • Для констант внутри класса используйте inline static constexpr, если доступен C++17 и новее.
  • Помните про многопоточность. Общие статические данные могут требовать синхронизации.
class Settings {
public:
    inline static constexpr int maxUsers = 100;
};

Краткий итог

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

Если вы хотите не просто запомнить отдельные правила, а выстроить цельное понимание языка, посмотрите курс «C++ с нуля до уверенного уровня: практика, задачи и понятные объяснения». Он поможет системно пройти путь от базового синтаксиса до уверенного написания программ.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

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