Какие спецификаторы методов в C++ ты знаешь?

«Какие спецификаторы методов в C++ ты знаешь?» — вопрос из категории ООП, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C++ методы могут иметь следующие спецификаторы, которые определяют их поведение и использование:

  • const — метод не изменяет состояние объекта (не модифицирует нестатические поля-члены). Позволяет вызывать метод для константных объектов.
    class Data {
        std::vector<int> values;
    public:
        // Константный метод доступа
        size_t size() const { return values.size(); }
    };
  • volatile — метод может быть вызван для volatile объекта. Используется редко, в основном при низкоуровневом программировании или работе с памятью, отображаемой на устройства.
  • static — метод принадлежит классу, а не конкретному экземпляру. Не имеет доступа к указателю this и может вызываться без создания объекта.
    class MathUtils {
    public:
        static double pi() { return 3.1415926535; }
    };
    // Вызов: double p = MathUtils::pi();
  • virtual — метод может быть переопределён в производных классах. Позволяет реализовать полиморфизм.
  • override (C++11) — явно указывает, что метод переопределяет виртуальный метод базового класса. Компилятор выдаст ошибку, если сигнатура не совпадает.
  • final (C++11) — запрещает дальнейшее переопределение метода в производных классах.
  • noexcept (C++11) — указывает, что метод не генерирует исключений. Это позволяет компилятору проводить дополнительные оптимизации.
    class Base {
    public:
        virtual void process() const = 0;
        virtual ~Base() noexcept = default;
    };
    class Derived : public Base {
    public:
        void process() const override final { /* логика */ } // final запрещает переопределение
    };