Страница 13 из 25 Дальнейшие соглашения по нотации Удивительно, что ссылки - конструкция, которая во многом подобна правилам "передачи параметров по имени" во многих языках, - вводятся преимущественно для того, чтобы дать программисту возможность определить семантику "передачи параметров по значению". Ссылки используются также в некоторых других случаях, включая, конечно,и передачу аргументов "по имени". В частности, ссылки предоставляют возможность использовать нетривиальные выражения в левой части операции присваивания. Рассмотрим тип 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 [ ]. |