|
Программирование >> Структурное программирование
3.20. Перегрузка функций С++ позволяет определить несколько функций с одним и тем же именем, если эти функции имеют разные наборы параметров (по меньшей мере разные типы параметров). Эта особенность называется перегрузкой функции. При вызове перегруженно функции компилятор С++ определяет соответствующую функцию путем анализа количества, типов и порядка следования аргументов в вызове. Перегрузка функции обычно используется для создания нескольких функций с одинаковым именем, предназначенных для выполнения сходных задач, но с разными типами данных. На рисунке 3.25 перегруженная функция square используется для расчета квадрата переменной типа int и квадрата переменной типа double. В главе 8 мы обсудим, как осуществлять перегрузку операций, чтобы они работали с объектами, имеющими тип данных, определенный пользователем. (В действительности, мы уже использовали к настоящему моменту перегруженные операции, включая операцию поместить в поток и операцию взять из потока . Мы еще обсудим перегрузку операций и в главе 8.) Раздел 3.21 познакомит нас с шаблонами функций, используемыми для выполнения идентичных задач с разными типами данных. В главе 12 шаблоны функций и шаблоны классов обсуждаются более подробно. I Использование перегруженных функций -ш #iriclude <iostream.h> int square(int x) { return x * x; } V: double square (double y) { return у * y; ] main() cout << Квадрат целого числа 7 равен square (7) endl << Квадрат числа 7.5 типа double равен square(7.5) << endl; t Щ return 0; t Квадрат целого числа 7 равен 49 Квадрат числа 7.5 типа double равен 56.25 Рис. 3.25. Использование перегруженных функций Типичная ошибка программирования 3.28 Попытка получить доступ к неглобальной переменной внешнего блока, используя унарную операцию разрешения области действия. Хороший стиль программирования 3.15 Избегайте использования в программе переменных с одинаковыми именами для разных целей. Хотя это и допускается в различных случаях, но может приводить к путанице. double square(double у) { return у * у; } void nothing(int а, float b, char с, int *d) { } пустое тело функции char *nothing2(char a, int b, float *c, double *d) { return 0; } main I { return 0; public main public @nothing2Sqzcipfpd public @nothingl$qifzcpi public {3square$qd public @squareSqi Рис. 3.26. Декорирование имен для обеспечения надежного согласования типов Хороший стиль программирования 3.16 Перегруженные функции, которые выполняют тесно связанные задачи, делают про граммы более понятными и легко читаемыми. Перегруженные функции различаются с помощью их сигнатуры - комбинации имени функции и типов ее параметров. Компилятор кодирует идентификатор каждой функции по числу и типу ее параметров (иногда это называется декорированием имени), чтобы иметь возможность осуществлять надежное связывание типов. Надежное связывание типов гарантирует, что вызывается надлежащая функция и что аргументы согласуются с параметрами. Компилятор выявляет ошибки связывания и выдает сообщения о них. Программа на рис. 3.26 была скомпилирована компилятором Borland С-Ы-. Вместо показа результатов работы программы (как мы обычно делали раньше), мы привели на рис. 3.26 декорированные имена функций на языке ассемблер, полученные с помощью Borland С++. Каждое декорированное имя начинается с символа @, предшествующего имени функции. Закодированный список параметров начинается с символов $q. В списке параметров для функции nothing2 zc соответствует типу char, i соответствует типу int, pf соответствует типу float * и pd соответствует типу double *. В списке параметров для функции nothingl, i соответствует типу int, f соответствует типу float *, zc соответствует типу char и pi соответствует типу int *. Две эти функции square отличаются своими списками параметров; одна определяет d как double, а другая определяет i как int. Типы возвращаемых значений функций не отражаются в декорированных именах. Декорирование имен функций - специфика компилятора. Перегруженные функции могут иметь и различные типы возвращаемых значений, но обязательно должны иметь различные списки параметров. ,4?. Декорирование имен S square (int х) { return х * х; } 3.21. Шаблоны функции Перегруженные функции обычно используются для выполнения сходных операций над различными типами данных. Если операции идентичны для каждого типа, это можно выполнить более компактно и удобно, используя шаблоны функций - свойство, введенное в последней версии С-Ы-. Программист пишет единственное определение шаблона функции. Основываясь на типах аргументов, указанных в вызовах этой функции, С-Н- автоматически генерирует разные функции для соответствующей обработки каждого типа. Таким образом, определение единственного шаблона определяет целое семейство решений. Все определения шаблона функции начинаются с ключевого слова template, за которым следует список формальных типов параметров функции, заключенный в угловые скобки (< и >). Каждый формальный тип параметра предваряется ключевым словом class. Формальные типы параметров - это встроенные типы или типы, определяемые пользователем. Они используются для задания типов аргументов функции, для задания типов возвращаемого значения функции и для объявления переменных внутри тела описания функции. После шаблона следует обычное описание функции. Следующее определение шаблона функции используется в программе, приведенной на рис. 3.27. template <class Т> Т maximum(T valuel, Т value2, Т value3) { Т max = valuel; if (value2 > max) max = value2; if (value3 > max) max = value3; return max; Этот шаблон функции объявляет единственный формальный параметр Т как тип данных, который должен проверяться функцией maximum. Когда Типичная ошибка программирования 3.29 Создание перегруженных функций с идентичными списками параметров и различ ными типами возвращаемых значений приводит к синтаксической ошибке. Для различения функций с одинаковыми именами компилятор использует только списки параметров. Перегруженные функции не обязательно должны иметь одинаковое количество параметров. Программисты должны быть осторожными, имея дело с перегруженными функциями с параметрами по умолчанию, поскольку это может стать причиной неопределенности. Типичная ошибка программирования 3.30 Функция с пропущенными аргументами по умолчанию может оказаться вызванной аналогично другой перегруженной функции; это синтаксическая ошибка.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |