Статические члены класса. Особенности выделения памяти и инициализации.
static – указание на то, что переменная будет хранить значение, общее для всех экземпляров класса (глобализация с учетом инкапсуляции и видимости). При объявлении static переменной-члена класса создается единственный общий экземпляр переменной, который будет использоваться всеми экземплярами данного класса. Static переменная инициализируется нулем до создания первого экземпляра класса. Физическая память для static переменной-члена класса выделяется только при ее глобальном определении вне данного класса. Используется для замены глобальных переменных в рамках принципа инкапсуляции.
static функция получает прямой доступ к другим статическим членам класса. Использование статических функций в основном ограничено предварительной инициализацией закрытых статических переменных-членов до создания реальных объектов класса.
Ограничения:
· Не имеет указателя this
· Не может быть одновременно версий статической и нестатической функции
· Не может быть виртуальной
· Нельзя объявлять используя const и volatile
class example
{
static int a;
public:
static void setA (int A) { a = A; }
int getA () { return a; }
};
int example::a;
void main()
{
example object;
example::setA(10);
cout << object.getA() << endl;
}
Константные переменные-члены класса. Особая инициализация переменных-членов класса. Функции-члены с атрибутами const.
const – указание на неизменность значения (задание константы). Установка значения такого блока данных производится только один раз.
Для функции const запрещает функции модифицировать вызывающий ее объект (при этом this и остальные неявные параметры считаются константными, однако, атрибут mutable разрешает модификацию помеченной переменной).
Особая инициализация членов класса:
конструктор (список_параметров) : данное (значение)
данное1 (значение1)
…
данноеN (значениеN)
{…}
Особенности:
· Члены класса создаются и инициализируются в порядке своего объявления в классе, а не в порядке списка
· Значения, присваемые данным могут быть константными или значениями из списка параметров коструктора
· Инициализация членов класса и вызов базовых конструкторов может смешиваться в одном списке.
class example
{
int a;
int mutable b;
public:
// void setA (int A) const { a = A; }
// не проходит т.к. нельзя модифицировать
void setB (int B) const { b = B; }
int getA () const { return a; }
int getB () const { return b; }
};
Дата добавления: 2022-02-05; просмотров: 266;