Бьерн Страуструп - Абстракция данных в языке С++ - Дальнейшие соглашения по нотации

ОГЛАВЛЕНИЕ

              Дальнейшие соглашения по нотации

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