logo search
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

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 идентификатор

Конструкция описание в описании-шаблона-типа должна содержать

описание или определение функции или класса.

В конструкции параметр-типа идентификатор определяется как имя-типа

в области видимости описания шаблона типа.

Имена шаблонов типа подчиняются обычным правилам для областей

видимости и контроля доступа. Конструкция описание-шаблона-типа

считается описанием. Она может присутствовать в программе только

как глобальное описание.