Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1

Кент Рейсдорф. BORLAND C++BUILDER. Страница 68

Компилятор видит, что функции передаются два числа типа float и вы­зывает соответствующую версию multiply(). Аналогичным образом, если пере­даются два целых числа, будет вызвана целочисленная версия multiply().

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

int DoSomething(); void.DoSomething();

Если вы попытаетесь откомпилировать программу, содержащую подобные стро­ки, то получите сообщение об ошибке Type mismatch in redeclaration of 'DoSometh- ingO' (Несоответствие типа в повторном объявлении 'DoSomethingO'). Эти две функции должны различаться не только возвращаемым значением, чтобы быть перегруженными.

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

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

Приведение типов

Перегруженные функции работают превосходно, пока вы используете при их вызове правильные типы данных. Но что делать, если типы не со­впадают? В этом случае необходимо использовать приведение типов.

Web-дизайн (с) 2010 - 2017 All rights reserved