Главная » Просмотр файлов » Б. Страуструп - Язык программирования С++

Б. Страуструп - Язык программирования С++ (1119446), страница 56

Файл №1119446 Б. Страуструп - Язык программирования С++ (Б. Страуструп - Язык программирования С++) 56 страницаБ. Страуструп - Язык программирования С++ (1119446) страница 562019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

(*3) Определите класс LINT, эквивалентный классу RINT, но в нем для представления целогодолжно использоваться не менее 64 разрядов.11. (*4) Определите класс, реализующий арифметику с произвольной точностью. Подсказка: Придетсяиспользовать память так, как это делается в классе string.12. (*2) Напишите программу, в которой благодаря макрокомандам и перегрузке будет невозможноразобраться. Совет: определите для типа INT + как -, и наоборот; с помощью макроопределениязадайте int как INT. Кроме того, большую путаницу можно создать, переопределяя широкоизвестные функции, и используя параметры типа ссылки и задавая вводящие в заблуждениекомментарии.13. (*3) Обменяйтесь решениями упражнения [12] с вашим другом.

Попробуйте понять, что делает егопрограмма, не запуская ее. Если вы сделаете это упражнение, вам станет ясно, чего надо избегать.14. (*2) Перепишите примеры с классами complex ($$7.3), tiny ($$7.3.2) и string ($$7.11), не используядружественные функции. Используйте только функции-члены. Проверьте новые версии этих202Бьерн Страуструп.Язык программирования С++классов. Сравните их с версиями, в которых используются дружественные функции. Обратитесь купражнению 5.3.15.

(*2) Определите тип vec4 как вектор из четырех чисел с плавающей точкой. Определите для негофункцию operator[]. Для комбинаций векторов и чисел с плавающей точкой определите операции: +,-, *, /, =, +=, -=, *= и /=.16. (*3) Определите класс mat4 как вектор из четырех элементов типа vec4. Определите для негофункцию operator[], возвращающую vec4. Определите для этого типа обычные операции сматрицами. Определите в mat4 функцию, производящую преобразование Гаусса с матрицей.17.

(*2) Определите класс vector, аналогичный классу vec4, но здесь размер вектора должен задаватьсякак параметр конструктора vector::vector(int).18. (*3) Определите класс matrix, аналогичный классу mat4, но здесь размерности матрицы должнызадаваться как параметры конструктора matrix::matrix(int,int).19. (*3) Завершите определение класса CheckedPtrToT из $$7.10 и проверьте его. Чтобы определениеэтого класса было полным, необходимо определить, по крайней мере, такие операции: *, ->, =, ++ и--.

Не выдавайте динамическую ошибку, пока действительно не произойдет обращение поуказателю с неопределенным значением.20. (*1.5) Перепишите пример с программой подсчета слов из $$7.7 так, чтобы в ней не было заранеезаданной максимальной длины слова.203Бьерн Страуструп.Язык программирования С++ГЛАВА 8. ШАБЛОНЫ ТИПАВот ваша цитата- Бьерн СтрауструпВ этой главе вводится понятие шаблона типа. С его помощью можно достаточно просто определить иреализовать без потерь в эффективности выполнения программы и, не отказываясь от статическогоконтроля типов, такие контейнерные классы, как списки и ассоциативные массивы. Кроме того,шаблоны типа позволяют определить сразу для целого семейства типов обобщенные (генерические)функции, например, такие, как sort (сортировка).

В качестве примера шаблона типов и его связи сдругими конструкциями языка приводится семейство списочных классов. Чтобы показать способыполучения программы из в значительной степени независимых частей, приводится несколько вариантовшаблонной функции sort(). В конце определяется простой шаблон типа для ассоциативного массива ипоказывается на двух небольших демонстрационных программах, как им пользоваться.8.1 ВведениеОдним из самых полезных видов классов является контейнерный класс, т.е.

такой класс, которыйхранит объекты каких-то других типов. Списки, массивы, ассоциативные массивы и множества - все этоконтейнерные классы. С помощью описанных в главах 5 и 7 средств можно определить класс, какконтейнер объектов единственного, известного типа. Например, в $$5.3.2 определяется множествоцелых. Но контейнерные классы обладают тем интересным свойством, что тип содержащихся в нихобъектов не имеет особого значения для создателя контейнера, но для пользователя конкретногоконтейнера этот тип является существенным. Следовательно, тип содержащихся объектов долженпараметром контейнерного класса, и создатель такого класса будет определять его с помощью типапараметра.

Для каждого конкретного контейнера (т.е. объекта контейнерного класса) пользовательбудет указывать каким должен быть тип содержащихся в нем объектов. Примером такого контейнерногокласса был шаблон типа Vector из $$1.4.3.В этой главе исследуется простой шаблон типа stack (стек) и в результате вводится понятиешаблонного класса. Затем рассматриваются более полные и правдоподобные примеры несколькихродственных шаблонов типа для списка.

Вводятся шаблонные функции и формулируются правила, чтоможет быть параметром таких функций. В конце приводится шаблон типа для ассоциативного массива.8.2 Простой шаблон типаШаблон типа для класса задает способ построения отдельных классов, подобно тому, как описаниекласса задает способ построения его отдельных объектов. Можно определить стек, содержащийэлементы произвольного типа:template<class T>class stack {T* v;T* p;int sz;public:stack(int s) { v = p = new T[sz=s]; }~stack() { delete[] v; }void push(T a) { *p++ = a; }T pop() { return *--p; }int size() const { return p-v; }};Для простоты не учитывался контроль динамических ошибок. Не считая этого, пример полный и вполнеправдоподобный.

Префикс template<class T> указывает, что описывается шаблон типа с параметромT, обозначающим тип, и что это обозначение будет использоваться в последующем описании. Послетого, как идентификатор T указан в префиксе, его можно использовать как любое другое имя типа.Область видимости T продолжается до конца описания, начавшегося префиксом template<class T>.204Бьерн Страуструп.Язык программирования С++Отметим, что в префиксе T объявляется типом, и оно не обязано быть именем класса.

Так, ниже вописании объекта sc тип T оказывается просто char.Имя шаблонного класса, за которым следует тип, заключенный в угловые скобки <>, является именемкласса (определяемым шаблоном типа), и его можно использовать как все имена класса. Например,ниже определяется объект sc класса stack<char>:stack<char> sc(100);// стек символовЕсли не считать особую форму записи имени, класс stack<char> полностью эквивалентен классуопределенному так:class stack_char {char* v;char* p;int sz;public:stack_char(int s) { v = p = new char[sz=s]; }~stack_char() { delete[] v; }void push(char a) { *p++ = a; }char pop() { return *--p; }int size() const { return p-v; }};Можно подумать, что шаблон типа - это хитрое макроопределение, подчиняющееся правиламименования, типов и областей видимости, принятым в С++. Это, конечно, упрощение, но это такоеупрощение, которое помогает избежать больших недоразумений.

В частности, применение шаблонатипа не предполагает каких-либо средств динамической поддержки помимо тех, которые используютсядля обычных "ручных" классов. Не следует так же думать, что оно приводит к сокращению программы.Обычно имеет смысл вначале отладить конкретный класс, такой, например, как stack_char, прежде, чемстроить на его основе шаблон типа stack<T>. С другой стороны, для понимания шаблона типа полезнопредставить себе его действие на конкретном типе, например int или shape*, прежде, чем пытатьсяпредставить его во всей общности.Имея определение шаблонного класса stack, можно следующим образом определять и использоватьразличные стеки:stack<shape*> ssp(200);stack<Point> sp(400);void f(stack<complex>& sc)////////стек указателей на фигурыстек структур Pointпараметр типа `ссылка наcomplex'{sc.push(complex(1,2));complex z = 2.5*sc.pop();stack<int>*p = 0;p = new stack<int>(800);// указатель на стек целых// стек целых размещается// в свободной памятиfor ( int i = 0; i<400; i++) {p->push(i);sp.push(Point(i,i+400));}// ...}Поскольку все функции-члены класса stack являются подстановками, и в этом примере трансляторсоздает вызовы функций только для размещения в свободной памяти и освобождения.Функции в шаблоне типа могут и не быть подстановками, шаблонный класс stack с полным правомможно определить и так:template<class T> class stack {T* v;T* p;205Бьерн Страуструп.Язык программирования С++int sz;public:stack(int);~stack();void push(T);T pop();int size() const;};В этом случае определение функции-члена stack должно быть дано где-то в другом месте, как это ибыло для функций- членов обычных, нешаблонных классов.Подобные функции так жепараметризируются типом, служащим параметром для их шаблонного класса, поэтому определяютсяони с помощью шаблона типа для функции.

Если это происходит вне шаблонного класса, это надоделать явно:template<class T> void stack<T>::push(T a){*p++ = a;}template<class T> stack<T>::stack(int s){v = p = new T[sz=s];}Отметим, что в пределах области видимости имени stack<T> уточнение <T> является избыточным, иstack<T>::stack - имя конструктора.Задача системы программирования, а вовсе не программиста, предоставлять версии шаблонныхфункций для каждого фактического параметра шаблона типа. Поэтому для приводившегося вышепримера система программирования должна создать определения конструкторов для классовstack<shape*>, stack<Point> и stack<int>, деструкторов для stack<shape*> и stack<Point>, версиифункций push() для stack<complex>, stack<int> и stack<Point> и версию функции pop() дляstack<complex>.

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

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

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