Московский государственный университет имени М.В.Ломоносова
Опубликован: 03.10.2006 | Доступ: свободный | Студентов: 1010 / 60 | Длительность: 09:08:00
Специальности: Программист
Лекция 12:

C++: статические члены класса и виртуальные функции

< Лекция 11 || Лекция 12: 123 || Лекция 13 >
Аннотация: Описывается объявление и инициализация статических членов класса. Рассматривается применение виртуальных функций, реализация механизмов раннего и позднего связывания. Вводится понятие абстрактного метода. Рассматривается применение шаблонов методов и шаблонов классов.

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

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

Например:

class A { public: static int iStat; };
int main(int argc, char* argv[]) {
    A:: iStat = 123;
}

Статические методы могут вызывать и использовать только другие статические методы и статические переменные. Из статического метода нельзя выполнять вызов не статического метода - члена класса.

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

Часто статические переменные называют переменными класса, а не статические переменные - переменными экземпляра.

Для статических переменных могут использоваться указатели.

Например:

class A
{ public: 
static int iStatVar; 
};
int main(int argc, char* argv[]){
int A:: iStatVar = 0;
int *piStatVar = &A:: iStatVar;
}

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

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

  1. Объявить (как правило, в заголовочном файле) статическую переменную как член класса.

    Например: static int iStat;.

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

    Например: int A::iStat;

  3. Выполнить инициализацию статической переменной (по умолчанию статическая переменная типа int имеет значение 0 ).

    Например: A::iStat=123;

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

имя_класса::имя_конструктора : 
    имя_стат_переменной(значение) { }

нельзя ни в каком случае.

Для того чтобы создать статический метод - член класса в среде Visual C++, достаточно выделить в окне Class View секцию с именем класса, в который будет вставлен создаваемый метод, и выполнить команду контекстного меню Add|Add Function. А затем определить тип и имя создаваемого метода, список параметров, и отметить флажок Static, указывающий на то, что создаваемая функция будет статической.

В результате выполненных действий среда Visual C++ добавит в заголовочный файл класса прототип создаваемой статической функции, а в файл реализации - код реализации создаваемой статической функции.

Например:

class A
{public:
    a1(void);
    ~a1(void);
    int Fx1(int i1);
    int Fx2(int i2);
  protected:
    static int Fstat1(void);  
    // Статическая функция доступна 
    //только для статических методов - членов 
    //данного класса и наследуемых классов
public:
    static int Fstat2(void);    
    // Общедоступная статическая функция
};

int main(int argc, char* argv[]){
std::cout<<a1::Fstat2();   
    // Вызов статической функции
}

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

Например:

int A::FStat1(void) { return 0; }
< Лекция 11 || Лекция 12: 123 || Лекция 13 >
Евгений Шовергин
Евгений Шовергин
Россия, саратов, СВКИ ВВ МВД РФ, 2002
MZ wuhaitao
MZ wuhaitao
Китай, GuangZhou