- •Часть 2
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •Глава 6 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •§ 4. Вещественный тип
- •§ 5. Преобразование типов
- •Преобразование типов в выражениях
- •Преобразование типов при присваивании
- •Г л а в а 7 введение в указатели
- •§ 1. Понятие указателя. Операции разыменования и разадресации
- •§ 2. Инициализация и присваивание указателей
- •§ 3. Распределение динамической памяти
- •Операция new
- •Операция delete
- •§ 4. Параметры-указатели. Функция ввода scanf
- •Упражнения, тесты
- •Г л а в а 8 одномерные массивы, указатели и функции
- •§ 1. Связь указателей и одномерных массивов. Передача массива в качестве параметра функции
- •§ 2. Сортировка одномерных массивов
- •§ 3. Сортировка массива по параметру числа
- •§ 4. Сортировка массива выбором.
- •§ 5. Сортировка массива вставками
- •§ 6. Динамические одномерные массивы
- •6.1. Порядок работы с динамическим массивом
- •6.2. Работа с динамическим массивом в классе. Деструктор
- •§ 7. Введение в строки
- •Глава 9 мАтрицы
- •§ 1. Объявление, способы определения матриц
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов
- •3.1. Построчная обработка
- •Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •Преобразование матрицы
- •Построение матриц
- •§ 4. Матрицы, указатели и функции
- •Упражнения и тесты
- •Обработка матрицы по столбцам.
- •Список реКоМендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 2
6.2. Работа с динамическим массивом в классе. Деструктор
Если с динамическим массивом работаем в классе, то указатель на динамический массив и его размерность включаем в класс в качестве обязательных полей. Резервирование памяти и инициализация указателя на массив с помощью операции new выполняется, как правило, в конструкторе, а освобождение этой памяти — в деструкторе.
Пример 4. Создать класс для работы с одномерным динамическим массивом, предусмотрев конструктор и деструктор.
const Nmax=20; /* Наибольшая размерность массива, которая используется в конструкторе для контроля передаваемой в класс размерности. */
class DinArr {
int n; /* Реальная размерность массива в виде переменной*/
float *DA; /*Объявляем указатель на динамический массив. */
/* Метод для перестановки двух чисел. Можно использовать только внутри класса, так как по умолчанию атрибут доступа private. В качестве формальных параметров используем указатели на вещественные числа. */
void Change(float *x, float* y) { float t=*x; *x=*y; *y=t; };
public: // Конструктор
DinArr(int size) { if (size<1 || size>Nmax) n=Nmax / 2; else n=size;
DA=new float [n]; }
// Метод для ввода массива.
void MyDef() { for(int i=0; i<n; i++) cin>>DA[i]; }
// Метод для вывода массива.
void Show() { cout<<endl; for(int i=0; i<n; i++) printf("%5.2f ", DA[i]); }
/* Булевская функция (метод), возвращающая true или false в зависимости от того, является ли массив “симметричным” относительно “центра”. */
bool Simm() { for (int i=0;i<n/2; i++) if (DA[i]-DA[n-1-i]) return false;
return true; }
/* Метод, который “переворачивает” массив, т. е. меняет местами первый элемент с последним, второй с предпоследним и т. д. до середины массива */
void Rev() {
for (int i=0;i<n/2; i++)
Change(&DA[i], &DA[n-1-i]); }
~DinArr() // Дeструктор
{ cout<<"\nThe destructor deletes array\n" ; getch(); delete []DA;
} // The end of destructor
} ; // The end of class
int main()
{ /* Создаём объект и одновременно вызываем конструктор. Фактический параметр для него (размерность массива) вводим */
unsigned MyN; cout<<"size="; cin>>MyN; DinArr ObjArr(MyN);
/* Вызываем методы класса */
ObjArr.MyDef(); ObjArr.Show();
/* Если массив симметричный, выводим "Yes !", в противном случае “переворачиваем” массив и выводим изменённый массив. */
if (ObjArr.Simm()) cout<<"Yes !";
else { ObjArr.Rev(); ObjArr.Show(); }
getch(); return 0; }
Во время выполнения, а не компиляции программы при объявлении объекта вызывается конструктор. С его помощью определяем размерность массива n с элементарным контролем. С помощью операции new резервируем память для n элементов динамичского массива и адрес начала этой выделенной области памяти присваиваем переменной-указателю DA. Кроме ввода размерность можно задать случайным образом DinArr ObjArr (random(Nmax)); или константой DinArr ObjArr(6);
Как и конструктор, деструктор не имеет типа, а его имя совпадает с именем класса, перед которым записывается символ “~” (тильда). Чтобы убедиться, что деструктор выполнялся, желательно выводить соответствующее сообщение. Кроме этого, освободили память, выделенную для динамического массива. Вызывается деструктор автоматически, когда завершается выполнение функции main().
