Читайте также:
|
|
Перегрузка - это практика предоставления более чем одного определения для данного имени функции в одной и той же области видимости. Возможность выбрать соответствующую версию функции, основываясь на типах и числе аргументов, с которыми она вызывается, предоставляется компилятору. При этом два типа данных считаются различными, если для них используются различные инициализаторы. Поэтому аргумент данного типа и ссылка на этот тип рассматриваются как одно и то же с точки зрения перегрузки. Например, объявление двух таких функций
int func (int); int func (int&);
приведет к ошибке, так как с точки зрения перегрузки они считаются одинаковыми.
Аргументы функции, относящиеся к некоторому типу, модифицированные const или volatile, не рассматриваются как отличные от базового типа с точки зрения перегрузки.
Указатели на const - и volatile -объекты также не рассматриваются как отличные от указателей на базовый тип с точки зрения перегрузки.
Однако механизм перегрузки может различать ссылки, которые имеют модификаторы const и volatile, и ссылки на базовый тип.
Вместе с тем на перегруженные функции накладываются несколько ограничений: > любые две перегруженные функции должны иметь различные списки параметров;
Объектно-ориентированное программирование
Лекция 7
Перегрузка операторов
> перегрузка функций с совпадающими списками аргументов на основе лишь типа возвращаемых ими значений недопустима;
> функции-члены не могут быть перегружены исключительно на основе того, что одна из них является статической, а другая - нет;
> все enum -типы данных рассматриваются как различные и могут использоваться для различения перегруженных функций;
> типы "массив (чего-то)" и "указатель (на что-то)" рассматриваются как идентичные с точки зрения перегрузки.
> typedef -определения не влияют на механизм перегрузки, так как они не вводят новых типов данных, а определяют лишь синонимы для существующих типов.
Например, следующее определение
typedef char* PSTR;
не позволит компилятору рассматривать две приведенные ниже функции
void SetVal (char* sz); void SetVal (PSTR sz);
как различные. Поэтому их одновременное объявление в классе вызовет ошибку.
Для многомерных массивов вторая и последующие размерности рассматриваются как часть типа данных. Поэтому они могут использоваться для различения перегруженных функций. Например, вполне допустимы следующие определения:
void SetVal (char S [ ]); void SetVal (char S [ ] [4]);
При объявлении перегруженных функций компилятор отслеживает объявления, данные в пределах одной и той же области видимости. Поэтому, если в производном классе объявлена функция с тем же именем, что и функция в базовом классе, функция из производного класса скрывает функцию базового класса вместо того, чтобы осуществлять перегрузку (так как их области видимости различны). Короче говоря, нельзя путать переопределение функций с перегрузкой. Точно также компилятор отслеживает и другие области видимости. Поэтому, так как функция, объявленная в области видимости файла, находится не в той же области видимости, что и функция, объявленная в блоке, даже если они имеют одинаковые имена, компилятор не рассматривает их как перегруженные. Локально объявленная функция просто скрывает глобально объявленную.
Дата добавления: 2015-11-26; просмотров: 40 | Нарушение авторских прав