Программирование >>  Структурное программирование 

1 ... 74 75 76 [ 77 ] 78 79 80 ... 342


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

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



1 ... 74 75 76 [ 77 ] 78 79 80 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика