Статическое поле данных класса принадлежит всем объектам данного класса и существует в единственном экземпляре. При создании объектов класса статические поля не тиражируются, в отличие от остальных данных-членов класса. Следует отметить, что доступ к статическому полю возможен только после инициализации (выделения памяти и задания начального значения). Инициализировать статическую переменную нужно вне класса в глобальной области данных для того, чтобы экземпляры класса, создаваемые после этого имели к ней доступ.
Добавим в класс MyStr три поля :
· статическое открытое поле num – порядковый номер строк
· статическое закрытое поле count – общее количество существующих строк
· нестатическое открытое поле nn – для хранения порядкового номера строки
Добавим метод:
· get_count() – для внешнего чтения закрытого поля count
Нам придется видоизменить конструктор и метод display(), так как им придется работать с новыми полями, также добавим в класс деструктор.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class MyStr
{ static int count; // счетчик существующих строк
char *buf; // закрытые данные
public:
static int num; // счетчик порядкового номера
int nn; // порядковый номер строки
// конструктор (инициализация параметром)
MyStr(const char *str)
{ cout<< "Выполняется конструктор! ";
num++; // при создании объекта счетчики наращиваются
count++;
nn=num;
buf= new char[strlen(str)+1]; // выделение динамической памяти
strcpy(buf, str);// копирование строки-параметра в выделенную память
} // уничтожение локальных объектов при выходе из блока
MyStr c4("fourth"); // создание четвертой строки
c4.display();
system ("pause");
return 0;
}
Обратите внимание, что статическая переменная count определена в закрытой части класса, в этом случае в вызывающей программе обратиться к ней можно только с помощью метода класса get_count (внешнее обращение). Статические переменные (как открытые, так и закрытые) существуют в единственном экземпляре, создаются при инициализации и принадлежат всем объектам класса. Поэтому и инициализировать обращение к ним может любой из объектов класса (с1,с2,с3,с4) – результат будет один и тот же. В нашем примере метод get_count() всегда вызывается объектом с1.
Статическая переменная num определена как открытая, поэтому из вызывающей программы к ней есть непосредственный доступ: MyStr::num (с уточнением принадлежности к классу) или с1.num (через любой из объектов класса).
Нестатическая переменная nn имеется в каждом объекте класса и определена как открытая (в public-области класса MyStr), поэтому в вызывающей программе обращаться к ней следует через соответствующий объект класса, используя уточненное имя, например: c1.nn, c2.nn и т.п.
Поговорим о конструкторах и деструкторах. Конструкторы всегда вызываются явно при создании объектов класса, например: MyStr c1("first"). Деструкторы чаще вызываются неявно, при уничтожении объекта класса. В нашем примере уничтожается объект с3 при выходе из вложенного блока.