Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

8. Выполните п. 4, используя функцию

get
.

9. Добавьте шаблонную функцию

set
, чтобы можно было изменить значение val.

10. Замените функции

get
и
set
оператором
operator[]
.

11. Напишите константную и неконстантную версии оператора

operator[]
.

12. Определите функцию

template<class T> read_val(T& v)
, выполняющую ввод данных из потока
cin
в переменную
v
.

13. Используйте функцию

read_val
, чтобы считать данные в каждую из переменных, перечисленных в п. 3, за исключением переменной
S<vector<int>>
.

14. Бонус: определите класс

template<class T> istream& operator<<(istream&, vector<T>&)
так, чтобы функция
read_val
также обрабатывала переменную
S<vector<int>>
. Не забудьте выполнить тестирование после каждого этапа.

Контрольные вопросы

1. Зачем нужно изменять размер вектора?

2. Зачем нужны разные векторы с разными типами элементов?

3. Почему мы раз и навсегда не резервируем большой объем памяти для векторов?

4. Сколько зарезервированной памяти мы выделяем для нового вектора?

5. Зачем копировать элементы вектора в новую память?

6. Какие операции класса

vector
могут изменять размер вектора после его создания?

7. Чему равен объект класса

vector
после копирования?

8. Какие две операции определяют копию вектора?

9. Какой смысл имеет копирование объектов класса по умолчанию?

10. Что такое шаблон?

11. Назовите два самых полезных вида шаблонных аргументов?

12. Что такое обобщенное программирование?

13. Чем обобщенное программирование отличается от объектно-ориентированного программирования?

14. Чем класс

array
отличается от класса
vector
?

15. Чем класс

array
отличается от массива встроенного типа?

16. Чем функция

resize
отличается от функции
reserve
?

17. Что такое ресурс? Дайте определение и приведите примеры.

18. Что такое утечка ресурсов?

19. Что такое принцип RAII? Какие проблемы он решает?

20. Для чего предназначен класс

auto_ptr
?

Термины

Упражнения

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

1. Напишите шаблонную функцию, складывающую векторы элементов любых типов, допускающих сложение.

2. Напишите шаблонную функцию, получающую в качестве аргументов объекты типов

vector<T> vt
и
vector<U> vu
и возвращающую сумму всех выражений
vt[i]*vu[i]
.

3. Напишите шаблонный класс

Pair
, содержащий пары значений любого типа. Используйте его для реализации простой таблицы символов, такой как в калькуляторе (см. раздел 7.8).

4. Превратите класс

Link
из раздела 17.9.3 в шаблонный. Затем выполните заново упр. 13 из главы 17 на основе класса
Link<God>
.

5. Определите класс

Int
, содержащий единственный член типа
int
. Определите конструкторы, оператор присваивания и операторы
+
,
–
,
*
и
/
. Протестируйте этот класс и при необходимости уточните его структуру (например, определите операторы
<<
и
>>
для обычного ввода-вывода).

6. Повторите предыдущее упражнение с классом

Number<T>
, где
T
— любой числовой тип. Попытайте добавить в класс
Number
оператор
%
и посмотрите, что получится, когда вы попробуете применить оператор
%
к типам
Number<double>
и
Number<int>
.

7. Примените решение упр. 2 к нескольким объектам типа

Number
.

8. Реализуйте распределитель памяти (см. раздел 19.3.6), используя функции

malloc
и
free
(раздел Б.10.4). Создайте класс
vector
так, как описано в конце раздела 19.4, для работы с несколькими тестовыми примерами.

  • Читать дальше
  • 1
  • ...
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: