Объектно-ориентированное программирование. Богомолов А - 17 стр.

UptoLike

17
Перегрузка
Говорят, что имя перегружено, если для него задано несколько различных опи-
саний функций в одной области видимости. При использовании имени выбор правиль-
ной функции производится путем сопоставления типов формальных параметров с ти-
пами фактических параметров, например:
double abs(double);
int abs(int);
abs(1); // вызов abs(int)
abs(1.0); // вызов abs(double)
Поскольку при любом типе T и для самого T , для и T& допустимо одно и
то же
множество инициализирующих значений, функции, типы параметров которых разли-
чаются только использованием, или не использованием ссылки, не могут иметь одина-
ковые имена, например:
int f(int i)
{
// ...
}
int f(int& r) // ошибка: типы функций
{ // недостаточно различны
// ...
}
Аналогично, поскольку для любом типе T для самого T, const T и volatile T до-
пустимо одно и то же множество инициализирующих значений, функции, типы пара
-
метров которых отличаются только указанной спецификацией, не могут иметь одина-
ковые имена. Однако, различить const T&, volatile T& и просто T& можно, поэтому до-
пустимы определения функций с одним именем, которые различаются только в указан-
ном отношении. Аналогично, допустимы определения функций с одним именем, типы
параметров которых различаются только как типы вида const T*, volatile T* и просто
T*. Не
могут иметь одинаковые имена функции, которые отличаются только типом
возвращаемого значения. Не могут иметь одинаковые имена функции-члены, одна из
которых статическая, а другая нет. С помощью конструкции typedef не создаются но-
вые типы, а только определяется синоним типа, поэтому функции, которые отличаются
только за счет использования типов, определенных с помощью typedef,
не могут иметь
одинаковые имена. Приведем пример:
typedef int Int;
void f(int i) { /* ... */ }
void f(Int i) { /* ... */ } // ошибка: переопределение f
С другой стороны все перечисления считаются разными типами, и с их помо-
щью можно различить перегруженные функции, например:
enum E { a };
void f(int i) { /* ... */ }
void f(E i) { /* ... */ }
Типы параметров, которые различаются только тем, что в одном используется
указатель *, а в другом массив [], считаются идентичными. Напомним, что для типа па-
раметра важны только второй и последующие индексы многомерного массива. Под-
твердим сказанное примером:
f(char*);
                                        17

                                      Перегрузка
       Говорят, что имя перегружено, если для него задано несколько различных опи-
саний функций в одной области видимости. При использовании имени выбор правиль-
ной функции производится путем сопоставления типов формальных параметров с ти-
пами фактических параметров, например:
       double abs(double);
       int abs(int);
       abs(1); // вызов abs(int)
       abs(1.0); // вызов abs(double)
      Поскольку при любом типе T и для самого T , для и T& допустимо одно и то же
множество инициализирующих значений, функции, типы параметров которых разли-
чаются только использованием, или не использованием ссылки, не могут иметь одина-
ковые имена, например:
       int f(int i)
       {
       // ...
       }

        int f(int& r) // ошибка: типы функций
        {              // недостаточно различны
        // ...
        }
       Аналогично, поскольку для любом типе T для самого T, const T и volatile T до-
пустимо одно и то же множество инициализирующих значений, функции, типы пара-
метров которых отличаются только указанной спецификацией, не могут иметь одина-
ковые имена. Однако, различить const T&, volatile T& и просто T& можно, поэтому до-
пустимы определения функций с одним именем, которые различаются только в указан-
ном отношении. Аналогично, допустимы определения функций с одним именем, типы
параметров которых различаются только как типы вида const T*, volatile T* и просто
T*. Не могут иметь одинаковые имена функции, которые отличаются только типом
возвращаемого значения. Не могут иметь одинаковые имена функции-члены, одна из
которых статическая, а другая нет. С помощью конструкции typedef не создаются но-
вые типы, а только определяется синоним типа, поэтому функции, которые отличаются
только за счет использования типов, определенных с помощью typedef, не могут иметь
одинаковые имена. Приведем пример:
        typedef int Int;
        void f(int i) { /* ... */ }
        void f(Int i) { /* ... */ } // ошибка: переопределение f
       С другой стороны все перечисления считаются разными типами, и с их помо-
щью можно различить перегруженные функции, например:
        enum E { a };
        void f(int i) { /* ... */ }
        void f(E i) { /* ... */ }
       Типы параметров, которые различаются только тем, что в одном используется
указатель *, а в другом массив [], считаются идентичными. Напомним, что для типа па-
раметра важны только второй и последующие индексы многомерного массива. Под-
твердим сказанное примером:
        f(char*);