
- •Обзорные лекции по курсу
- •1.Концепции и методология объектно-ориентированного программирования
- •2.Классы. Конструкторы и деструкторы
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Конструкторы и деструкторы. Список инициализации элементов
- •Void Show();
- •Int main()
- •Void Show();
- •Int main()
- •Статические члены класса
- •3. Простое и множественное наследование
- •Int GetX(){return X;}
- •Int GetY(){return у;}
- •Int GetX(){return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ' ;}
- •Void ShowY(){cout « GetY()« ' ';}
- •OutCoord(int _x, int _y): Coord(_x, _y){}
- •Int GetX() {return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ';}
- •Void ShowY(){cout « GetY()« ' ';}
- •Void ShowX(){cout « Coord::GetX() « ' ';}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Void Show();
- •Int main()
- •Int GetX() {return X;}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Упражнения для самопроверки
Статические члены класса
Члены класса могут быть объявлены с модификатором static. Статический член класса может рассматриваться как глобальная переменная или функция, доступная только в пределах области класса.
Данное-член класса, определенное с модификатором static, разделяется всеми представителями этого класса, так как на самом деле существует только один экземпляр этой переменной. На самом деле, память под статические данные-члены выделяется, даже если нет никаких представителей класса. Поэтому класс должен не только объявлять статические данные-члены, но и определять их.
Например:
class AnyClass
{
public:
AnyClass();
//объявление статического данного-члена
static int count;
};
//определение статического данного-члена
int AnyClass::count = 0;
Заметим, что хотя к статическим данным-членам, объявленным в разделе public класса, можно обращаться с помощью конструкции, использующих имя объекта:
<объект>.<данное-_член>
или
<указатель_на_объект> - > <данное_член>,
лучше использовать форму вызова
<имя_класса>: : <данное -_член>,
которая является более правильной, так как отражает тот факт, что соответствующее данное-член является единственным для всего класса. Если статические данные-члены объявлены как закрытые, то доступ к ним можно получить с помощью обычных функций-членов. Доступ к статическим данным-членам с помощью обычных функций-членов ничем не отличается от доступа к другим данным-членам, но для этого необходимо создать хотя бы один объект данного класса. В связи со сказанным выше, можно дать следующие рекомендации:
• применяйте статически данные-члены для совместного использования данных несколькими объектами класса;
• ограничьте доступ к статическим данным-членам, объявив их в разделе protected или private.
Рассмотрим пример использования статического данного-члена класса:
#include <iostream.h>
class T
{
public:
T(){ObCount++;}
~T(){ObCount--;}
static int ObCount;
//...
private:
int x;
};
int Т::ObCount = 0;
int main()
{
T* pOb = new Т[5];
cout « " Имеется " « Т::ObCount « " объектов типа Т\n";
delete[] рОb;
return 0;
}
В этом примере статическое данное-член просто ведет учет созданных объектов. При выполнении программа выводит на экран:
Имеется 5 объектов типа Т
Особенностью использования статических функций-членов является то, что они также определены в единственном экземпляре и не являются безраздельной собственностью какого-то представителя класса. В связи с этим им не передается указатель this. Эта особенность статических функций-членов используется при написании функций-обработчиков прерывании и callback-функций (при программировании для Windows).
Из сказанного выше вытекает несколько важных следствий:
• статическая функция-член может вызываться независимо от того, существует или нет какой-либо представитель класса;
• статическая функция-член может манипулировать только статическими данными-членами класса и вызывать только другие статические функции-члены класса;
• статическая функция-член не может быть объявлена с модификатором virtual.
Приведем пример использования статической функции-члена. Он представляет собой слегка отредактированный предыдущий пример:
#include <iostream.h>
class T
{
public:
Т(){ObCount++;}
~Т(){ObCount--;}
//...
static int GetCounts(){return ObCount;}
private:
int x;
static int ObCount;
};
int Т::ObCount = 0;
int main ()
{
Т* рОb = new Т[5] ;// Динамическое выделение памяти для 5 объектов типа Т
cout « "Имеется " « Т::GetCounts() « " объектов типа Т\n";
delete[] pOb; // удаление памяти, выделенной для группы объектов
return 0;
}