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

В качестве примера определим класс, представляющий банковскую учетную запись:

class Account {

public:

 void calculate() { amount += amount * interestRate; }

 static double rate() { return interestRate; }

 static void rate(double);

private:

 std::string owner;

 double amount;

 static double interestRate;

 static double initRate();

};

Статические члены класса существуют вне конкретного объекта. Объекты не содержат данные, связанные со статическими переменными-членами. Таким образом, каждый объект класса Account будет содержать две переменные-члена — owner и amount. Есть только один объект interestRate, совместно используемый всеми объектами Account.

Аналогично статические функции-члены не связаны с конкретным объектом; у них нет указателя this. В результате статические функции-члены не могут быть объявлены константами и к указателю this нельзя обратиться в теле статического члена класса. Это ограничение применимо и к явному использованию указателя this, и к неявному, при вызове не статического члена класса.

Использование статических членов класса

К статическому члену класса можно обратиться непосредственно, используя оператор области видимости:

double r;

r = Account::rate(); // доступ к статическому члену при помощи

                     // оператора области видимости

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

Account ac1;

Account *ac2 = &ac1

// эквивалентные способы вызова статической функции

rate r = ac1.rate(); // через объект класса Account или ссылку

r = ac2->rate();     // через указатель на объект класса Account

Функции-члены могут использовать статические члены непосредственно, без оператора области видимости:

class Account {

public:

 void calculate() { amount += amount * interestRate; }

private:

 static double interestRate; // остальные члены как прежде

};

Определение статических членов

Подобно любой другой функции-члену, статическую функцию-член можно определить как в, так и вне тела класса. Когда статический член класса определяется вне его тела класса, ключевое слово static повторять не нужно, оно присутствует только в объявлении в теле класса:

void Account::rate(double newRate) {

 interestRate = newRate;

}

При обращении к статическому члену класса вне тела класса, подобно любому другому члену класса, необходимо указать класс, в котором он определен. Но ключевое слово static используется только при объявлении в теле класса. В определении ключевое слово static не используется.

Поскольку статические переменные-члены не принадлежат индивидуальным объектам класса, они не создаются при создании объектов класса. В результате они не инициализируются конструкторами класса. Кроме того, статическую переменную-член вообще нельзя инициализировать в классе. Каждую статическую переменную-член следует определить и инициализировать вне тела класса. Как и любой другой объект, статическая переменная-член может быть определена только однажды.

Как и глобальные объекты (см. раздел 6.1.1), статические переменные-члены определяются вне любой функции. Следовательно, сразу после определения они продолжают существовать, пока программа не завершит работу.

Статические члены определяют точно так же, как и функции-члены класса вне класса. Указывается тип объекта, затем имя класса, оператор области видимости и собственное имя члена:

// определить и инициализировать статический член класса double

Account::interestRate = initRate();

Перейти на страницу:

Похожие книги