- •Классы и заголовочные файлы Отделение объявления от реализации
- •Int m_month;
- •Int m_year;
- •Int getValue () { return m_value ; }
- •Int getValue () {return m_value;}
- •Классы и заголовочные файлы
- •Int getDay () {return m_day;}
- •Void Date::SetDate (int day, int month, int year) {
- •Параметры по умолчанию
- •Библиотеки
- •Заключение
- •Классы и const
- •Константные объекты классов
- •Int m_value;
- •Int getValue () { return m_value ; }
- •Int main () {
- •Константные методы классов
- •Int m_value;
- •Int m_value;
- •Int m_value;
- •Константные ссылки и классы
- •Int getDay () {return m_day;}
- •Void printDate (const Date &date) {
- •Int main () {
- •Int m_month;
- •Int m_year;
- •Void setDate (int day, int month, int year) {
- •Перегрузка константных и неконстантных функций
- •Int main () {
- •Статические переменные-члены класса
- •Статические переменные-члены класса
- •Int generateId () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Статические члены не связаны с объектами класса
- •Int main () {
- •Определение и инициализация статических переменных-членов класса
- •Инициализация статических переменных-членов внутри тела класса
- •Использование статических переменных-членов класса
- •Int getId() const { return m_id; }
- •Int main () {
- •Статические методы класса
- •Int main () {
- •Int main () {
- •Статические методы не имеют указателя this
- •Int main () {
- •Предупреждение о классах со всеми статическими членами
- •Int main () {
- •Дружественные функции и классы
- •Int m_value;
- •Void reset (Anything &anything) {
- •Int main () {
- •Int m_value;
- •Дружественные функции и несколько классов
- •Дружественные классы
- •Примечания о дружественных классах:
- •Дружественные методы
- •If (m_displayIntFirst)
- •Int m_intValue;
- •Values (int intValue, double dValue) {
- •Анонимные объекты
- •Int main () {
- •Анонимные объекты класса
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Int m_dollars;
- •Int getDollars() const { return m_dollars; }
- •Int main () {
- •Вложенные типы данных в классах
- •Int main () {
- •Вложенные пользовательские типы данных в классах
- •Int main () {
- •Другие вложенные пользовательские типы данных в классах
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
Обратите внимание, поскольку все переменные и функции этого класса являются статическими, то нам не нужно создавать объект этого класса для работы с ним!
Статическая переменная-член используется для хранения значения следующего идентификатора, который должен быть ей присвоен, а статический метод — для возврата идентификатора и его увеличения.
