2. Массивы объектов. Массивы переменной длины. Операторы new, delete. Указатели. Ссылки. (Семинары)
Описание файла
Файл "2. Массивы объектов. Массивы переменной длины. Операторы new, delete. Указатели. Ссылки." внутри архива находится в папке "Семинары". PDF-файл из архива "Семинары", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрЯзык программирования Си++Иванов А.П., Князева О.С.Семинар 2. Массивы объектов. Массивы переменнойдлины. Операторы new, delete. Указатели. Ссылки.1. Массивы объектовВстроенное в язык Си++ понятие массива позволяет создавать сразу заданное количестволюбых описанных ранее объектов. При этом для каждого элемента массива будет вызванего конструктор. При выходе из области видимости этого массива деструкторы такжебудут вызваны для каждого его элемента. Эти вызовы осуществляются неявно —компилятор вставляет в нужные места соответствующий код.Доступ к одному из элементов массива может осуществляться как по индексу, так и поуказателю.class CPoint { // описание класса “точка”public:int x,y;// координаты точки~CPoint() { cout << x << " " << y << endl; }// деструкторvoid Set( int newX=0, int newY=0 ) { x=newX,y=newY; } // установка значенийCPoint( int newX=0, int newY=0 ) { Set(newX,newY); } // конструктор};...{// начало области видимости массиваconst int N=12;// объявление константы, задающей размерность массиваCPoint PtArray[N]; // объявление массива объектов - “точек”// здесь неявно будут вызваны конструкторы “точек”CPoint * pPoint;// объявление указателя на “точку”...// доступ по индексуPtArray[3].Set(12,24); // установка новых значений 3-го элементаPtArray[4].x=15, PtArray[4].y=28; // изменение 4-го элемента// доступ по адресуpPoint = PtArray + 5; // получение адреса 5-го элементаpPoint->x = 16; pPoint->y = 32; // изменение 5-го элементаpPoint += 4; // получение адреса 9-го элементаpPoint->Set(2,2); // установка новых значений 9-го элемента...// здесь перед выходом из области видимости будут вызываться деструкторы}...2.
Операторы new и deleteВ языке Си все переменные могли размещаться в памяти несколькими способами.Переменные первого типа размещаются в памяти в момент загрузки и запуска программыи находятся там конца ее выполнения. Такие переменные называются статическими.Переменные второго типа создаются при входе в блок и существуют до выхода из него.Такие переменные называются автоматическими.07.11.20111Кафедра Компьютерных методов физики: программирование, первый курс, второй семестрЕсть и третий вид размещения переменных в памяти – размещение в динамическойпамяти,скоторойможнобылоработатьприпомощифункцийmalloc()/realloc()/free().
В язык Си++ также встроена возможность создаватьобъекты в динамической памяти, время жизни которых не регламентировано так строго,как в случае статических или автоматических переменных. Эта возможность реализованав виде операторов new и delete, используемых в соответствии со схемой:CPoint *pPoint = new CPoint(1,3); // создание объекта заданного типа.............// использование созданного объектаdelete pPoint;// уничтожение ранее созданного объектаПо действию оператора new в свободной памяти выделяется место для новогопредставителя объектов указанного типа и вызывается соответствующий конструктор.
Подействию оператора delete вызывается деструктор того объекта, на который ссылаетсяуказатель и после этого освобождается занятая память. Уничтожать оператором deleteможно только те объекты, которые были созданы посредством оператора new.Особенности:Аналога функции realloc() в Си++ нет.Допускается вызов delete p; где p – нулевой указатель. Такой вызов простоничего не делает.3.
Массивы переменной длиныСоздание обычных статических или автоматических переменных-массивов имеет двасущественных недостатка: во-первых, для описания длины массива не может бытьиспользована переменная величина – допускается только константа, а во-вторых, еслимассив был объявлен внутри некоторой функции, то он будет автоматически уничтоженпри выходе из этой функции. Часто же возникают ситуации, когда созданный внутринекоторого модуля массив должен иметь длину задаваемую переменным параметром, икроме того должен продолжить свое существование после возврата управления из этогомодуля.
В таких ситуациях следует завести объект в динамической памяти.// функция, создающая массив "точек" заданного объема NCPoint * CreatePtArray( int N ){CPoint * pPoint;pPoint = new CPoint [N]; // создание массива переменной длины// явно будут вызваны N конструкторов по умолчаниюreturn pPoint; // возврат адреса созданного массива// неявного вызова деструкторов не будет, так как уничтожается только// переменная-указатель, а не весь массив.}...{// использование массива переменной длиныint nDim=10;CPoint * pPtArray;...pPtArray = CreatePtArray( nDim );// оператор new может вернуть NULL, при нехватке памятиif( pPtArray!=NULL ) {for( int i=0 ; i<nDim ; i++ ) {pPtArray[i].Set(i,i); // инициализация массива}07.11.20112Кафедра Компьютерных методов физики: программирование, первый курс, второй семестр// работа с массивом......// по окончании работы массив следует уничтожить явноdelete [] pPtArray; // [] - означают уничтожение массива}}4.
Указатели и ссылкиКак известно, в языке Си, передача параметров в функцию при вызове можетосуществляться двумя способами:передача по адресу;передача по значению.В языке Си++ добавлено новое понятие – ссылка, и еще один способ передачи данных –по ссылке. Ссылка по смыслу является просто другим именем уже существующегообъекта. Отличительной особенностью ссылки является то, что она обязана бытьпроинициализирована одновременно с ее объявлением (т.к. ссылка – имя ужесуществующего объекта).По способу ее использования ссылка очень похожа на новое имя объекта (его псевдоним),но по свойствам, которые предоставляет ссылка, она больше похожа на указатель. Припередаче параметра по ссылке модуль, в который эта ссылка передана, получает доступнепосредственно к самому объекту, а не к его копии, как это происходит при передаче позначению. Дополнительные возможности появляются и при использовании ссылок вкачестве возвращаемого значения функции.
Так, например, функция, возвращающаяссылку, может использоваться в левой части оператора присваивания – присвоение будетсделано тому объекту, ссылку на который вернула эта функция.5. Пример. Контейнерный класс.Устройство класса «вектор» (динамический массив) иллюстрирует весь материалсеминара – создание динамических массивов, работу со ссылками и указателями и т.д.#include <iostream>#include <stdlib.h>class Vector{protected:int *v;int len;public://==========Конструкторы объектов класса======//// КонструкторVector(int N=0) : v(0), len(0){ if (N>0) v = new int[N];if (v) len = N;}// Конструктор копирования – конструктор, создающий объект (типа vector)// по уже имеющемуся объекту того же классаVector(const Vector & temp) : v(0), len(0){ if (temp.len>0) v=new int [temp.len];if ( v ) {len=temp.len;for (int i=0;i<len;i++) {v[i]=temp.v[i];}07.11.20113Кафедра Компьютерных методов физики: программирование, первый курс, второй семестр}}//=============Размерность==========//int size() const { return len; }//=============Перегрузка []==========//// для использования в левой части присваивания:int & operator [] (int index){ return v[index]; }// для использования в правой части присваивания:int operator [] (int index) const{ return v[index]; }//=============Деструктор============//// Определение деструктора ~имя_класса () {тело деструктора}~ Vector() { delete [] v; }};...{Vector T(100);T[0] = 3;int x = T[0]++;int y = T[0];}...Типовое задание: реализовать класс – динамический массив объектов с возможностьюдобавления (в произвольное место) и удаления любого элемента.
Должны бытьреализованы: конструктор копирования и деструктор, освобождающий память,перегружен оператор [], а также оператор вывода в поток.Для вставки нового элемента в динамический массив (вектор) нужно:выделить память большего размера и сохранить указатель во временнойпеременной, проверить результат (выделилось ли?);скопировать по адресу нового указателя все элементы старого вектора,предшествующие индексу вставляемого элемента;сохранить в нужную позицию нового массива вставляемый элемент;скопировать по адресу нового указателя за вставленным элементом все элементыстарого массива, начинающиеся с индекса вставляемого элемента;уничтожить старый массив, на который продолжает указывать переменная-членкласса v из примера выше;скопировать указатель нового вектора в переменную-член класса v из примеравыше;размерность вектора увеличить на единицу.07.11.20114Кафедра Компьютерных методов физики: программирование, первый курс, второй семестр1.
ВариантСоздайте класс – динамический массив. В качестве элементов массива выберитеобъекты из Задания № 1.Определите в нем конструктор (можно несколько), деструктор, конструктор копирования. Перегрузитеоперацию []. Определите методы класса, которые позволяли бы добавлять и удалять элемент из массива(insert, erase). Функция insert – добавляет элемент в конец массива. Функция erase – принимает индексэлемента, который нужно удалить из массива.
Кроме того, определите метод класса (merge), позволяющийобъединять два массива (второй добавляется в конец первого).2. ВариантСоздайте класс – динамический массив. В качестве элементов массива выберитеобъекты из Задания № 1.Определите в нем конструктор (можно несколько), деструктор, конструктор копирования. Перегрузитеоперацию []. Определите методы класса, которые позволяли бы добавлять и удалять элемент из массива(insert, erase). Функция insert – добавляет элемент в начало массива. Функция erase – принимает индексэлемента, который нужно удалить из массива.