ВУЗ:
Составители:
Рубрика:
19
};
Адрес перегруженной функции
Когда функция с некоторым именем используется без параметров, среди всех
функций с таким именем в текущей области видимости выбирается единственная, ко-
торая точно соответствует назначению. Назначением может быть: инициализируемый
объект; левая часть операции присваивания; формальный параметр функции; формаль-
ный параметр пользовательской операции; тип значения, возвращаемого функцией.
Отметим, что если f() и g() являются
перегруженными функциями, то для правильной
интерпретации f(&g) или эквивалентного выражения f(g) нужно рассмотреть пересече-
ние множеств выбора для f() и g(). Приведем пример:
int f(double);
int f(int);
int (*pfd)(double) = &f;
int (*pfi)(int) = &f;
int (*pfe)(...) = &f; // ошибка: несоответствие типов
Последняя инициализация ошибочна, не из-за неоднозначности, а потому, что
не определено ни одной функции f() типа int(...). Отметим, что не существует никакого
стандартного преобразования указателя на функцию одного типа
в указатель на функ-
цию другого типа. В частности, даже если B является общим базовым классом D, две
следующие инициализации недопустимы:
D* f();
B* (*p1)() = &f; // ошибка void g(D*);
void (*p2)(B*) = &g; // ошибка
Перегруженные операции
Перегружать можно большинство операций.
имя-функции-оператор:
operator операция
операция: один из
new delete + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >>
>>= <<= == != <= >= && || ++ -- , ->* -> () []
Две последние операции - это вызов функции и индексация. Можно перегружать
следующие (как бинарные, так и унарные) операции:
+ - * &
Нельзя перегружать следующие операции:
. .* :: ?: sizeof
а также и специальные символы препроцессора # и ##. Обычно функции, задающие
операции (функция-оператор) не вызываются явно
, к ним обращаются для выполнения
операций. Однако, к ним можно обращаться явно, например:
complex z = a.operator+(b); // complex z = a+b
void* p = operator new(sizeof(int)*n);
Функция-оператор может быть функцией-членом или иметь по крайней мере
один параметр типа класс или ссылка на класс. Нельзя изменить приоритет, порядок
выполнения или число операндов операции, но можно изменить предопределенное на-
значение таких операций: =, унарная
& и ,(запятой), если они применяются к объекту
типа класс. За исключением функции operator=(), функция-оператор наследуется. Экви-
валентность некоторых операций над основными типами (например, ++a эквивалентно
19 }; Адрес перегруженной функции Когда функция с некоторым именем используется без параметров, среди всех функций с таким именем в текущей области видимости выбирается единственная, ко- торая точно соответствует назначению. Назначением может быть: инициализируемый объект; левая часть операции присваивания; формальный параметр функции; формаль- ный параметр пользовательской операции; тип значения, возвращаемого функцией. Отметим, что если f() и g() являются перегруженными функциями, то для правильной интерпретации f(&g) или эквивалентного выражения f(g) нужно рассмотреть пересече- ние множеств выбора для f() и g(). Приведем пример: int f(double); int f(int); int (*pfd)(double) = &f; int (*pfi)(int) = &f; int (*pfe)(...) = &f; // ошибка: несоответствие типов Последняя инициализация ошибочна, не из-за неоднозначности, а потому, что не определено ни одной функции f() типа int(...). Отметим, что не существует никакого стандартного преобразования указателя на функцию одного типа в указатель на функ- цию другого типа. В частности, даже если B является общим базовым классом D, две следующие инициализации недопустимы: D* f(); B* (*p1)() = &f; // ошибка void g(D*); void (*p2)(B*) = &g; // ошибка Перегруженные операции Перегружать можно большинство операций. имя-функции-оператор: operator операция операция: один из new delete + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> () [] Две последние операции - это вызов функции и индексация. Можно перегружать следующие (как бинарные, так и унарные) операции: +-*& Нельзя перегружать следующие операции: . .* :: ?: sizeof а также и специальные символы препроцессора # и ##. Обычно функции, задающие операции (функция-оператор) не вызываются явно, к ним обращаются для выполнения операций. Однако, к ним можно обращаться явно, например: complex z = a.operator+(b); // complex z = a+b void* p = operator new(sizeof(int)*n); Функция-оператор может быть функцией-членом или иметь по крайней мере один параметр типа класс или ссылка на класс. Нельзя изменить приоритет, порядок выполнения или число операндов операции, но можно изменить предопределенное на- значение таких операций: =, унарная & и ,(запятой), если они применяются к объекту типа класс. За исключением функции operator=(), функция-оператор наследуется. Экви- валентность некоторых операций над основными типами (например, ++a эквивалентно
Страницы
- « первая
- ‹ предыдущая
- …
- 17
- 18
- 19
- 20
- 21
- …
- следующая ›
- последняя »