Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по С++.doc
Скачиваний:
49
Добавлен:
02.05.2014
Размер:
995.33 Кб
Скачать

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. X& X::operator=(const X& from) { // копирование по членам X }

R.13.4.4 Вызов функции

Вызов функции есть конструкция вида: первичное-выражение ( список-выражений opt ) Она считается бинарной операцией, в которой первичное-выражение представляет первый операнд, а список-выражений (возможно пустой), - второй операнд. Именем, задающим функцию, служит 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++ вызывается со вторым параметром, равным нулю. Приведем пример: class X { public: X operator++(); // префиксная ++a X operator++(int) // постфиксная a++ }; void f(X a) { ++a; // a.operator++(); a++; // a.operator++(0); a.operator++(); // явный вызов: действует как ++a; a.operator++(0); // явный вызов: действует как a++; } Префиксные и постфиксные операции декремента -- определяются аналогичным образом. R.14 ШАБЛОНЫ ТИПА R.14.1 Шаблоны типа Шаблон типа определяет целое семейство типов или функций. описание-шаблона-типа: template < список-параметров-шаблона-типа> описание список-параметров-шаблона-типа: параметр-шаблона-типа список-параметров-шаблона-типа , параметр-шаблона-типа параметр-шаблона-типа: параметр-типа описание-параметра параметр-типа: class идентификатор Конструкция описание в описании-шаблона-типа должна содержать описание или определение функции или класса. В конструкции параметр-типа идентификатор определяется как имя-типа в области видимости описания шаблона типа. Имена шаблонов типа подчиняются обычным правилам для областей видимости и контроля доступа. Конструкция описание-шаблона-типа считается описанием. Она может присутствовать в программе только как глобальное описание.