Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 3-4n.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
74.69 Кб
Скачать

Int main () {

// Как получить доступ к Anything::s_value здесь, если s_value //является private?

}

В этом случае мы не можем напрямую получить доступ к Anything::s_value из функции main (), так как этот член является private.

Обычно, доступ к закрытым членам класса осуществляется через public-методы.

Хотя мы могли бы создать обычный метод для получения доступа к s_value, но нам тогда пришлось бы создавать объект этого класса для использования метода!

Есть вариант получше: мы можем сделать метод статическим.

Подобно статическим переменным-членам, статические методы не привязаны к какому-либо одному объекту класса.

Вот вышеприведенный пример, но уже со статическим методом:

class Anything {

private:

static int s_value;

public:

static int getValue () {return s_value;} // статический метод

};

int Anything::s_value = 3; // определение статической переменной-

//члена класса

Int main () {

std::cout << Anything::getValue() << '\n';

}

Поскольку статические методы не привязаны к определенному объекту, то их можно вызывать напрямую через имя класса и оператор разрешения области видимости, а также через объекты класса (но это не рекомендуется).

Статические методы не имеют указателя this

У статических методов есть две интересные особенности.

Во-первых, поскольку статические методы не привязаны к объекту, то они не имеют скрытого указателя this!

Здесь есть смысл, так как указатель this всегда указывает на объект, с которым работает метод. Статические методы могут не работать через объект, поэтому и указатель this не нужен.

Во-вторых, статические методы могут напрямую обращаться к другим статическим членам (переменным или функциям), но не могут напрямую обращаться к нестатическим членам.

Это связано с тем, что нестатические члены принадлежат объекту класса, а статические методы — нет!

Еще один пример

Статические методы можно определять вне тела класса. Это работает так же, как и с обычными методами. Например:

#include <iostream>

class IDGenerator {

private:

static int s_nextID; // объявление статической переменной-члена

public:

static int getNextID(); // объявление статического метода

};

// Определение статической переменной-члена находится вне тела //класса. Обратите внимание, мы не используем здесь ключевое слово //static.

// Начинаем генерировать ID с 1

int IDGenerator::s_nextID = 1;

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

int IDGenerator::getNextID() { return s_nextID++; }

Int main () {

for (int count=0; count < 4; ++count)

std::cout << "The next ID is: " << IDGenerator::getNextID() << '\n';

return 0;

}

Результат выполнения программы:

The next ID is: 1

The next ID is: 2

The next ID is: 3

The next ID is: 4

Обратите внимание, поскольку все переменные и функции этого класса являются статическими, то нам не нужно создавать объект этого класса для работы с ним!

Статическая переменная-член используется для хранения значения следующего идентификатора, который должен быть ей присвоен, а статический метод — для возврата идентификатора и его увеличения.