Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Динамічний розподіл ресурсів пам’яті при виконанні програми



 

Для создания и удаления динамических объектов используются унарные операции new и delete. У каждой из них имеется две версии: для одиночных объектов и для массивов:

new <тип> - создать объект указанного типа;

new <тип> [размер массива] - создать массив объектов;

delete <адрес> - удалить объект с указ. адресом;

delete[] <адрес> - удалить массив объектов.

 

Операция new возвращает адрес созданного объекта, Для работы с динамическими объектами могут использоваться указатели и ссылки:

double* p = new double; double& A = *(new double);

...................... ......................

delete p; p=NULL; delete &A;

Если для создания объекта операцией new нет достаточной памяти, эта операция возвращает 0 (NULL). Пример создания динамического объекта с контролем:

p= new тип; if (p==NULL) { puts("Нет памяти!"); exit(0); }

Обработка исключения, порождаемого операцией new, может быть использована для построения программы, которая устанавливает размер свободной области виртуальной памяти:

 

#include <syst.h>

void main()

{ set_new_handler(0);

char* p;

int i, N=1024*1024L;

for (i=0;;i++)

{ p= new char[N];

if (p==NULL) { printf("Size of virtual memory = %d \n",i);

exit(0); }

}

}

Операция new может содержать значение для инициализации создаваемого объекта:

double *p = new double(3.3333);

Динамические массивы

Операции создания и удаления одномерного динамического массива программируются очень просто:

int N = 100;

long* P= new long[N]; // здесь N - не константа

.....................

delete[] P;

Двухмерные массивы

Можно создавать двухмерные динамические объекты следующих видов:

- матрицы с фиксированной длиной строки и с переменным числом строк;

- матрицы с фиксированным числом строк, но с переменной длиной строки;

- двухмерные массивы с переменным числом строк и с переменой длиной каждой строки.

Могут создаваться динамические массивы и большей размерности.

Для платформы DOS ранее существовали простые и удобные функции контроля размера свободной области памяти. Это упрощало отладку программ с динамическим распределением памяти. Сейчас эта возможность утеряна.

 

7. Застосування шаблонів функцій та класів при створенні програм. Можливості
параметризованих класів.

 

Шаблон функции - это способ сделать функцию более универсальной.

Пример простого шаблона функции, которая возвращает значение меньшего из двух параметров:

 

template <class type>

type min(type A, type B)

{ return A<B? A:B;

}

Преимущество функции с шаблонами состоит в том, что мы можем записывать ее вызов для фактических параметров любого типа. Например, для приведенной выше функции min можно записывать такие варианты вызовов:

min(10,15) <-- вызов int min(int,int);

min(8.5,4.3) <-- вызов min(double,double);

min('a','*') <-- вызов min(char,char);

Компилятор генерирует тело функции (создает конкретизацию функции) в тот момент, когда в тексте компилируемой программы встречается ее вызов.

Шаблоны типа имеют глобальный статус, они не могут быть вложены в класс или быть локальными в некоторой функции.

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

Функция с шаблонами не может иметь переменное число параметров.

Специальная реализация функции

Если для некоторых типов параметра функции требуется использовать иной алгоритм, можно определить специальную реализацию шаблона функции. Например, функцию min можно определить таким образом, что при использовании аргументов типа char*, она будет возвращать указатель на строку, имеющую меньшую длину:

 

template <class type>

type min(char* A, char* B)

{ if (strlen(A)<strlen(B)) return A;

else return B;

}

 

Пример шаблона функции парного обмена:

 

template <class TYPE>

inline void swp(TYPE& a, TYPE& b)

{ TYPE R;

R=a; a=b; b=R;

}

 

Шаблоны классов

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

Общий вид описания класса с шаблонами:

template <список_параметров_шаблона>

Class имя_класса

{ ................

};

В качестве параметров шаблона могут использоваться типы, шаблоны и переменные.

Объявление, предписывающее создать объект параметризованного класса имеет следующий формат:

имя_класса<аргументы> имя_объекта[(параметры_конструктора)];

При записи объявлений в качестве имени параметризованного класса используется имя класса вместе с аргументами шаблона в треугольных скобках.

Пример построения параметризованного класса:

 

Если шаблонный класс имеет статические компоненты, то для каждой конкретизации этого класса будет создаваться свое множество статических компонентов.

Для статических компонентов обычного класса память выделяется сразу после определения класса. В случае шаблонного класса память для статических компонентов выделяется при каждой конкретизации класса.

Метод параметризованного класса автоматически становится функцией с шаблоном. Общий формат объявления такой функции имеет следующий вид:

template <список_параметров_шаблона>

возвр_тип имя_класса<параметры_шаблона>::имя_функции(параметры_функции)

{ ... }

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

· Локальный класс не может содержать внутри себя параметризованный класс.

· Методы с шаблонами не могут быть виртуальными.

· Параметризованный класс может содержать статические элементы, дружественные функции и классы.

· Параметризованный класс может быть производным как от параметризованного так и обычного классов, а также являться базовым для параметризованного и обычного классов.

· Внутри параметризованного класса нельзя определить параметризованный friend-класс.

Если параметром шаблона является переменная целого типа, то соответствующим формальным параметром должно быть константное выражение.

Достоинства и недостатки шаблонов

Шаблоны представляют собой мощное и эффективное средство программирования работ с различными типами данных, которое можно назвать параметрическим полиморфизмом. Шаблоны обеспечивают безопасное использование типов (в отличие, например, от макросов препроцессора). Однако следует иметь в виду, что программа, при создании которой использованы шаблоны, содержит полный код для каждого порожденного типа, что сказывается на размере исполняемого файла. Кроме того, с некоторыми типами данных шаблоны могут работать менее эффективно, чем с другими. В этом случае имеет смысл использовать специализацию шаблона.

Стандартная библиотека С++ включает большой набор шаблонов для различных способов организации хранения и обработки данных.

Специализация параметризованого класса

Если для какого-либо типа данных существует более эффективный код, можно предусмотреть для этого типа специальную реализацию отдельных методов, либо полностью переопределить (специализировать) шаблон класса.

Для специализации метода требуется определить вариант его кода, указав в заголовке конкретный тип данных. Например, если заголовок обобщенного метода print шаблона list имеет вид:

template <class data>

void list<data>::print()

{ тело обобщенного варианта метода print

}

специализированный метод для вывода списка символов будет выглядеть следующим образом:

void list<char>:: print()

{ тело специального варианта метода print

}

При специализации целого класса после описания обобщенного варианта класса помещается полное описание специализированного класса. При этом требуется заново определить все его методы.

 

8. Успадкування та створення ієрархій класів. Проблеми, які вирішуються шляхом
використання успадкування

 

Наследование занимает важное место в идеологии ООП, оно выполняет несколько важных функций:

- позволяет четче организовать и лучше представить систему классов в сложных программах, улучшает организацию работ при создании сложных программных продуктов;

- позволяет многократно использовать фрагменты программного кода, избегая дублирования и снижая объем программного кода;

- снижает риск появления ошибок, особенно при выполнении работ по модернизации программ.

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

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

Иерархия наследования определяет на множестве классов особый вид бинарного отношения - отношение наследования, т.е. отношение вида "базовый класс - производный класс". Базовый класс называют иногда родительским, производный - дочерним. Пример

такой иерархии приведен на рис.1. Класс А в этой иерархии объединяет свойства и методы классов В1 и В2, а класс В1 объединяет свойства и методы классов С1 и С2 и т.д.

Базовый класс содержит те свойства (компоненты) и методы (функции) производного класса, которые являются общими для нескольких подобных классов.

Производный класс содержит описание только лишь тех свойств и методов, которые являются дополнительными по отношению к базовому классу. Кроме того, производный класс может содержать свои версии методов базового класса.

Запись производного класса

Класс который не является производным, не зависимо от того, является ли он базовым или нет, записывается как обычно. Запись производного класса отличается тем, что в его заголовке указываются имена базовых классов. Например:

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.