Главная » Просмотр файлов » Бьерн Страуструп

Бьерн Страуструп (947334), страница 43

Файл №947334 Бьерн Страуструп (Стpаустpуп - Книга о C++) 43 страницаБьерн Страуструп (947334) страница 432013-09-15СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

функции-члене можно неявно использовать указатель this. Наконец,

поскольку имена членов не являются глобальными именами, они обычно

оказываются короче, чем имен глобальных функций.

7.13 Предостережения

Как и всякое другое языковое средство, перегрузка операций может

использоваться разумно и неразумно. В частности, возможностью

придавать новый смысл обычным операциям можно воспользоваться

так, что программа будет совершенно непостижимой. Представьте,

каково будет читателю, если в своей программе вы переопределили

операцию + так, чтобы она обозначала вычитание. Описанный здесь

механизм перегрузки будет защищать программиста и пользователя от

таких безрассудств. Поэтому программист не может изменить ни

смысл операций над основными типами данных, такими, как int, ни

синтаксис выражений и приоритеты операций для них.

По всей видимости перегрузку операций имеет смысл использовать

для подражания традиционному использованию операций. Запись с обычным

вызовом функции можно использовать в тех случаях, когда традиционной

записи с базовой операцией не существует, или, когда набор операций,

которые допускают перегрузку, не достаточен, чтобы записать с его

помощью нужные действия.

7.14 Упражнения

1. (*2) Определите итератор для класса string. Определите операцию

конкатенации + и операцию += , значащую "добавить в конец строки".

Какие еще операции вы хотели бы и смогли определить для этого

класса?

2. (*1.5) Определите для строкового класса операцию выделения подстроки

с помощью перегрузки ().

3. (*3) Определите класс string таким образом, чтобы операцию

выделения подстроки можно было применять к левой части

присваивания. Вначале напишите вариант, в котором строку можно

присваивать подстроке той же длины, а затем вариант с различными

длинами строк.

4. (*2) Разработайте класс string таким образом, чтобы объекты

его трактовались при передаче параметров и присваивании как

значения, т.е. чтобы в классе string копировались сами представления

строк, а не только управляющие структуры.

5. (*3) Измените класс string из предыдущего упражнения так, чтобы

строки копировались только при необходимости. Это значит, что

нужно хранить одно общее представления двух одинаковых строк до

тех пор, пока одна из них не изменится. Не пытайтесь задать операцию

выделения подстроки, которую одновременно можно применять и к

левой части присваивания.

6. (*4) Определите класс string, обладающий перечисленными в

предыдущих упражнениях свойствами: объекты его трактуются как

значения, копирование является отложенным (т.е. происходит только

при необходимости) и операцию выделения подстроки можно применять

к левой части присваивания.

7. (*2) Какие преобразования типа используются в выражениях следующей

программы?

struct X {

int i;

X(int);

operator+(int);

};

struct Y {

int i;

Y(X);

operator+(X);

operator int();

};

extern X operator*(X,Y);

extern int f(X);

X x = 1;

Y y = x;

int i = 2;

int main()

{

i + 10; y + 10; y + 10 * y;

x + y + i; x * X +i; f(7);

f(y); y + y; 106 + y;

}

Определите X и Y как целые типы. Измените программу так, чтобы

ее можно было выполнить и она напечатала значения всех

правильных выражений.

8. (*2) Определите класс INT, который будет эквивалентен типу int.

Подсказка: определите функцию INT::operator int().

9. (*1) Определите класс RINT, который будет эквивалентен типу int,

за исключением того, что допустимыми будут только операции:

+ (унарный и бинарный), - (унарный и бинарный), *, / и %.

Подсказка: не надо определять RINT::operator int().

10. (*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), не используя дружественные функции.

Используйте только функции-члены. Проверьте новые версии этих

классов. Сравните их с версиями, в которых используются

дружественные функции. Обратитесь к упражнению 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

так, чтобы в ней не было заранее заданной максимальной длины

слова.

* ГЛАВА 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>. Отметим, что в префиксе 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); // стек структур Point

void f(stack<complex>& sc) // параметр типа `ссылка на

// complex'

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

Тип файла
Документ
Размер
4,26 Mb
Тип материала
Учебное заведение
Неизвестно

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

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