Бьерн Страуструп - Абстракция данных в языке С++ - Дальнейшие соглашения по нотации
ОГЛАВЛЕНИЕ
Дальнейшие соглашения по нотации
Удивительно, что ссылки - конструкция, которая во многом
подобна правилам "передачи параметров по имени" во многих языках,
- вводятся преимущественно для того, чтобы дать программисту
возможность определить семантику "передачи параметров по
значению". Ссылки используются также в некоторых других случаях,
включая, конечно,и передачу аргументов "по имени". В частности,
ссылки предоставляют возможность использовать нетривиальные
выражения в левой части операции присваивания. Рассмотрим тип
s t r i n g c операцией выделения подстроки:
class string {
. . .
void operator=(string &);
void operator= (char *);
string &operator()(int pos, int length);
};
где o p e r a t o r ( ) обозначает вызов функции.
Например:
string s1 = "asdf";
snring s2 = "ghjkl";
s1(1,2) = "xyz"; /* s1 = "axyzf" */
s2 = s1(0,3); /* s2 = "axy" */
Оба присваивания интерпретируются как:
s2.operator=(s1.operator()(0,3));
Функции o p e r a t o r безразлично, вызывается она в левой
или в правой части присваивания. Заботу об этом берет на себя
функция o p e r a t o r = .
Выборка элемента массива аналогично может быть перегружена
определением функции o p e r a t o r [ ].