Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 15

2. Вызывается компонент-функция ob.print. Выводится текст строки начиная с 6-го символа до конца строки текст "исторический". Затем вместо символа "и" записывается 0 - конец строки, и на новой строке выводится текст с начала строки str1 до признака конца строки (0, записанного нами в str2[0]), т.е. слово "Факультет".

Тема 4. Статические и динамические объекты. Указатели

СТАТИЧЕСКИЕ ОБЪЕКТЫ

Рассматривая примеры, мы не заботились о памяти, которую необходимо выделить для определяемых объектов. Тем не менее данные программы работают, если попробовать ввести их исходные тексты и выполнить в одном из компиляторов, например фирмы BORLAND для С++. Объекты, которые мы использовали в программе, являются автоматическими. Память для них выделяется стандартным образом на этапе компиляции. Для каждого объекта использовалась своя копия элементов данных класса.

В случае если возникает потребность в определении некоторых разделяемых данных, которыми бы пользовались совместно все объекты данного класса, можно использовать декларацию (объявление) статических переменных (static).

Пример объявления:

          class my_class {my_class * prt;

static my_class my_stat;

};

Такое объявление гарантирует, что будет только один экземпляр переменной my_stat , а не по экземпляру для каждого объявленного объекта.

Так как объявление сделано в шаблоне класса, то чтобы сделать его доступным извне, необходимо объявить его как public и при обращении уточнять именем класса, например:

          my_class::my_stat

Переменные, объявленные со спецификатором Static, получают распределение памяти в начале выполнения программы и сохраняются до выхода из нее. При отсутствии явного инициализатора или конструкторов в С++ объекты со статической продолжительностью инициализируются нулем или NULL (для указателей).

Пример использования статических переменных:

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

class a1 { public: static int s; static void f1 (void); };

int a1::s=5;                //определение статической переменной

void a1::f1 (void) { s+=21;   //определение метода

printf("s=%d ; ",s);             //вывод значения переменной

getch();                                  //останов до нажатия клавиши

}

void main(void) { a1::s+=1; //+1 в статическую переменную

a1 ob_a1,ob_a2;        /           /определяем два объекта класса

a1 ob_a1.f1();            //вызов метода для объекта ob_a1

ob_a1.s+=5;               //+5 в статическую переменную

ob_a2.f1();                 //вызов метода для ob_2

}

Результат выполнения программы:

s=27 ; s=53 ;

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

ДИНАМИЧЕСКИЕ ОБЪЕКТЫ

Динамические объекты создаются во время выполнения программы с выделением памяти из пула свободной памяти. Такой прием используется, в случае если мы не можем определить объем запоминаемых в памяти данных до начала выполнения программы (работа со списками, записями переменной длины, сложными структурами данных).

В С++ для динамического размещения объектов можно использовать как функции языка С (например malloc), так и свои собственные более мощные операторы. Это операторы new и delete.

Формат их использования:

1) указатель_на_выделенную_память = new имя_типа (инициализирующее значение);

2) delete указатель_на_выделенную_память.

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

Оператор new выделяет требуемую память и возвращает указатель на ее начало. При ошибке и в случае невозможности выделения нужного объема памяти оператор возвращает значение NULL.

Оператор delete освобождает ранее выделенную оператором new память по заданному указателю на ее начало.

Преимущества операторов new и delete по сравнению с функциями С (типа malloc и free):

1. Оператор new вычисляет размер элемента, для которого необходимо выделить память (нет необходимости использовать операторы определения размера типа sizeof).