Четвертый BORLAND С++ и его окружение

       

Переопределение операций


Поскольку в С++ операции, рассматриваются как функции, то очевидно, что и их можно переопределять так, что они будут работать не

только с числами, а даже с графическими объектами, строками и вообще

с чем угодно. В С++ число операций ограничено стандартным набором:

[] () . -> ++ --

& * + - ~ !

sizeof / % << >> <

> <= >= == != ^

| && ?: = *=

/= %= += -= <<= >>=

&= ^= |= , # ##

Чтобы определить операцию, необходимо определить функцию, именем

которой является специальное ключевое слово oрerator, за которым сле-

дует символ операции.



Допустим нам удалось определить тип переменных time - время, так

что появилась возможность записывать операции со временем в виде, не

разрушающем привычный формат (например: 20.04 + 05.57 = 02.01).

Переопределяемые операции

v v

time operator+(time a, time b) <

{ ^

time c; операция +

return c = a.val + b.val;

}

time work_time, busy_time, birth_time;

> вызывает переопределенную операцию

work_time = busy_time + goof_off_time;

Тип операнда определяет какую из переопределенных операций необ-

ходимо использовать.

При переопределении операции действуют следующие ограничения:

  • С++ не различает префиксные и постфиксные версии операций ++ и

    --.

  • операция, которую вы хотите определить, уже должна существо-

    вать в языке. Например, вы не можете определить операцию #.

  • нельзя переопределить следующие операции:

    . .* :: ?:

  • переопределенные операции сохраняют свое первоначальное старшинство.
  • если @ обозначает любую унарную операцию, то выражения x@ и @x

    можно интерпретировать либо как x.операция@(), либо как опера-

    ция@(x). Если описаны обе формы, то компилятор попытается раз-

    решить неоднозначность путем сравнения аргументов. Аналогично,

    переопределение бинарной операции @ в x@y может толковаться

    либо x.операция@(y), либо операция@(x,y), и если определены

    обе формы, то компилятору требуется анализировать аргументы.

    Пример бинарной операции уже был: это версия операции +, для

    сложения времени, где a.val + b.val интерпретируется, как:

    a.val.(операция + (b.val)).



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