Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка 8.docx
Скачиваний:
3
Добавлен:
25.11.2018
Размер:
30.55 Кб
Скачать

16. Приведите пример сигнатур, различие которых не позволяет

использовать их для перегрузки функций.

Некоторые сигнатуры, различаясь между собой, не могут сосуществовать. Например, рассмотрим два таких прототипа:

double cube(double x) ;

double cube(double & x) ;

Можно предположить, что это именно тот случай, когда вы можете воспользоваться перегрузкой функций, так как создается впечатление, что сигнатуры обеих функций различны. Однако подойдем к этой ситуации с точки зрения компилятора. Предположим, мы имеем такой программный код:

cout << cube(x) ;

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

17. Когда целесообразно использовать перегрузку функции.

Перегрузка функций вам может показаться исключительно удобным средством, тем не менее, не злоупотребляйте им. Следует зарезервировать перегрузку функций для функций, которые выполняют почти одни и те же действия, но с различными типами данных. Наряду с этим вы, вероятно, захотите проверить, сможете ли добиться тех же целей с помощью использования аргументов, заданных по умолчанию. Например, если вы захотите заменить одну функцию left(), ориентированную на обработку строк, на две перегруженные функции,

используйте следующее выражение:

char * left (const char * str, unsigned n) ; // два

аргумента

char * left (const char * str) ; // один аргумент

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

18.Шаблоны функций. Правила оформления. Пример.

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

вместо которых могут быть подставлены конкретные типы, такие как, например, int или double. Передавая тип в качестве параметра, вы можете заставить компилятор генерировать функцию этого конкретного типа. Поскольку шаблоны позволяют программировать на основе обобщенных типов без использования специализации, этот процесс иногда называют обобщенным программированием. Поскольку типы представлены параметрами, шаблоны функций иногда называют параметризированными типами.

Используйте шаблоны в тех случаях, когда вам нужны функции, применяющие один и тот же алгоритм к различным типам данных. Если перед вами не стоит проблема обратной совместимости и если вас не пугает перспектива вывода на печати более длинного слова, используйте при объявлении типов параметров ключевое слово typename вместо ключевого слова class.

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