Вход/Регистрация
Справочное руководство по C++
вернуться

Страустрап Бьярн

Шрифт:

Преобразования с помощью конструктора (§R.12.1) и с помощью функции преобразования (§R.12.3.2) равноправны.

struct X {

 operator int;

};

struct Y {

 Y(X);

};

Y operator+(Y,Y);

void f(X a, X b)

{

 a+b; // ошибка, неоднозначность:

// operator+(Y(a), Y(b)) или

// a.operator int + b.operator int

}

R.13.3 Адрес перегруженной функции

Когда функция с некоторым именем используется без параметров, среди всех функций с таким именем в текущей области видимости выбирается единственная, которая точно соответствует назначению. Назначением может быть:

• инициализируемый объект (§R.8.4);

• левая часть операции присваивания (§R.5.17);

• формальный параметр функции (§R.5.2.2);

• формальный параметр пользовательской операции (§R.13.4);

• тип значения, возвращаемого функцией (§R.8.2.5).

Отметим, что если 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(…).

Отметим, что не существует никакого стандартного преобразования (§R.4) указателя на функцию одного типа в указатель на функцию другого типа (§R.4.6). В частности, даже если B является общим базовым классом D, две следующие инициализации недопустимы:

D* f;

B* (*p1) =&f; // ошибка

void g(D*);

void (*p2)(B*) =&g; // ошибка

R.13.4 Перегруженные операции

Перегружать можно большинство операций.

имя-функции-оператор:

 operator операция

операция: один из

 new delete

 + - * / % ^ & | ~

 ! = ‹ › += -= *= /= %=

 ^= &= |= ‹‹ ›› ››= ‹‹= == !=

 ‹= ›= && || ++ -- , -›* -›

[]

Две последние операции - это вызов функции (§R.5.2.2) и индексация (§R.5.2.1).

Можно перегружать следующие (как бинарные, так и унарные) операции:

+ - * &

Нельзя перегружать следующие операции:

. .* :: ?: sizeof

а также и специальные символы препроцессора # и ## (§R.16).

Обычно функции, задающие операции (функция-оператор) не вызываются явно, к ним обращаются для выполнения операций (§R.13.4.1, §R.13.4.2).

Однако, к ним можно обращаться явно, например:

complex z = a.operator+(b); // complex z = a+b

void* p = operator new(sizeof(int)*n);

Операции new и delete описаны в §R.5.3.3 и §R.5.3.4 и к ним не относятся перечисляемые ниже правила.

Функция-оператор может быть функцией-членом или иметь по крайней мере один параметр типа класс или ссылка на класс. Нельзя изменить приоритет, порядок выполнения или число операндов операции, но можно изменить предопределенное назначение таких операций: =, унарная & и ,(запятой), если они применяются к объекту типа класс. За исключением функции operator=, функция-оператор наследуется. Правила для operator= даны в §R.12.8.

Эквивалентность некоторых операций над основными типами (например, ++a эквивалентно a+=1) может не сохраняться для таких же операций над классами. Для некоторых операций требуется, чтобы в случае использования основных типов операнд был адресом (например, для +=). Это требование может быть снято, если операция задана над классами.

Перегруженная операция не может иметь стандартные значения параметров (§R.8.2.6).

Операции, которые явно не указаны в §R.13.4.3-§R.13.4.7, действуют как обычные унарные или бинарные операции, подчиняющиеся правилам, приведенным в §R.13.4.1 или §R.13.4.2.

  • Читать дальше
  • 1
  • ...
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: