Программирование >>  Расширенная версия языка c++ 

1 ... 127 128 129 [ 130 ] 131 132 133 ... 227


13.3. Статические члены класса

Переменнхе - члены класса можно объявлять как статические (static). Используя статические переменные-члены, можно решить несколько непростых проблем. Если вы объявляете переменную статической, то может существовать только одна копия этой переменной - независимо от того, сколько объектов данного класса создается. Каждый объект просто использует (совместно с другими) эту одну переменную. Запомните, для обычных переменных-членов при создании каждого объекта создается их новая копия, и доступ к каждой копии возможен только через этот объект. (Таким образом, для обычных переменных каждый объект обладает собственными копиями переменных.) С другой стороны, имеется только одна копия статической переменной - члена класса, и все объекты класса используют ее совместно. Кроме этого, одна и та же статическая переменная будет использоваться всеми классами, производными от класса, в котором эта статическая переменная содержится.

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

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

Когда вы объявляете статические данные-члены внутри класса, вы не определяете их. Определить их вы должны где-нибудь вне класса. Для того

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

необходимо переобъявить (redeclare) ее, используя операцию расширения области видимости.

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

Запомните, что основной смысл поддержки в C++ статических переменных-членов состоит в том, что благодаря им отпадает необходимость в использовании глобальных переменных. Как можно предположить, если при работе с классами задавать глобальные переменные, то это почти всегда нарушает принцип инкапсуляции, являющийся фундаментальным принципом

OOP и C++.

Помимо переменных-членов статическими можно объявлять и функции-члены, но обычно это не делается. Доступ к объявленной статической

функции - члену класса возможен только для других статических членов

этого класса. (Естественно, что доступ к объявленной статической функции - члену класса возможен также и для глобальных данных и функций.) У статической функции-члена нет указателя this. Статические функции-

члены не могут быть виртуальными. Статические функции-члены не могут



Глава 13. Пространства тем и другие темы 397

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

этого класса.

1. Простой пример использования статической переменной-члена.

Пример статической переменной-члена ttinclude cstream> using namespace std;

clas lass {

static int i; public:

voi (int n) { i i; } -. .

Int geti(} { return 1; }

Определение S: :i. Переменная i по-прежнему

ется закрытым членом класса myclass int myclass : :i;

int main 0

myclass ol, o2; ol.setiClO);

cou Ol.getif) \n; выводит значение 10

cou i: o2.geti( \n; также выводит 10

return 0; , - .

После выполнения программы на экране появится следующее: *-

ij.j

ol.i: 10 o2.i: 10

Глядя амму, можн тить, что фактически только для объекта ol устанавливается значение статической переменной-члена i. Однако поскольку переменная i совместно используется объектами ol и о2 (и, на самом деле, всеми объектами типа myclass), оба вызова функции geti() дают один и тот же результат.



return 0;

Так как статической переменной i присвоено значение 00, программа выводит на экран следующее:

ol.i: 100 o2.i: 100

. Г ,. . .

3. Традиционным использованием статических переменнхх класса является координация доступа к разделяемым ресурсам, таким как дисковая память, принтер или сетевой сервер. Как вы уже, вероятно, знаете из своего опыта, координация доступа к разделяемым ресурсам требует некоторых знаний о

Обратите внимание, что переменная i объявляется внутри класса myclass, но определяется вне его. Этот второй шаг гарантирует, что для переменной i будет выделена память. С технической точки зрения, определение класса является всего лишь определением типа и не более. Память для статической переменной при этом не выделяется. Поэтому для вьщеления памяти статической переменной-члену требуется ее явное определение,

2. Поскольку статическая переменная - член класса существует еще до создания объекта этого класса, доступ к ней в программе может быть реализован без всякого объекта. Например, в следующем варианте предыдущей программы для статической переменной i устанавливается значение 100 без всякой ссылки на конкретный объект. Обратите внимание на использование

оператора расширения области видимости для доступа к переменной i.

Дл щения к статической переменной объект не нужен tfinclude <iostreain> - .

using namespace std; ,

class myclass { : . .

public:

static int i; i i > :

void aeti (int n) { i = n; } .: jt . - -

int geti() { return i; }

1; .......... ;

int myclass: :i; -- i-

int main () .

myclass ol, o2;

непосредственное задание значения переменной i myclass: ;i = 100; объекты не упоьтанаются

cou< ol.i ol.geti( \n ; выводит 100

cou o2.geti{) \n; также выводит 100



1 ... 127 128 129 [ 130 ] 131 132 133 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика