cpp-oop (Методические пособия по C++ Г.С.Иванова 3 части), страница 6
Описание файла
PDF-файл из архива "Методические пособия по C++ Г.С.Иванова 3 части", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 6 страницы из PDF
Три способа организации динамических массивов объектов (серым выделеныэлементы структуры, размещенные в динамической памяти):а – динамический массив объектов; б – статический массив указателей на динамическиразмещаемые объекты; в – динамический массив указателей на динамическиразмещаемые объектыОсвобождать выделенную память нужно так, как она была выделена:ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»36одним фрагментом – для динамического массива объектов:•delete[] mas;поэлементно – для массива указателей на объекты:•for (i=0; i<n; i++) delete mas[i];• одним фрагментом, если память под массив указателей выделялась динамически:delete [] mas;Различиямежду статическимиидинамическими,инициализированнымиинеинициализированными объектами и массивами из них существенно влияют насинтаксис их описания и на работу с ними, поэтому эти различия важно хорошо понимать.Пример1.15.ОпределимклассPoint,включающийдваскрытыхполя,инициализирующий и неинициализирующий конструкторы, инициализирующий метод иметод вывода содержимого полей на экран:#include <iostream>class Point{private: int x,y;public:Point(){}Point(int ax,int ay): x(ax),y(ay){}void SetPoint(int ax,int ay){void Print(){x=ax; y=ay;}std::cout<<x<<" "<<y<<"\n";}};А теперь создадим объекты и массивы объектов различных типов.1.
Статические и динамические объекты.А. Неинициализированный статический объект (см. рис. 1.3, а):Point a;// объявление объектаa.SetPoint(5,10); // инициализация полейОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»37// вывод содержимого полей на экранa.Print();Поскольку объект – статический память специально выделять и освобождать ненадо, эта операция будет выполнена автоматически.jeab??23?бaв34гРис. 1.3.
Результаты операций объявления статических (а–б) и динамических (в–г)объектов:а – статический неинициализированный объект; б – статический инициализированныйобъект; в – указатель на несозданный динамический объект; г – указатель надинамический инициализированный объектБ. Инициализированный статический объект (см. рис. 1.3, б):Point b(2,3);b.Print();// создание объекта// вывод содержимого полей на экранОбъект сразу создается инициализированным, проблем с памятью также нет.В.
Неинициализированный динамический объект (см. рис. 1.3, в):Point *e;// объявление неинициализированного указателя на объектe=new Point(3,4); // выделение памяти и инициализация полейe->Print();// вывод содержимого полей на экранdelete e;// освобождение памятиПод объект необходимо отдельно выделить память, соответственно ее следует иосвободить.Г. Инициализированный динамический объект (см. рис. 1.3, г):Point *j=new Point(3,4); /* объявление указателя на объект,выделение памяти и инициализация полей объекта */j->Print();// вывод содержимого полей на экранdelete j;// освобождение памятиОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»38Обработка инициализированного объекта ничем не отличается от обработкинеинициализированного объекта, просто операции объявления указателя, выделенияпамяти и инициализации полей объекта совмещены в одном операторе.2. Статические и динамические массивы объектов.А. Неинициализированный статический массив объектов (см. рис. 1.4, а):// объявление массива объектовPoint c[4];for(int i=0;i<4;i++){c[i].SetPoint(i*i,i-5); // инициализация полейc[i].Print(); // вывод содержимого полей на экран}Поскольку массив объявляется неинициализированным, его объекты приходитсяинициализировать, после чего содержимое полей можно выводить.
Проблем с памятьюнет.cd????????244бams????в?5q?2г71542гРис. 1.4. Результаты выполнения операции объявления массивов объектов:а – неинициализированный статический массив объектов; б – инициализированныйстатический массив объектов; в – неинициализированный динамический массив объектов;г – неинициализированный статический массив указателей на объектыБ. Инициализированный статический массив объектов (см. рис.
1.4, б):Point d[2]= {Point(2,4),Point(4,5)}; /* создание массиваобъектов и инициализация их полей */for(i=0;i<2;i++) d[i].Print();// вывод содержимого полей на экранОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»39Массив создается инициализированным, содержимое полей можно сразу выводить.Проблем с памятью нет.В. Неинициализированный динамический массив объектов (рис.
1.4, в):Point *m=new Point[3];for(i=0;i<3;i++){m[i].SetPoint(i,i+1);m[i].Print();}delete [] m;Память под динамический массив выделяется одним куском, следовательно иосвобождать ее надо также.Г. Неинициализированный статический массив указателей на объекты (рис. 1.4, г):Point *s[3];for(i=0;i<3;i++){s[i]=new Point(i,i+1);s[i]->Print();}for(i=0;i<3;i++) delete s[i];В данном случае сам массив указателей – статический, т.е. память под негозаказывать не надо.
Память следует выделить под каждый из объектов, а в завершенииработы выделенную память необходимо освободить.Д. Инициализированный статический массив указателей на объекты (рис. 1.4, д):Point *q[]={new Point(2,7),new Point(1,5),new Point(4,2)};for(i=0;i<3;i++){q[i]->Print();}for(i=0;i<3;i++) delete q[i];В этом случае память под объекты также выделяется динамически, а их адресазаносятся в статический массив указателей. Освобождение памяти выполняется в циклеотдельными кусками так, как она выделялась.Пример 1.16.
Обработка массивов динамических объектов.Рассмотрим программу, создающую массив из пяти динамических объектов,доступных через массив указателей на эти объекты, и массив из трех динамическихобъектов, доступных через указатель на первый объект массива.ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»40#include <locale.h>#include <string.h>#include <iostream>using namespace std;class sstr{private:char str[40];public:int x,y;void print(void){cout<<"Cодержимое полей : "<< endl;cout<<"x= "<<x<<" y= "<<y<<"str= "<<str<<endl;}sstr(){} // неинициализирующий конструкторsstr(int vx,int vy,char *vs="Cтрока по умолчанию"){setstr(vx,vy,vs); }~sstr() {} // деструкторvoid setstr(int ax,int ay,char *vs); /* инициализацияполей объекта */};voidsstr::setstr(int ax,int ay,char *vs){if (strlen(vs)>=40){strncpy(str,vs,40);str[40]='\0'; }else strcpy(str,vs);x=ax;y=ay;}void main(){setlocale(0,"russian");sstr*a[5],*c;// массив указателей на пять динамических объектов// указатель на массив динамических объектовint i,j;ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»41char *vs="Строка";//выделить память и инициализировать объектfor(int i=0;i<5;i++) // создать массив динамических объектовa[i]=new sstr(10+i,10+2*i,"aaaa"+i);cout<<"Массив объектов a"<<endl;for(i=0;i<5;i++) // вывести содержимое полей объектов{cout<<"Элемент "<< i+1;a[i]->print();}for(i=0;i<5;i++) delete a[i];// освободить памятьc=new sstr[3];// выделить память под три динамических объектаfor(i=0;i<3;i++)// инициализировать поля динамических объектов(c+i)->setstr(15+i,12+i*2,vs+i);cout<<"Массив объектов c"<<endl;// вывести содержимое полей объектовfor(i=0;i<3;i++){cout<<"Элемент "<< i+1;(c+i)->print();}delete []c; // освободить памятьsystem("pause");}ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»42Вопросы для самоконтроля1. Что такое класс в C++? Как выполнить описание класса?Ответ.2. Какие существуют способы ограничения доступа к компонентам класса? Как и гдеони используются? Чем отличается описание компонентных функций внутри и внеопределения класса?Ответ.3. Сформулируйте особенности конструкторов и деструкторов классов C++. Чтотакое неинициализирующий конструктор и чем он отличается от конструктора безпараметров?Когдаиспользованиеконструктора,вызываемогобезаргументов,необходимо?Ответ.4. Что такое копирующий конструктор? Назовите случаи, когда использованиетакого конструктора обязательно.Ответ.5.
Какие сложности возникают при работе с динамическими объектами?Ответ.ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»432Построение иерархии классов2.1НаследованиеНаследованием называют конструирование новых более сложных производныхклассов (классов-потомков) из уже имеющихся базовых классов (классов-родителей)посредством добавления полей и методов.
Это – эффективное средство расширенияфункциональных возможностей существующих классов без их перепрограммирования иповторной компиляции существующих программ.По определению компонентами производного класса являются:• компоненты базового класса, за исключением конструктора, деструктора икомпонентной функции, переопределяющей операцию «присваивания» (=) (см.