Главная » Все файлы » Просмотр файлов из архивов » PDF-файлы » 2. Массивы объектов. Массивы переменной длины. Операторы new, delete. Указатели. Ссылки.

2. Массивы объектов. Массивы переменной длины. Операторы new, delete. Указатели. Ссылки. (Семинары)

PDF-файл 2. Массивы объектов. Массивы переменной длины. Операторы new, delete. Указатели. Ссылки. (Семинары) Информатика (4431): Семинары - 2 семестр2. Массивы объектов. Массивы переменной длины. Операторы new, delete. Указатели. Ссылки. (Семинары) - PDF (4431) - СтудИзба2019-04-28СтудИзба

Описание файла

Файл "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 – принимает индексэлемента, который нужно удалить из массива.

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
427
Средний доход
с одного платного файла
Обучение Подробнее