Язык программирования C++ от Страуструпа

       

Предопределенные свойства операций


Используется только несколько предположений о свойствах пользовательских операций. В частности, operator=, operator[], operator() и operator-> должны быть нестатическими функциями-членами. Этим обеспечивается то, что первый операнд этих операций является адресом.

Для некоторых встроенных операций их интерпретация определяется как комбинация других операций, выполняемых над теми же операндами. Так, если a типа int, то ++a означает a+=1, что в свою очередь означает a=a+1. Такие соотношения не сохраняются для пользовательских операций, если только пользователь специально не определил их с такой целью. Так, определение operator+=() для типа complex нельзя вывести из определений complex::operator+() и complex operator=().

По исторической случайности оказалось, что операции = (присваивание), &(взятие адреса) и , (операция запятая) обладают предопределенными свойствами для объектов классов. Но можно закрыть от произвольного пользователя эти свойства, если описать эти операции как частные:

class X {

  // ...

  private:

     void operator=(const X&);

     void operator&();

     void operator,(const X&);

     // ...

};

void f(X a, X b)

{

  a= b;                            // ошибка: операция = частная

  &a;                              // ошибка: операция & частная

  a,b                              // ошибка: операция , частная

}

С другой стороны, можно наоборот придать с помощью соответствующих определений этим операциям иное значение.



Содержание раздела