Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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

Конструкторы и деструкторы | Перегруженные конструкторы | Указатели на классы |


Читайте также:
  1. ВТОРОСТЕПЕННЫЕ ЧЛЕНЫ ПРЕДЛОЖЕНИЯ
  2. Второстепенные члены предложения
  3. Гидростатические датчики уровня
  4. ГЛАВНЫЕ И ВТОРОСТЕПЕННЫЕ ЧЛЕНЫ ПРЕДЛОЖЕНИЯ
  5. За курение в сервис-парке участник и члены его команды наказываются штрафом в размере 5000р.
  6. Назначение и организация системной памяти. Физическая организация микросхем ПЗУ, статические и динамические ОЗУ. Типы динамической памяти (FPM, EDO, BEDO, SDRAM)
  7. Осесимметричные электростатические электронные линзы

Класс может содержать статические члены, данные или функции.

Статические поля класса иногда называют “переменными класса”, так как их содержимое не зависит от создаваемого объекта. Статическое поле имеет одно единственное значение для всех объектов одного и того же класса.

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

// static members in classes #include <iostream.h> class CDummy { public: static int n; CDummy () { n++; }; ~CDummy () { n--; };}; int CDummy::n=0; // формальное определение вне класса int main () { CDummy a; CDummy b[5]; CDummy * c = new CDummy; cout << a.n << endl; // 7 delete c; cout << CDummy::n << endl; // 6 return 0;}

Статические члены имеют свойства, похожие на глобальные переменные, но только область их действия – класс. По этой причине и чтобы избежать их многократного объявления, в соответствии со стандартом ANSI-C++, мы в класс можем включить только прототип (объявление), но не определение (инициализацию). Для инициализации статического поля мы должны написать формальное определение вне класса, в глобальной области действия, как в примере выше.

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

cout << a.n;
cout << CDummy::n;

Эти два обращения к переменной n вышеприведенного примера относятся к одной и той же переменной: статической переменной n внутри класса CDummy .

Еще раз напомним, что речь идет, фактически, о глобальной переменной. Отличие – только в том, как выглядит ее имя вне класса.

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

Статические члены класса (по Лафоре++)

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

 

 

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

Можно также представить функцию для вычисления суммарной заработной платы, предназначенной всем работниками каждый месяц. Такая функця-член может быть статической. Никакого указателя this не передается статическому методу: к статическому члену класса можно обратиться непосредственно через имя класса - class_name:: static_member, или через объект этого класса, или через указатель на объект этого класса (в предположении, что он имеет открытый вид доступа). Поскольку статические члены не принадлежат какому-либо конкретному объекту, то рекомендуется первый способ.

 

Следующий пример иллюстрирует сказанное.

 

class Employee

{

char name[50];

int id;

float hourly_rate;

static int next_id;

static float total_pay;

// другие члены

public:

Employee(char * name_str): id(next_id++) // конструктор

{ strcpy(name, name_str); }

static void acc_total(float f)

{ total_pay += f; }

// другие функции

};

int Employee::next_id = 1;

float Employee::total_pay = 0;

Статические поля должны быть инициализированы после их объявления в классе посредством операции разрешения области действия ::. (Вне класса-NB!, см. след. пример).

 

Пример 2-2.2

// статические данные класса

#include <iostream>

using namespace std;

//////////////////////////////////////////////////////////

class foo

{

private:

static int count; // общее поле для всех объектов

// (в смысле "объявления")

public:

foo() // инкрементирование при создании объекта

{ count++; }

int getcount() // возвращает значение count

{ return count; }

};

//--------------------------------------------------------

int foo::count = 0; // *определение* count

//////////////////////////////////////////////////////////

int main()

{

foo f1, f2, f3; // создание трех объектов

// каждый объект видит одно и то же значение

cout << "Число объектов: " << f1.getcount() << endl;

cout << "Число объектов: " << f2.getcount() << endl;

cout << "Число объектов: " << f3.getcount() << endl;

return 0;

}

В этом примере класс foo содержит одно статическое поле count. Конструктор инкрементирует значение этого поля.

Вот что выводит программа:

count is 3 ← static datacount is 3count is 3

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

count is 1 ← automatic datacount is 1count is 1

//****************END OF LectNote-9******************************

 

 


Дата добавления: 2015-11-16; просмотров: 67 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
О перегрузке операций| Дорожня мапа: розділ за розділом

mybiblioteka.su - 2015-2024 год. (0.01 сек.)