Перегруженные подпрограммы
Перегруженная подпрограмма — это подпрограмма, имя которой совпадает с именем другой подпрограммы в той же области видимости. Каждая версия перегруженной подпрограммы должна иметь свой уникальный протокол, иначе говоря, она должна отличаться от других версий количеством, порядком, типами своих параметров, а также типом возвращаемого значения (если это функция). Смысл оператора вызова перегруженной подпрограммы задается списком фактических параметров, а также типом возвращаемого значения (при вызове функции).
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); }
Еще по теме Перегруженные подпрограммы:
-
Windows -
Архитектура компьютера -
Интернет -
Информатика -
Компьютер -
Компьютерные и телекоммуникационные системы -
Программирование -
Социальные сети -
-
Английский язык -
Астрология -
Астрономия -
Биология -
Военная литература -
Журналистика -
Компьютерная инженерия -
Педагогика -
Право -
Психология -
Социология -
Lecture.Center
|