Функция присваивания operator=() должна быть нестатической функцией-членом. Она не наследуется (§R.12.8). Более того, если пользователь не определил для класса X функцию operator=, то используется стандартная функция operator=, которая определяется как присваивание по членам для класса X.
X& X::operator=(const X& from)
{
// копирование по членам X
}
Вызов функции есть конструкция вида:
первичное-выражение ( список-выражений opt)
Она считается бинарной операцией, в которой первичное-выражение представляет первый операнд, а список-выражений (возможно пустой), - второй операнд. Именем, задающим функцию, служит operator(), и вызов x(arg1,arg2,arg3) для объекта класса x интерпретируется как x.operator()(arg1,arg2,arg3). Функция operator() должна быть нестатической функцией-членом класса x.
Индексация, определяемая как:
первичное-выражение [ выражение ]
считается бинарной операцией. Выражение с индексацией 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++;
}
Префиксные и постфиксные операции декремента - определяются аналогичным образом.
Шаблон типа определяет целое семейство типов или функций.
описание-шаблона-типа:
template ‹ список-параметров-шаблона-типа › описание
список-параметров-шаблона-типа:
параметр-шаблона-типа
список-параметров-шаблона-типа , параметр-шаблона-типа
параметр-шаблона-типа:
параметр-типа
описание-параметра
параметр-типа:
class идентификатор
Конструкция описание в описании-шаблона-типа должна содержать описание или определение функции или класса.
В конструкции параметр-типа идентификатор определяется как имя-типа в области видимости описания шаблона типа.
Имена шаблонов типа подчиняются обычным правилам для областей видимости и контроля доступа. Конструкция описание-шаблона-типа считается описанием. Она может присутствовать в программе только как глобальное описание.
R.14.2 Шаблоны типов для классов
Шаблон типа для класса определяет как будут строиться классы, подобно тому, как описание класса определяет как будут строиться объекты этого класса. Шаблон типа для класса vector можно описать следующим образом:
template‹class T› class vector {
T* v;
int sz;
public:
vector(int);
T& operator[](int);
T& elem(int i) { return v[i]; }
//…
};
Префикс template‹class T› показывает, что описывается шаблон типа, и что в этом описании используется имя-типа T, иными словами, vector - это параметризованный тип с параметром T.
Класс можно задать с помощью конструкции имя-шаблонного-класса:
имя-шаблонного-класса:
имя-шаблона-типа ‹ список-парам-шаблона-типа ›
список-парам-шаблона-типа:
парам-шаблона-типа
список-парам-шаблона-типа , парам-шаблона-типа
парам-шаблона:
выражение
Читать дальше