<<
>>

Перегруженные подпрограммы

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

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

362

Глава 13.
Подпрограммы

Языки С++, Java, Ada и C# содержат встроенные перегруженные подпрограммы. Например, многие классы в C++, Java и C# имеют перегруженные операции-конструкторы. Поскольку каждая версия перегруженной подпрограммы имеет уникальный профиль параметров, компилятор может однозначно различать вызовы с различными типами параметров. Конечно, все это совсем не просто. Если разрешены неявные приведения параметров, то процесс распознавания существенно усложняется. А что если после автоматического приведения фактических параметров будет зафиксировано совпадение с профилями параметров нескольких операций? Какая операция должна вызываться? Разработчик языка должен предусмотреть такую возможность и выбрать наиболее вероятный вариант.

Поскольку в языках C++, Java и C# разрешены смешанные выражения, то для однозначного определения вызываемой операции анализируется тип возвращаемого значения. Однако контекст вызова не всегда позволяет определить тип возвращаемого результата. Например, если в C++ две функции с одинаковым именем принимают параметр типа int, но одна возвращает результат типа int, а другая типа float, то компилятор не сможет выявить: какая версия должна быть использована.

В языках Ada, Java, C++, C# и F# программистам также позволяется писать множество версий подпрограмм с одинаковым именем. Более того, в C++, Java и C# большая часть перегруженных операций, создаваемых пользователями, является конструкторами.

К неоднозначным вызовам достаточно часто приводят перегруженные программы с параметрами по умолчанию. К примеру, рассмотрим следующий фрагмент на C++, в котором объявлены две перегруженные процедуры и показан один оператор вызова: void proc(float x = 0.0); void proc();

pr°c();

Вызов неоднозначен и приведет к ошибке компилятора.

В языках Ada, C++, Python и Ruby операции могут перегружаться пользователем. Допустим, что в языке Python пишется класс для поддержки арифметических операций над комплексными числами. Комплексное число представляется парой чисел с плавающей точкой. Класс Complex должен включать два элемента данных с именами re и im. Бинарная арифметическая операция здесь задается как вызов метода, направленный первому операнду, причем второй операнд указывается как

параметр вызова. Метод сложения имеет имя add . Например, для вычисления

x + y надо записать: x._ _add_ _(y)

Для перегрузки сложения, обеспечивающего обработку объектов нового класса Complex, нужно создать такое объявление: def add (self, second):

return Complex(self.re + second.re, self.im + second.im)

В большинстве языков для объектно-ориентированного программирования ссылка на текущий объект обозначается в вызове неявно. В языке Python эта

ссылка указывается явно, поэтому в качестве первого параметра метода_____ add__

записано: self.

Родовые подпрограммы

363

Для языка C++ подобный метод класса Complex можно описать в следующей форме:

Complex operator + (Complex &second) {

return Complex(re + second.re, im + second.im);

}

<< | >>

Еще по теме Перегруженные подпрограммы:

  1. СОВЕТЫ ПО ЗАКЛЮЧЕНИЮ БРАКА
  2. РЕКОМЕНДАЦИИ ПО ХАРАКТЕРАМ «111111 И БОЛЕЕ»
  3. е. Мазохизм (самонаказание).
  4. СОВЕТЫ ПО ЗАКЛЮЧЕНИЮ БРАКА
  5. ЗАИКАНИЕ
  6. Группы самопомощи
  7. ЗHАЧЕHИЕ КАСТ
  8. Восходящий узел в Деве, Нисходящий - в Рыбах.
  9. Сатурн в Деве
  10. 9.2. БАРЬЕРЫ ПАМЯТИ
  11. Осознающее эго
  12. Число 1
  13. ЧТО, ЕСЛИ ПОМОЩЬ НЕ ПРИДЕТ?
  14. ДИСПЛЕЙНАЯ ИГРА В ТРЕТИЙ ЛИШНИЙ