книга (И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++), страница 5
Описание файла
Файл "книга" внутри архива находится в папке "И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++". PDF-файл из архива "И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++", который расположен в категории "". Всё это находится в предмете "практикум (прикладное программное обеспечение и системы программирования)" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 5 страницы из PDF
.){. . .return *this;}};3.8. Указатель на член классаКроме адресации областей памяти, содержащих информационные объекты,указатели могут содержать адреса членов класса. Технологию созданияи использования таких указателей легче описать с использованием конкретного примера, операторы которого подробно прокомментированы:class X{int i;public:Х() {i = 1;}int f1(int j){cout << "print i" << i << "\n";return j;}int f2(int j){cout << "reset i \n"; i = 1;return j;}int f3(int j){cout << "set i \n"; i = j;return j;}};typedef int (Х::* pf)(int); // см.
комментарий 1)int main(){int k, sw, par;25Классы и объекты С++x b;pf ff;. . .switch (sw){case 1: ff=&x::f1;break;case 2: ff=&x::f2;break;case 3: ff=&x::f3;};k = (b.*ff)(par);. . .return 0;// см. комментарий 2)// см. комментарий 3)// см. комментарий 4)}Комментарии:1) ключевое слово typedef вводит новое имя для типа:typedef int (Х::* pf)(int);где pf — тип указателя на метод класса X с одним входным параметром типа int и типом возвращаемого значения — int.2) pf ff; — создание объекта ff, имеющего введенный тип pf.3) ff = &Х::f1; — указателю ff присваивается адрес одного из методовкласса. Доступ к этому методу по данному указателю через какой-либо объект невозможен (оператор ff = &b.f1; — неверен). Делов том, что указатель на член класса представляется для нестатических членов не абсолютным, а относительным адресом, то естьсмещением относительно базового адреса класса (указатель на статический член класса представляет собой истинный адрес).4) k = (b.* ff)(par); — разыменование указателя на нестатический методкласса дает доступ к коду по относительному адресу, который применяется к базовому адресу конкретного объекта (в данном случае — объекта b).ПримечаниеВ случае объявления методов статическими членами (см.
раздел «Статическиечлены класса») идентификатор pf необходимо объявить обычным указателемна функцию:typedef int (* pf)(int);Разыменование объекта такого типа представляется обычным разыменованием указателя на функцию:k = (*ff)(par);Применение техники разыменования указателя на метод класса является проявлением динамического полиморфизма, когда исполняемый коддля одного и того же оператора (k = (b.*ff)(par)) определяется на этапе исполнения, а не компиляции. в большей мере динамический полиморфизмреализуется виртуальными функциями, описываемыми в следующих разделах.26Конструкторы и деструкторыГлава 4.Конструкторыи деструкторыКонструкторы и деструкторы являются специальными методами класса.Конструкторы вызываются при создании объектов класса и отведении памяти под них.
Деструкторы вызываются при уничтожении объектови освобождении отведенной для них памяти.В большинстве случаев конструкторы и деструкторы вызываются автоматически (неявно) соответственно при описании объекта (в момент отведения памяти под него) и при уничтожении объекта. Конструктор (каки деструктор) может вызываться и явно, например, при создании объектав динамической области памяти с помощью операции new.Так как конструкторы и деструкторы неявно входят в интерфейс объекта, их следует располагать в открытой области класса.ПримечаниеКонструкторы и деструкторы могут располагаться и в закрытой области дляблокирования возможности неявного создания объекта. Но в этом случае явное создание объекта возможно только при использовании статических методов, являющихся частью класса, а не конкретного объекта.
Статическиеметоды описываются далее.Отличия и особенности описания конструктора от обычной функции:1) имя конструктора совпадает с именем класса;2) при описании конструктора не указывается тип возвращаемогозначения.Следует отметить, что и обычная процедура может не возвращать значения, а только перерабатывать имеющиеся данные. в этом случае при описании соответствующей функции указывается специальный тип возвращаемого значения void.В описании конструктора тип возвращаемого значения не указываетсяне потому, что возвращаемого значения нет. Оно как раз есть. Ведь результатом работы конструктора в соответствии с его названием является созданный объект того типа, который описывается данным классом.
Страуструп отмечал, что конструктор — это то, что область памяти превращаетв объект.Конструкторы можно классифицировать разными способами:1) по наличию параметров:27Конструкторы и деструкторыбез параметров,— с параметрами;—2) по количеству и типу параметров:— конструктор умолчания,— конструктор преобразования,— конструктор копирования,— конструктор с двумя и более параметрами.Набор и типы параметров зависят от того, на основе каких данныхсоздается объект.В классе может быть несколько конструкторов.
в соответствиис правилами языка С++ все они имеют одно имя, совпадающее с именемкласса, что является одним из проявлений статического полиморфизма.Компилятор выбирает тот конструктор, который в зависимости от ситуации,в которой происходит создание объекта, удовлетворяет ей по количествуи типам параметров. Естественным ограничением является то, что в классе неможет быть двух конструкторов с одинаковым набором параметров.Деструкторы применяются для корректного уничтожения объектов.Часто процесс уничтожения объектов включает в себя действия по освобождению выделенной для них по операциям new памяти.Имя деструктора: ~имя_классаУ деструкторов нет параметров и возвращаемого значения.В отличие от конструкторов деструктор в классе может быть толькоодин.Пример:Описание класса.class box{int len, wid, hei;public:box ( int l, int w, int h ){len = l; wid = w; hei = h;}box(int s){len = wid = hei = s;}box(){len = 2; wid = hei = 1;}int volume(){return len * wid * hei;}};28Конструкторы и деструкторы4.1.
Конструктор умолчанияКонструктор без параметров называется конструктором умолчания. Еслидля создания объекта не требуется каких-либо параметров, то используетсяконструктор умолчания. При описании таких объектов после имени классауказывается только идентификатор переменной:class Х { … };Х x1;ЗамечаниеРоль конструктора умолчания может играть конструктор, у которого все параметры имеют априорные значения, например:box (int l = 24, int w = 12, int h = 6);4.2. Конструктор преобразованияи конструкторы с двумяи более параметрамиЕсли для создания объекта необходимы параметры, то они указываютсяв круглых скобках после идентификатора переменной:box b2(1,2,3);box b3(5);Указываемые параметры являются параметрами конструктора класса.Если у конструктора имеется ровно один входной параметр, который непредставляет собой ссылку на свой собственный класс, то соответствующийконструктор называется конструктором преобразования.
Этот конструкторназывается так в связи с тем, что в результате его работы на основе объектаодного типа создается объект другого типа (типа описываемого класса).Если уже описан класс T и описывается новый класс X, то его конструкторы преобразования могут иметь любой из следующих прототипов:X(T);X(T&);X(const T&);Последний прототип служит для защиты от изменения передаваемогофактического параметра в теле конструктора, так как при получении ссылкина фактический параметр используется собственно передаваемый объект, ане его локальная копия.29Конструкторы и деструкторыПримечаниеВыделение в отдельную группу конструкторов с двумя и более параметрами,независимо от их типа, является в некотором смысле, условным.
Так, например, если есть два класса: Vector и Matrix, то для создания соответствующих объектов:Vector v1(10);Matrix m1(10,15);используется в первом случае один параметр, а во втором случае — два параметра. Таким образом, в первом случае объект создается с помощью конструктора преобразования, а во втором случае, с формальной точки зрения, спомощью конструктора с двумя параметрами, хотя в обоих случаях фактическивыполняется одна и та же процедура: создание объекта на основе заданныхчисловых параметров.Как уже было отмечено, если у параметра конструктора преобразованияимеется априорное значение, и при описании объекта явно не задается фактический параметр, этот конструктор играет роль конструктора умолчания.Пример:class X{int x1;public:X(int px1 = 0}};Для такого класса будут верны следующие объявления объектов:int main(){… Х x1, x2(1); …}4.3. Конструктор копированияПри создании объекта его информационные члены могут быть проинициализированы значениями полей другого объекта этого же типа, то есть объектсоздается как копия другого объекта.Для такого создания объекта используется конструктор копирования.Инициализация может быть выполнена аналогично инициализациипеременных встроенных типов с использованием операции присваиваниясовместно с объявлением объекта:box b5(2,4,6); // создание объекта типа box с// использованием числовых данныхbox b6 = b5;// создание объекта b6 — копии объекта b530Конструкторы и деструкторыЕсли инициализация производится объектом такого же типа, то объект-инициализатор также может быть указан в круглых скобках после идентификатора создаваемого объекта:box b7(b5);Свод ситуаций, в которых используется конструктор копирования,описаны ниже.Если класс не предусматривает создания внутренних динамическихструктур, например, массивов, создаваемых с использованием операции new,то в конструкторе копирования достаточно предусмотреть поверхностноекопирование, то есть почленное копирование информационных членовкласса.Конструктор копирования, осуществляющий поверхностное копирование, можно явно не описывать, он сгенерируется автоматически.Если же в классе предусмотрено создание внутренних динамическихструктур, использование только поверхностного копирования будет ошибочным, так как информационные члены-указатели, находящиеся в разныхобъектах, будут иметь одинаковые значения и указывать на одну и ту жеразмещенную в динамической памяти структуру.