ВУЗ:
Составители:
Рубрика:
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*);
Страницы
- « первая
- ‹ предыдущая
- …
- 15
- 16
- 17
- 18
- 19
- …
- следующая ›
- последняя »