Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
369164_46F07_otvety_na_bilety_po_oop_si.doc
Скачиваний:
44
Добавлен:
24.12.2018
Размер:
613.38 Кб
Скачать

17. Использование спецификатора класса памяти static. Статические компоненты класса

Класс памяти определяет время жизни объектов и их нахождение в памяти.

Статические данные определяются при запуске и существуют до конца исполнения.

Автоматические объекты создаются в стеке в момент входа в блок и завершают свое существование при выходе из блока.

Динамические объекты создаются и уничтожаются по требованию программиста.

Использование static при объявлении глобальной переменной скрывает ее от других модулей. А если использовать static в блоке, то при выходе из блока данные остаются в памяти.

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

Т.о. статическое данное класса можно рассматривать как глобальную переменную класса, но с областью видимости класса.

class Point2D

{

double x,y;

static int count;

public:

Point2d(double _x, double _y)

{

x=_x; y=_y;

count++;

}

~Point2D() {count--}

};

Для обеспечения к закрытым элементам класса (статическим), должны быть предусмотрены открытые статические член-функции.

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

static

int GetCount() {return count;}

cout << Point2D::GetCount() << "\n";

Создание и инициализация происходит в начале запуска программы в порядке поступления их определений на вход компоновщика. Однако не следует проектировать программу таким образом, чтобы работа их зависела от порядка создания статических объектов.

18. Константные объекты и константные методы

имя_типа * const this

const имя_типа *const this

Если метод не встраиваемый, то слово const должно быть в объявлении и определении. В связи с этим, могут существовать два одноименных метода, отличающихся только наличием или отсутствием атрибута const. Для const-объектов будет вызываться только константный метод. При существовании одного лишь константного метода он будет вызываться для любых объектов, т.к. преобразование не константного объекта к константному - безопасно.

Иногда требуются исключения из правил доступа, когда некоторой функции или классу требуется разрешить доступ к личной части объекта класса. Это согласуется с тем принципом, что сам класс определяет права доступа к своим объектам "со стороны". К средствам контроля доступа относятся объявления функций-членов константными (const). В этом случае они не имеют права изменять значение текущего объекта, с которым вызываются. Заголовок такой функции при этом имеет вид

void dat::put() const

{ ... }

Аналогично можно определить константные объекты:

const class a{...} value;

ПРАВИЛО:

Константные методы

1) не должны менять значения элементов класса;

2) не должны вызывать другие неконстантные методы класса.

Константные методы могут применяться как для константных, так и для неконстантных объектов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]