Главная » Все файлы » Просмотр файлов из архивов » PDF-файлы » Г. Шилтд - Самоучитель C++ (PDF)

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

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

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

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

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

Текст 15 страницы из PDF

set ( s ) ;return str;int mainf){samp ob;/ / возвращаемое значение присваивается объекту obob = input (); // Это ведет к ошибкеob. show () ;return 0;Здесь показан результат работы программы:Введите строку: ПриветОсвобождение памяти по адресу sОсвобождение памяти по адресу sПриветОсвобождение памяти по адресу sNull pointer assignmentОбратите внимание, что деструктор класса samp вызывается трижды. Первыйраз, когда локальный объект str выходит из области видимости при возвращении функцией input() своего значения.

Второй раз ~samp() вызываетсятогда, когда удаляется временный объект, возвращаемый функцией input().Запомните, когда объект возвращается функцией, автоматически генерируется невидимый (для вас) временный объект, который и хранит возвращаемоезначение. В этом случае временный объект — это просто копия объекта str,являющегося возвращаемым значением функции. Следовательно, после тогокак функция возвратила свое значение, выполняется деструктор временногообъекта. И наконец, при завершении программы вызывается деструктор объекта ob в функции таш().Проблема в этой ситуации в том, что при первом выполнении деструкторапамять, выделенная для хранения вводимой с помощью функции input()строки, освобождается. Таким образом, при двух других вызовах деструкторакласса samp не только делается попытка освободить уже освобожденныйблок динамической памяти, но в процессе работы происходит разрушениесамой системы динамического распределения памяти и, как доказательствоэтому, появляется сообщение "Null pointer assignment".

(В зависимости отвашего компилятора, модели используемой памяти и тому подобного припопытке выполнить программу это сообщение может и не появиться.)Ключевым моментом в понимании проблемы, описанной в этом примере,является то, что при возвращении функцией объекта для временного объекта, который и является возвращаемым значением функции, вызывается дест-Глава 3. Подробное изучение классов97руктор. (Как вы узнаете в главе 5, для решения проблемы в такой ситуацииможно воспользоваться конструктором копий.)Для внимательного изучения вопроса, когда при возвращении функциейобъекта для него вызываются конструктор и деструктор, создайте класс who.Конструктор who должен иметь один символьный аргумент, который будетиспользоваться для идентификации объекта. При создании объекта конструктор должен выводить на экран сообщение:Создание объекта who #xгде х — идентифицирующий символ, свой для каждого объекта.

При удалении объекта на экран должно выводиться примерно такое сообщение:Удаление объекта who #xгде х — снова идентифицирующий символ. Наконец, создайте функциюmake_who(), которая возвращает объект who. Присвойте каждому объектууникальное имя. Проанализируйте выводимый на экран результат работыпрограммы.2. Продумайте ситуацию, в которой, как и при неправильном освобождении динамической памяти, возвращать объект из функции было бы также ошибочно.3.4. Дружественные функции: обзорВозможны ситуации, когда для получения доступа к закрытым членам класса вам понадобится функция, не являющаяся членом этого класса. Для достижения этой цели в C++ поддерживаются дружественные функции (friendfunctions).

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

Вам наверняка когда-нибудь понадобится функция, которая имела бы доступ к закрытым членам двух или более разныхклассов. Рассмотрим, как создать такую функцию.Дружественная функция задается так же, как обычная, не являющаяся членом класса, функция. Однако в объявление класса, для которого функциябудет дружественной, необходимо включить ее прототип, перед которымставится ключевое слово friend. Чтобы понять, как работает дружественнаяфункция, рассмотрим следующую короткую программу:gg___Самоучитель C++H Пример использования дружественной функции#include <iostream>using namespace std;class myclass (int n, d;public:myclass (int i, int j) { n = i; d = j; }// объявление дружественной функции для класса myclassfriend int isfactor (myclass ob) ;};/* Здесь представлено определение дружественной функции.

Онавозвращает истину, если n делится без остатка на d. Отметьте, чтоключевое слово friend в определении функции isf actor () неиспользуется.*/int isfactor (myclass ob){if(!(ob.n % ob.d)) return 1;else return 0;}int main{)myclass obi (10, 2), ob2(13, 3);if (isfactor (obi) cout « "10 без остатка делится на 2\п";else cout « "10 без остатка не делится на 2\п";if (isfactor (ob2) cout « "13 без остатка делится на 3\п";else cout « "13 без остатка не делится на 3\п";return 0;В этом примере в объявлении класса myclass объявляются конструктор идружественная функция isfactorQ. Поскольку функция isfactor() дружественна для класса myclass, то функция isfactorQ имеет доступ к его закрытойчасти. Поэтому внутри функции isfactor() можно непосредственно ссылаться на объекты ob.n и ob.d.Важно понимать, что дружественная функция не является членом класса,для которого она дружественна.

Поэтому невозможно вызвать дружественную функцию, используя имя объекта и оператор доступа к члену класса(точку или стрелку). Например, по отношению к предыдущему примеру этаинструкция неправильна:obi. is factor () ; // неправильно, isf actor () — это не функция-членГлава 3. Подробное изучение классов99На самом деле дружественная функция должна вызываться точно так же,как и обычная функция.Хотя дружественная функция "знает" о закрытых элементах класса, для которого она является дружественной, доступ к ним она может получить только через объект этого класса. Таким образом, в отличие от функции-членаmyclass, в котором можно непосредственно упоминать переменные п и d,дружественная функция может иметь доступ к этим переменным только через объект, который объявлен внутри функции или передан ей.В предыдущем разделе был рассмотрен важный момент.

Когда функция-члениспользует закрытый элемент класса, то это делается непосредственно, поскольку функция-член выполняется только с объектами данного класса. Таким образом, если в функции-члене класса упоминается закрытый элементэтого класса, то компилятор знает, к какому объекту этот закрытый элементотносится, поскольку знает, с каким объектом при вызове функции-членасвязана функция. Однако дружественная функция не связана с каким бы тони было объектом. Просто ей предоставлен доступ к закрытым элементамкласса. Поэтому дружественная функция не может работать с закрытымичленами класса без упоминания конкретного объекта.Поскольку дружественные функции — это не члены класса, им обычно передается один или более объектов класса, для которого они являются дружественными. Так было сделано, например, в случае с функцией isfactorQ Ейбыл передан объект ob класса myclass.

Поскольку функция isfactor() дружественна для класса myclass, она может иметь доступ к закрытым элементамэтого класса через объект ob. Случись так, что функция isfactorQ не была быдружественной для класса myclass, она не имела бы доступа ни к объектуob.n, ни к объекту ob.d, поскольку переменные п и d — это закрытые членыкласса myclass.Дружественная функция — это не член класса и она не может быть заданачерез имя объекта. Она должна вызываться точно так же, как и обычнаяфункция.Дружественная функция не наследуется. Поэтому если в базовый классвключается дружественная функция, то эта дружественная функция не является таковой для производных классов.Другим важным моментом, относящимся к дружественным функциям, является то, что функция может быть дружественной более чем к одному классу.100Самоучитель C++1.

Обычно дружественная функция бывает полезна тогда, когда у двух разныхклассов имеется нечто общее, что необходимо сравнить. Например, рассмотрим следующую программу, в которой создаются классы саг (легковая машина) и truck (грузовик), причем оба содержат в закрытой переменнойскорость соответствующего транспортного средства:^include <iostream>using namespace std;class truck; // предварительное объявлениеclass car {int passengers;int speed;public:car(int p, int s) { passengers = p; speed = s; }friend int sp_greater (car c, truck t) ;class truck {int weight;int speed;public:truck(int w, int s) { weight = w; speed = s; }friend int sp_greater (car c, truck t) ;/* Возвращает положительное число, если легковая машина быстреегрузовика.

Возвращает 0 при одинаковых скоростях. Возвращаетотрицательное число, если грузовик быстрее легковой машины.*/int sp_greater (car c, truck t){return с. speed — t. speed;iIint main()int t;car cl(6, 55), c2 (2, 120) ;truck tl (10000, 55), t2(2000Q, 72);cout « "Сравнение значений cl и tl:\n";t = sp_greater (cl, tl);if(t<0) cout « "Грузовик быстрее. \п";else if (t==0) cout « "Скорости машин одинаковы. \п";else cout « "Легковая машина быстрее. \п";Глава 3. Подробное изучение классовЮ1cout « "ХпСравнение значений с2 и t 2 : \ n " ;t - sp_greater(c2, t 2 ) ;if(t<0) cout « "Грузовик быстрее. \n";else if(t==Q) cout « "Скорости машин одинаковы.

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