Г. Шилтд - Самоучитель C++ (DJVU), страница 14

DJVU-файл Г. Шилтд - Самоучитель C++ (DJVU), страница 14 Практика расчётов на ПЭВМ (2538): Книга - 3 семестрГ. Шилтд - Самоучитель C++ (DJVU): Практика расчётов на ПЭВМ - DJVU, страница 14 (2538) - СтудИзба2019-05-08СтудИзба

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

DJVU-файл из архива "Г. Шилтд - Самоучитель C++ (DJVU)", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр DJVU-файла онлайн

Распознанный текст из DJVU-файла, 14 - страница

~ / с1аяя уопгс1аяя ( 3п~ а, Ь; рпЬ11с: ~отс( вес(ъпС 1, пг 11 ( а = ; Ь = З; 1 ъотс( впои(1 ( сооЬ « а « ' ' « Ь « "1п"г 1пЬ гааьп(1 ( гаус1аяяо1; уоигс1аяя о2; о1.яее(10, 41; Самоучитель С++ о2 = о11 // ОШИБКА, присваивание объектов разных типов о1. зЬох(); о2 . яьои (); те(нгп 0; Несмотря на то что классы в)ус!азз и уаигс!азв физически одинаковы, они трактуются компилятором как разные, поскольку имеют разные имена типов. 2.

Важно понимать, что все данные-члены одного объекта при выполнении присваивания присваиваются данным-членам другого объекта. Это относится и к сложным данным, таким как массивы. Например, в следующей версии уже знакомого нам класса атас!( символы реально помещаются только в стек в1, но после выполнения присваивания массив з!сЫ объекта я2 также содержит символы а, Ь и с. (т(пс1ис(е <Боя~геев> ия(ПВ ПантЕяраСЕ ЗсС(Г ((с(ельне Б!ХЕ 10 // Объявление класса я(асК для символов с!аяя ягас]с ( онат ясов(я1ье] ( // содержит стек пп соз; // индекс вершины стека рпЫьс: зсаск(); // конструктор чоЫ рпзЬ(спал сЬ); // помещает в стек символ сЬаг рор(); // выталкивает символ из стека // ((нициализацил стека ясас1::зсаск() ( соус « "Работа конструктора стека~п"; 'соя = 0; // Помещение символа в стек чоЫ ясас)<::рпзь(сЬат сЬ) (Г (сОЗ==31аК) ( сорб « "Стек полон ~п"; теСптп; яСск[ооя] = с)н соя+~; Глаза 3.

)7одробное изучение классов 85 Выталкивание символа из стека сваг агаси::рор() ( (соя=-О) соцб « "Отек пуст Ы" 1 гегпгп О; // возврат куля при пустом стеке соз--1 ге1пгп згсК[1оз) 1 1пб патп () // Образование двух, автоматически инициализируемых стеков яГас)< я1, я2; 1пб 1; з1.рияЬ ( ' а'); з1.рпзЬ ( 'Ь'); з1.рпяЬ('с') 1 копирование я1 в з2 = я11 // теперь я2 и я1 идентичны Гог (1=01 1<3; 1-~-~,у бог (1=0; 1<2; 1-и-) гебпгп О; 3. При присваивании одного объекта другому необходимо быть очень внима-. тельным. Например, рассмотрим несколько измененный класс я1г1уре, который мы изучали в главе 2.

Попытайтесь найти ошибку в этой программе. // Эта программа содержит ошибку ()1пс1вбе <1оясгеаы> ()бпс1вбе <сз1г[пв> ()бпс1ибе <сягб)(Ь> пя1па пагпсярасс ягб; с[аяя я1г1урс сЬаг *р; [п1 1еп; рпЬ11с: зсгсуре(сЬаг *рсг) -ягткуре ( ); уо[б яЬои (); совб « "ськчвол из я1:'" « я1.рор,') « "~п" г сонг « "символ из я2:" « в2.рор() << н',и"; 86 Самоучитель зггеуре:: зсгсуре(спаг 'рсг) ( 1еп=згг1еп(рсг]; р-(спаг *) па11ос(1еп+1); 1г((р) ( сопл « "Ошибка выделения памятиХп"; екьс (1); ) зсгсру(р, ргг) ' згггуре::-зсг1уреО ( сош « "Освобождение памяти по адресу р1п"; ггее(р) р ~ отс( зсгсуре:: зпои О сопс « р « " — длина: " « 1еп; сон(. « "~п"; ьпс шаге () вкггуре з1("Это проверка"), з2("Мне нравится С++") з1.

впои () з2.виси() з1 присваивается а2 — это ведет к ошибке я2 = з1; з1.зЬох() г з2 . знои() ) гебагп 0; Ошибка в этой программе весьма коварна. Когда создаются объекты з1 и з2, то для хранения в этих объектах строк выделяется память. Указатель на выделенную каждому объекту память хранится в переменной р. Когда объект з1г(уре удаляется, эта память освобождается.

Однако когда объект з1 присваивается объекту з2, то указатель р объекта з2 начинает указывать на ту же самую область памяти, что и указатель р объекта з1. Таким образом, когда эти объекты удаляются, то память, на которую указывает указатель р объекта з1, освобождается дважды, а память, на которую до присваивания указывал указатель р объекта з2, не освобождается вообще. Хотя в данном случае эта ошибка и не опасна, в реальных программах с динамическим распределением памяти она может вызвать крах программы. Как показано в этом примере, при присваивании одного объекта другому вы 87 Глава 3.

Подробное изучение классов должны быть уверены в том, что не удаляете нужную информацию, которая может понадобиться в дальнейшем. 1, Что неправильно в следующем фрагменте? // В этой программе есть ошибка ()ьпс1ос)е <1овстеага> пв)пя пагпсврасс вТс); с1авв с11 ( гпт1, з; рпЬ11с: с).1()пг а, )пт ь) ( ) = а; ) = ь~ // )' с1аса с12 (пе рпЬ11с: с12(1пс а, гпс Ь) ( ) = а; з — — Ь; ) // гпГ аъа1п ( ) с11 х(10 20) р с12 у(о, о); х=у; 2. Используя класс с(цеце, который вы создали в главе 2, раздел 2.1, упражнение 1, покажите, как один объект, который мы назвали очередь, можно присвоить другому. 3.

Если класс с)цеце из предыдущего вопроса для хранения очереди требует динамического выделения памяти, то почему в такой ситуации одну очередь нельзя присвоить другой? 3.2. Передача объектов функциям Объекты можно передавать функциям в качестве аргументов точно так же, как передаются данные других типов. Просто объявите параметр функции, как имеющий тип класса, и затем используйте объект этого класса в качест- Самоучитель С++ ве аргумента при вызове функции. Как и для данных других типов, по умолчанию объекты передаются в функции по значению.

"Приме 1. В этом коротком примере объект передается функции: ((фпс1цс(е <фозсгеап~> цвфпр пашеврасе зсо; с1авв напр фпг 1; рцЫ1с: валр(1пг п) ( 1 = и; ) фпб Яее 1() ( гебцгг. 1; Возвращает квадрат о.1. 1пс зог 1с (валпр о) ( гегцгп о.ееТ 1() * о.цег 1(); (дб л~а1п() ( залр а(10), )з(2) с соцс « всат фд(а) « "1п"; соцз « вог фб()з) сс "~п"; гесс гп 0; В этой программе создается класс ваыр, который содержит одну целую переменную и Функция авг 11() получает аргумент типа аатр, а возвращаемым значением является квадрат переменной 1 этого объекта. Результат работы программы — это значения 100 и 4. 2. Как уже установлено методом передачи параметров в С++, включая объекты, по умолчанию является передача объекта по значению. Это означает, что внутри функции создается копия аргумента и зта копия, а не сам объект, используется функцией.

Поэтому изменение копии объекта внутри функции не влияет на сам объект. Это иллюстрируется следующим примером: / Запомните, объекты, как и другие параметры, передаются функции по значению и при этом в функции создается копия обьекта. таким образом, изменение параметра внутри функции не влияет на объект, используемый в вызове. )'пава 3. подробное изучение классов ()1пс1ис(е <ьоястеап~> цяъпд патеярасе яЫ; с1аяя яаюр ьп рцЬ11с: аатпр(з.пс и) ( ' = и; уо)с1 яес 1(ьпт и) ( = = и; ) 1пс дев 1() ( гесагп 1; l Заменяет перементпю о.ъ ее квадратом. Однако зто не влияет на объект, используемый для вызова функции асс фс () */ чоЫ яхт 1Е (яаюр о) ( о,аес 1( о.дет 1() * о.пес 1() ); « о.аее 1',) сопя « "Для копии объекта а значение 1 равно: соцт « "Хп"; 1пс гяаьп() ( яаюр а (10); яс)к фс(а); // передача объекта а по значению сопя « "но переменная а.

1 в функции таъп() не изменилась: сопя « а-ЯЕС 1(); l~ выводится 10 ге" ц=п О; В результате работы программы на экран выводится следующее: Для копии объекта а значение ( равно: 100 но переменная а. 1 в функции аафп () нс изменилась: 10 3. Как и в случае с переменными других типов, функции может быть передано не значение объекта, а его адрес. В этом случае функция может изменить значение аргумента, используемого в вызове.

Например, в рассматриваемом ниже варианте программы из предыдущего примера значение объекта, чей адрес используется при вызове функции а((г !$О, действительно меняется. /* Теперь функции яг(г ъе() передается адрес объекта и функция может изменить значение аргумента, адрес которого используется при вызове, Ъ' ()1пс1цс)е <1озетеалй ля~ по пап1еярасе ясо; 90 Самоучитель С++ с1авз яапа ( фпп 1; ри)з1 1 с: загар (1пв и) ( 1 = гн 'УО16 зев 1 (1пе и) ( 1 =- и," 1пп дев 1 () ( певпвп 1; /" Заменяет переменную о,1 се квадратом. Это влияет на объект, используемый при вызове ф чоЫ здг Ы (авар *о) о->зев 1 (о->деТ з.() * о->дег.

1 ( ) ); оопп « "Дпч объекта а значение 1 равно: " « о->две 1 (); оопп « "~п"9 фпб п~а1п() затр а (10) здг Тй (аа); // функции здг Тй ( ) передан адрес объекта а соп' « "теперь значение обьекта а в функпии пафп() изменилось;"; сопб « а . дег 1 ( ); // выводится 100 тевптп 0; Теперь результат работы программы следующий: Для объекта а значение ! равно: 100 Теперь значение объекта а в функции твафп() изменилось. !00 4. Если при передаче объекта в функцию делается его копия, это означает, что появляется новый объект. Когда работа функции, которой был передан объект, завершается, то копия аргумента удаляется. Возникают два вопроса.

Вопервых, вызывается ли конструктор объекта, когда создается его копия? Вовторых, вызывается ли деструктор объекта, когда эта копия удаляется? Ответ на первый вопрос может показаться неожиданным. Когда при вызове функции создается копия объекта, конструктор копии ие вызывается. Смысл этого понять просто. Поскольку конструктор обычно используется для инициализации некоторых составляющих объекта, он не должен вызываться при создании копии уже существующего объекта. Если бы это было сделано, то изменилось бы содержимое объекта, поскольку при передаче объекта функции необходимо его текущее, а не начальное состояние.

Глава 3. Подробное изучение классов Однако если работа функции завершается и копия удаляется, то деструктор копии вызывается. Это происходит потому, что иначе оказались бы невыполненными некоторые необходимые операции. Например, для копии может быть выделена память, которую, после завершения работы функции, необходимо освободить. Итак, при создании копии объекта, когда он используется в качестве аргумента функции, конструктор копии не вызывается. Однако, когда копия удаляется (обычно это происходит при возвращении функцией своего значения), вызывается ее деструктор.

Следующая программа иллюстрирует зги положения: 1)гпс1пс(е <~овггеап> из(пя пагпезрасе вгФ с)авв затр ( пг роЬ1 з.с: зепи(гпг п) ( и; соп1 « "Работа конструктора~п"; ) -ватр() ( соп1 сс "Работа деструктора~п"; ) 1п1 пег 1() ( ге1игп 1; Возвращает квадрат переменной о,1 1п'с ес(х' гг (ватпр о) ( геспгп о.пег 1() * о.дег г(); ) гпг гаага () ( еагр а (10) ~ содг « век гг (а) « "~п"; гегегп 0; Эта программа выводит следующее: Работа конструктора 100 Работа деструктора Работа деструктора Обратите внимание, что конструктор вызывается только один раз.

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