Статические переменные-члены класса — КиберПедия 

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Статические переменные-члены класса

2021-12-07 32
Статические переменные-члены класса 0.00 из 5.00 0 оценок
Заказать работу

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

Глобальные переменные объявляются вне всех функций программы (обычно перед главной функцией WinMain ()); значения этих переменных видны во всех точках программы, в том числе во всех ее функциях и блоках. Глобальные переменные используются для передачи некоторых значений из одной функции в другую. Например, в типичном приложении Windows инструменты рисования (кисти, перья, шрифты) создаются обычно в процессе создания окна в функции OnCreate (), однако используются эти объекты в другой функции – именно, OnPaint (). Для того, чтобы передать дескриптор hPen созданного в функции OnCreate () пера в фун­кцию OnPaint (), его следует объявить глобальным.

Локальные переменные объявляются внутри той функции, в которой они будут использоваться; ни в какой другой функции (и, в частности, в функции WinMain ()) эти переменные не видны. Таким образом, локальные переменные используются для хранения временных значений, которые нужны только в процессе выполнения данной функции. Кстати, в отличие от глобальных переменных, которые после инициализации сохраняют свои значения неограниченно долго, локальные переменные при каждом новом вызове функции, в которой они объявляются, теряют свои предыдущие значения, и их следует инициализировать заново.

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

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

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

Рис. 1.1 Несколько объектов класса Men со статической переменной counter

Любой объект класса может обращаться к статической переменной, читая или модифицируя ее значение; после такой модификации для всех объектов данного класса статическая переменная будет видна с этим новым значением.

Статическая переменная объявляется в составе закрытых данных класса со спецификатором класса памяти static и обязательно с указанием начального значения (например, 0):

class Men{

static int counter = 0;

...

};

Конструкторы и деструкторы

Конструкторы

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

Функция-конструктор формально отличается от всех остальных функций тем, что имеет имя, совпадающее с именем класса. Например, для класса Men конструктор должен имеет вид

Men(параметры){ тело конструктора }

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

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

Класс может включать несколько конструкторов с различным составом параметров (более того, обычно именно так и бывает), но может не иметь ни одного. Действительно, если ни переменные класса, ни другие элементы системы не требуют инициализации в момент создания объекта, то и в конструкторе нет необходимости; при создании экземпляров класса компилятор автоматически выделит под них память, хотя в этом случае данные-члены класса, естественно, не инициализируются и будут содержать мусор.

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

Вернемся к нашему примеру с классом Men и включим в его состав конструктор, который, как ему и положено, будет служить для инициализации данных-членов класса задаваемыми в программе значениями (именем и возрастом индивидуума):

class Men{

char* name;

int age;

public:

Men(char* n,int a){// Конструктор

name=n;     // с двумя

age=a;      // параметрами

}

char* GetName(){return name;}// Встроенные

int GetAge(){return age;} // функции - члены

};


Поскольку инициализация членов класса теперь осуществляется конструктором, мы удалили из класса функции SetName () и SetAge (), которые выполняли ту же операцию.

Конструктор класса Men имеет два параметра и, следовательно, при создании объектов класса необходимо указывать два аргумента. Создать объект класса без указания начальных значений имени и возраста не удастся, так как в данном классе не предусмотрен конструктор без параметров. Его можно было объявить (наряду с конструктором с двумя параметрами); такая методика (перегрузка конструкторов) будет рассмотрена в последующих разделах.

Создание объектов класса Men при наличии конструктора будет выглядеть следующим образом:

Men m1("Freston",17);

Men* pm2=new Men("Young",23);


Поделиться с друзьями:

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.006 с.