|
Программирование >> Структурное программирование
12.4. Перегрузите шаблон функции printArray, приведенный на рис. 12.2, добавив два дополнительных параметра, а именно, int low-Subscript и int highSubscript. В результате вызова этой функции должна выводиться только часть массива с индексами, ограниченными этими параметрами. Введите проверки допустимых значений highSubscript и lowSubscript. Если какой-то из них не лежит в допустимых пределах или если highSubscript имеет значение, не большее, чем значение lowSubscript, то перегруженная функция printArray должна возвращать нулевое значение; в противном случае printArray должна возвращать число выведенных элементов. После этого измените функцию main, чтобы проверить обе версии функций printArray на массивах а, b и с. Постарайтесь протестировать все возможности обеих версий printArray. 12.5. Перегрузите шаблон функции printArray (см. рис. 12.2) версией не шаблонной функции, выводящей массивы символьных строк в удобном табличном формате, по столбцам. 12.6. Напишите простой шаблон предикатной функции isEqualTo, которая сравнивает два своих параметра при помощи оперяции проверки равенства (==) и возвращает 1, если они равны, и О, если не равны. Используйте этот шаблон функции в программе, которая вызывает isEqualTo с различными встроенными типами аргументов. Затем напишите отдельную версию программы, которая вызывает isEqualTo с определяемым пользователем типом и не перегруженной операцией равенства. Что случится, когда вы попытаетесь выполнить эту программу? Теперь перегрузите операцию равенства (используйте функцию-операцию operator==). Что получится, если теперь вы попытаетесь выполнить эту программу? 12.7. Используя нетиповой параметр numberOfElements и параметр типа elementType, создайте шаблон класса Array, который мы сконструировали в главе 8, Перегрузка . С помощью этого шаблона будут создаваться экземпляры класса Array с заданным числом элементов указанного типа, определенным во время компиляции. 12.8. Напишите программу, в которой используется шаблон класса Array. Из этого шаблона может быть получен представитель класса Array для любого типа элемента. Переопределите шаблон явным описанием класса Array для типа float (class Array<float>). В программе драйвере создайте экземпляр класса Array типа int при помощи шаблона и покажите, что при создании экземпляра класса Array типа float используется явное описание класса: class Array<float>. 12.9. Объясните различие между шаблоном функции и шаблонной функцией. 12.10. Что можно сравнить с трафаретом, шаблон класса или шаблонный класс? Аргументируйте ваш ответ. 12.11. Какова связь между шаблонами функций и перегрузкой? 12.12. Почему предпочтительнее использовать шаблоны функций, а не макросы? 12.13. Как может отразиться на эффективности программы использование шаблонов функций и шаблонов классов? 12.14. При вызове функции компилятор подбирает шаблонную функцию, соответствующую данному вызову. При каких обстоятельствах этот процесс подбора заканчивается ошибкой компиляции? 12.15. Почему нередко шаблон класса называют параметризованным типом? 12.16 Объясните, почему вы можете использовать оператор Array<Employee> workerList (100); в программе на C+-I- с шаблонными классами. 12.17. Проверьте ваш ответ на упражнение 12.16. Объясните теперь, почему вы могли бы использовать определение Array<Employee> workerList; В программе на С++ с шаблонными классами. 12.18. Объяснить использование следующей нотации в программе С++, использующей шаблонные классы: template<class Т> Аггау<Т>::Array(int s) 12.19. Объясните, почему шаблоны для классов контейнеров типа массив или стек часто используют нетиповые параметры? 12.20. Опишите, как нужно определить класс для специфического типа, чтобы переопределить шаблон класса именно для этого типа. 12.21. Опишите связь между шаблонами класса и наследованием. 12.22 Предположим, что шаблон класса имеет заголовок template<class Т1> class С1 Опишите отношения дружественности, возникающие, если внутри шаблона класса поместить приведенные ниже операторы, объявляющие друзей. Идентификаторы, начинающиеся с символа f являются функциями, идентификаторы, начинающиеся с символа С - классы, а идентификаторы с начальным символом Т обозначают любой тип (т. е. встроенный тип или тип класса). a) friend void f1(); b) friend void f2(C1<T1> &); c) friend void C2::f4(); d) friend void C3<T1>::f5(C1<T1> &); e) friend class C5; f) friend class C6<T1>; 12.23. Предположим, что шаблон класса Employee имеет статический элемент данных count. Предположим далее, что из этого шаблона класса получены три шаблонных класса. Сколько копий статического элемента данных будут иметься в этом случае? Как будет использоваться каждая из них (если они вообще будут существовать)? глава Обработка исключений Цели Понять, что такое исключения и как они обрабатываются. Научиться использовать блоки try для обработки, которая должна выполняться при возникновении исключения. Научиться генерировать исключения в точке их возникновения. Научиться использовать блоки catch для описания обработчиков исключений. Понять, как обрабатываются неперехваченные и непредусмотренные исключения.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |