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

UptoLike

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 эквивалентно