Страустрап Бьярн
Шрифт:
R.13.4.1 Унарные операции
Префиксную унарную операцию можно задать с помощью нестатической функции-члена (§R.9.3), без параметров или с помощью функции, не являющейся членом, с одним параметром. Таким образом, для всякой префиксной унарной операции @, выражение @x может интерпретироваться как x.operator@ или как operator@(x). Если описаны функции-операторы обоих видов, то какая из них будет использоваться при вызове, определяется правилами сопоставления параметров (§R.13.2). Постфиксные унарные операции, такие как ++ и --, объясняются в §R.13.4.7.
R.13.4.2 Бинарные операции
Бинарную операцию можно задать с помощью нестатической функции-члена (§R.9.3), имеющей один параметр, или с помощью функции, не являющейся членом, с двумя параметрами. Таким образом, для всякой бинарной операции @ выражение x@y может интерпретироваться как x.operator@(y) или как operator@(x,y). Если описаны функции-операторы обоих видов, то какая из них будет использоваться при вызове, определяется правилами сопоставления параметров (§R.13.2).
R.13.4.3 Присваивания
Функция присваивания operator= должна быть нестатической функцией-членом. Она не наследуется (§R.12.8). Более того, если пользователь не определил для класса X функцию operator=, то используется стандартная функция operator=, которая определяется как присваивание по членам для класса X.
R.13.4.4 Вызов функции
Вызов функции есть конструкция вида:
Она считается бинарной операцией, в которой первичное-выражение представляет первый операнд, а список-выражений (возможно пустой), - второй операнд. Именем, задающим функцию, служит operator, и вызов x(arg1,arg2,arg3) для объекта класса x интерпретируется как x.operator(arg1,arg2,arg3). Функция operator должна быть нестатической функцией-членом класса x.
R.13.4.5 Индексация
Индексация, определяемая как:
считается бинарной операцией. Выражение с индексацией x[y] для объекта класса x интерпретируется как x.operator[](y). Функция operator[] должна быть нестатической функцией-членом класса x.
R.13.4.6 Доступ к члену класса
Доступ к члену класса определяется с помощью операции -›:
Он считается унарной операцией. Для объекта класса x выражение x-›m интерпретируется как (x.operator-›)-›m. Отсюда следует, что функция operator-› должна возвращать или указатель на класс, или ссылку на класс, или объект класса, для которого определена функция operator-›. Она должна быть нестатической функцией-членом класса.
R.13.4.7 Инкремент и декремент
Функция с именем operator++ и с одним параметром задает для объектов некоторого класса операцию префиксного инкремента ++. Функция с именем operator++ и с двумя параметрами задает для объектов некоторого класса операцию постфиксного инкремента ++. Для постфиксной операции ++ второй параметр должен быть типа int, и, когда в выражении встречается операция постфиксного инкремента, функция operator++ вызывается со вторым параметром, равным нулю. Приведем пример:
Префиксные и постфиксные операции декремента - определяются аналогичным образом.
R.14 ШАБЛОНЫ ТИПА
R.14.1 Шаблоны типа
Шаблон типа определяет целое семейство типов или функций.