Главная » Просмотр файлов » Г. Шилдт - Полный справочник по C++

Г. Шилдт - Полный справочник по C++ (1109478), страница 60

Файл №1109478 Г. Шилдт - Полный справочник по C++ (Г. Шилдт - Полный справочник по C++) 60 страницаГ. Шилдт - Полный справочник по C++ (1109478) страница 602019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 60)

Это особеззззо важно п)зи создйнии динймическнх мйсснвов объекгой, кото)зыс„кйк нзйсстно, невозможно проннициализировйгь. Чтобы созд;пъ неинициализированный массив объектов и останнть возможность создания обьектов, которым присвоено некое начальное значение, слелует предусмотреть два варианта конструктора: с иззицийлизашзей и без нсе.

Рассмотрим в качестве примера программу,' в которой объявляются лва массива типа ромеев. Один из них инициализируется, а другой — нет. Кроме того, зги объекты хранятся в динамическом массиве. Вапс1иое <Товехеаи> взпс1ис)е спею> пауло палзеврасе все?з с1авв роюехв ( зпг хз раас з // Перегрузка конструктора роюехв() ( х = О; ) // по ъпъсза11вех роюехв(зпс и) ( х = и; ) // 1пзе[а11хех зпс десх() ( хеепхп хз ) уо?с) весх(ълс 1) ( х = зз ) ): з.пс йза1п() ( роюехв огтюо[) = (1, 2, 4, В, 16); // иннниализированнмл массив роюехв охТ?зхее[5)з // Неинициализированный массив роюехв *р; зп // Степени двойки соне « "Степени двойки: ?ох(1=0з зк5з 1+к) ( соне « охтюо[1).деех() « сопс « "зппп" з Степени тройки охт)зхее[О).веех(1); оОТ?злее[1).веех(3); охТ?зхее(2) .весх(9); оГТ?злее[3).веех(27)з Глава (4.

Перегрузка функций, конструкторы копирования и аргументы по умолчанию Ю7 ойтпгее [4] . зеех (81); // Выводим степени тройки созе « "Степени тройки: лог(1=0; 1<5; 1++) [ сосо « огтпгее[1].десхО « созе « " 1п1п" г // динамический массив сгу ( р = пеи роиетв[5]; // Без инициализации ) сассЬ (Ьас] а11ос ха) ( соил « "исключительная ситуацияМ"; гегцхп 1; // Инициализация динамического массива степенями двойки Вот(1=0; 1<5; 1++) ( р[1].веех(оГТио[1].пеех()); ) // Выводим степени двойки соце « "Степени двойки: Гол(1=0; 1<5; 1++) ( соме « р[1].яеех() < ) соцс « "1п1п"; г)е1еее [] Р' гесцтп 0; ) В этом примере оба конструктора необходимы.

Конструктор по умолчанию используется для создания неинициализированного массива оятикее и динамического массива, а конструктор с параметрамн вызывается для создания объектов, хранящихся в массиве патио. Конструктор копирования Одним нз важнейших видов перегруженного конструктора является коясгярукяюр копирования (сору сопя(гас(ог]. Он позволяет предотвратить проблемы, которые могут возникнуть при присваивании одного объекта другому. Рассмотрим проблему, для решения которой необходим конструктор копирования. По умолчанию, если один объект инициализируется другим, создастся побитовая копия присваиваемого объекта.

Иначе говоря, инициализируемому объекту присваивается его идентичная копия. Иногда побитовая копия оказывается неприемлемой. Обычно зто происходит, когда объект выделяет динамическую память. Например, допустим, что класс з(у С1авв вЫДЕЛЯЕт дИНамиЧЕсКую Память для каждогО СоЗДаааемого Объекта, а объект а является его экземпляром. Это значит, что объект ж уже выделил для себя динамическую память. Теперь предположим, по объект а инициализирует обьект в, как показано ниже. $ МуС1авв В = А) Часть И. Язык С++ Если при этом создается побитовая копия объекта л, то объект в будет точной кописи объекта ж Следовательно, объект в также будет ссылаться на обласп памяти, выделенную объектом л, не выделяя своп собственный учасгок.

Очевидно, это совсем не то, к чему мы стремились. Например, если класс иус1авв солсржит лсструктор, освобождающий память, то при уничтожении обьектов л и в олна и та же область памяти будет освобожлаться дважды! Эта проблема может возникнуть еще в двух ситуациях. Во-первых, когда функции передается копия параметра, и, во-вторых, когда создается временный объект, возвращаемый функцией. Напомним, что функция создает временный объект, в котором хранится возвращаемое ею значение. Для решения этих проблем прслназначен конструктор копирования, который не использует побитовое копирование.

Наиболес часто применяется следующая его форма. ичя кзасса(союзе или ьиасга Лссьти~ яе аг~ьехт) ( / / Те и конструктора ) Здесь ссьыка на абвеклг связана с объектом, стоящим в правой части инициализации. Конструктор копирования может иметь дополнительныс параметры. Однако в любом случае первым параметром должна быть ссылка на инициализирующий объект. Следует помнить, что существуют лве ситуации, в которых один объект может присваиваться другому.

Во-первых. при выполнении оператора присваивания. Вовторых, при инициализации, которую можно осуществить тремя способами. ° Явная инициализация, например, при обьявлении объекта. ° Создание копии объекта, передаваемого функции в качестве параметра, ь Создание временного объекта (чаще всего, при возарате значения функции). Конструктор копирования применяется только для инициализации. Рассмотрим класс мус1авв и его объект у.

Инициализация будет происходить при выполнении каждого из этих операторов. | щус1авв х - "уг // Объект у явно инициализируется объектом х гипс(у]г // Объект у передается как параметр у = йппс()," // Объекту у присваивается возвращаемый объект Рассмотрим программу, в которой необходим явный конструктор копирования. Эта программа создаст очень ограниченный и "безопасный" тип целочисленного массива, предотвращающий выход индекса за прелелы допустимого диапазона.

(В главе ) 5 описан более эффективный способ решения этой проблемы, основанный на перегрузке операторов.) С помощью оператора пеи каждому элементу массива вьщелястся динамическая гамять. Причем указатель на выделенную область памяти хранится внугри кажлого объекта. /* Программа создает "безопасный"тип массива. Поскольку память для каждого элемента массива вьглеляется с помощью оператора пеи, для их инициализации применяется конструктор копирования.

*/ Вьпс1ибе кьовсгеат> В(пс1ибе епеи> $1пс1ибе <свсб11Ь> цвлпд пащеврасе вебг с1авв актау ( ьпс *р; ьпе вьае: Глава )4. Перегрузка функций, конструкторы копирование и аргументы по умолчанию Ш риЬ11сз аггау(1пт зз) ( тту ( р = пеи 1пт[вз)з ) сасси (Ьай а11ос ха) соне « "исключительная ситуация1п"з еххе(ЕХтт ЕКПЛПЕ)з ) вхзе = взз -агтау() ( з)е1есе [).р; ) // Коне руктор копирования аттау(сопят актау аа)з чо1з) рит(1пс х, хпс 1) 1Е(1>=О са х<вхзе) р[1) хпг вес(1пс х) тееитп р[1); ) ): // Конструктор копирования атгауззатгау(сопев актау аа! 1пс з.З игу ( р = пеи хит[а.вхте)з саесЬ (Ьаз) а11ос ха) ( соис « "Исключительная ситуация1п"з ех1Е(ЕХ1Т ГА11ЛИЕ)з ) Ест(1=Оз 1<а.в1зез х++) р[з.) = а.р[з.) з ) з.пт юа1п() ( аттау пит(10) 1пе з.; Еог(з.=-Оз )<10з з++) пию.рис(1, з.) з Еот(1=вз х>=оз 1 †) соис « пию.дет(1) сове « "1п"з // Создается другой массив, который инициализируется // массивом пии аттау х(пию)з // Вызов конструктора копирования Еог(х=Оз х<10з х++) соис « х.дес(1)з гееитп Оз ) Рассмотрим, что произойдет, когда массив звяк инициализирует массив г< с помощьзо оператора я аггау х(пии); // Вызов конструктора копирования Часть! 1, Язык С++ При вызове конструктора копирования лля нового массива выделяется область динамической памяти.

Указатель на ее первую ячеику хранится в указателе и.р. Таким образом, объекты н и пюа содержат одинаковые элементы, однако кюкдый из них занимает отлельную область памяти. Если бы в программе нс использовался конструктор копирования, объекты и и п1ла занимали бы одну область динамической памяти. (Это значит, что указатели пша р и х.р содержали бы один и тот жс адрес.) Напомним, что конструктор копирования вызывается только для инициализации. Например, следующие операторы нс вызывают конструктор копирования. актау а(10); // актау Ь(10); Ь = а; // Конструктор копирования не вызывается В данном случае оператор Ь=а выполняет присваиванис одного объекта другому.

Если оператор присваивания не перегружен (как в данном случае), создается побитовая копия объекта, расположенного в его правой части. Следовательно, в некоторых ситуациях вспникает необходимость не только предусмотрель конструктор копирования, но и перегрузить оператор присваивания (см, главу ) 5). '-:-:~ Определение адреса перегруженой функции Как указано в главе 5, функция имеет адрес.

Этот адрес можно присвоить указателю, азатом вызывать функцию нс по имени, а через се указатель. Если функция не перегружена, этот процесс очень прост. Олнако для перегруженных функций ситуация немного сложнее. Чтобы понять причины этого, рассмотрим оператор, в котором указателю р присваивается адрес функции мудиле ( ) . $ р = юухцпс; Если функция в(г~шс О не перегружена, она существует в одном экземпля)рс, н компилятор без труда вычисляет се адрес.

Характеристики

Тип файла
DJVU-файл
Размер
7,03 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

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