1. Память под статическую величину выделяется не при создании объекта, а по оператору описания этой величины аналогично глобальной величине. При этом может быть выполнена инициализация этой величины. Отличие состоит в том, что память под эту величину выделяется по оператору описания вне класса с указанием имени класса, к которому относится эта величина. При этом, так как статический тип этой величины указан уже в классе, то в операторе описания не указывается слово static.
Пример
Class M1
{….
static int k; // статический член-класса
……………………………………………
}; // конец определения класса
int M1::k=4; // М1- класс, в котором описана статический член к
2.Так как создание и инициализация статических членов-данных производится вне объекта, то обращение к этой величине может быть выполнено до создания объектов класса, где дано описание статической величины, с помощью статической член-функции.
Пример
#include<iostream.h>
#include<conio.h>
#include<string.h>
class m1
{ char kniga[12]; /* текст */
static char zag[120]; /*текст-заголовок , одинаковый для всех объектов*/
public:
static void pech () /* статическая функция печати заголовка*/
{cout<<"zagolovok "<<zag<<endl;}
m1(char * x) /* конструктор для задания текста объекта*/
{strcpy(kniga,x);}
void vivod() /* вывод текста объекта */
{ cout<<”text ”<<kniga<<endl;}
}; // конец определения класса m1
char m1::zag[12]="kniga"; // выделение памяти и инициализация статической переменной
int main() // главная функция
{clrscr();
/*. Обращение к статической функции до создания объекта для выдачи общего заголовка для всех объектов */
m 1:: pech ();
m1 obj[3]={"ttttt","hhhh","jjj"}; // задания текста в трех объектах
for(int i=0;i<3;i++) /* вывод постоянного заголовка и текста объекта*/
{ m1::pech(); /* 1-ый вариант использования статической функции без указания объекта */
obj[i].vivod();
};
cout<<"--------------"<<endl;
for(i=0;i<3;i++)// вывод постоянного заголовка и текста книги
{ obj[i].pech(); /* 2-ой вариант использование статической функции с указанием объекта*/
obj[i].vivod();
};
return 0;
}
Замечание
1.В этой программе используются 2 варианта обращения к статической функции. Это указано в комментариях.
При исполнении этой программы перед печатью содержимого текстов по каждому объекту печатается один и тот же заголовок - kniga.
2. В начале программы выдан общий инициализированный заголовок - статический член-данное с помощью статической член-функции, который будет использоваться всеми объектами класса m1. Сами же объекты в данной программе создаются после вызова указанной функции.
Использование динамической памяти при работе с объектами
Под динамической памятью понимается память, которая выделяется программе не во время трансляции, а во время исполнения программы.
Напомним, что в языке Си++ имеется возможность запрашивать во время исполнения (динамически) память заданного размера для данных по оператору new, который имеет следующий формат
указатель = new тип [количество элементов]
В этом случае тип указателя должен соответствовать типу указателя.
Пример
int *g;
g=new int [12];
По этому оператору выделяется память для 12 элементов целого типа.
Тип выделяемой памяти должен соответствовать типу указателя.
Способы использования динамической памяти при обработке объектов
С точки зрения обработки объектов можно выделить два случая использования динамической памяти:
- выделение памяти для всего объекта и для массива объектов.
Пример
Class g1
{……};
int main()
{ g1 *obj1; g1 * obj2;
obj1=new g1; /* динамический объект obj1 */
obj2=new g1[4]; /* динамический массив из 4-х объектов */
}
- выделение памяти для членов-данных объекта
Пример
Class g1
{ int * h; // член-данное указатель
…….
g1()
{ h=new int; …….} /*выделение в конструкторе памяти для данного целого типа *}
}; // конец определения класса
В данном разделе основное внимание уделено особенностям использования динамической памяти не для создания и обработки целого объекта, а особенностям использования динамической памяти для членов-данных внутри объектов.
Дата: 2019-03-05, просмотров: 245.