Джон, справедливости ради, есть оператор приведения типа с синтаксисом operator Type () (arg) и оператор вызова функции Type operator()(args) - который используется в функторах в духе
class SomeFunctor {
public:
double operator() (double arg1, double arg2) { /*возвращает значение некоторой функции 2х аргументов*/ }
};
int main() {
SomeFunctor func;
double v = func(2.72, 3.14);
return 0;
}
Впрочем, у автора в исходном топике не нашёл ни того, ни другого: там оператор присваивания объявлен после индексного оператора.
Вообще, если я правильно понял,
sergeyan смущает количество скобок в объявлении operator[](int n), как и нотация описания операторов в целом.
Так вот,
sergeyan, то, что у операторов стоит до списка аргументов, следует считать частью имени объявляемой функции, просто имя такое, специфическое, особый случай в языке: пишется bool operator == (SomeType left, SomeType right), вызов его в коде выглядит просто как ==, в случае же operator[](int index) в коде будет object[index], а для SomeType operator()(args) - аналог вызова функции: object(args).
В принципе, можно вызвать оператор и по его полному имени, например, object.operator[](index), но это очень редко бывает нужно (и скорее всего, чтобы передать указатель на этот метод куда-нибудь, а не просто вызвать этот метод)
Для чего всё это сделано? Прежде всего, думаю, для того, чтобы компилятор и программист могли спокойно отличать конструкции, описывающие операторы, от всех прочих: ведь если убрать ключевое слово operator, может получиться что-то двусмысленное, сложно отличимое от простой опечатки.