перегрузка операторов

С++ поддерживает перегрузку операторов. За небольшими исключениями большинство операторов С++ могут быть перегружены, в результате чего они получат специальное значение по отношению к определённым классам. Например, класс, определяющий связанный список, может использовать оператор + для того, чтобы добавлять объект к списку. Другой класс может использовать оператор + совершенно иным способом. Когда оператор перегружен, ни одно из его исходных значений не теряет смысла. Просто для определённого класса объектов определён новый оператор. Поэтому перегрузка оператора + для того чтобы обрабатывать связный список, не изменяет его действия по отношению к целым числам.

Операторные функции обычно будут или членами, или друзьями того класса, для которого они используются. Несмотря на большое сходство, имеется определённое различие между способами, которыми перегружаются операторные функции-члены и операторные функции-друзья.

Для того, чтобы перегрузить оператор, необходимо определить, что именно означает оператор по отношению к тому классу, к которому он применяется. Общая форма записи функции-оператора для случая, когда она является членом классом класса, имеет вид:

тип имя_класса::operator#(список аргументов) {// действия, определённые применительно к классу}

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

three_d three_d::operator+(three_d t)

{           three_d temp; temp.x=x+t.x; temp.y=y+t.y;         temp.z=z+t.z; return temp;}

three_d three_d::operator=(three_d t) { x=t.x; y=t.y;      z=t.z; return *this;}

Если рассмотреть эту программу внимательно, может вызвать удивление, что обе функции-оператора имеют только по одному параметру, несмотря на то, что они перегружают бинарный оператор. Это связано с тем, что при перегрузке бинарного оператора с использованием функции-члена ей передаётся явным образом только один аргумент. Вторым аргументом служит указатель this, который передаётся ей неявно. Так, в строке temp.x = x+t.x; x соответствует this->x, где x ассоциировано с объектом, который вызывает функцию-оператор. Объект, стоящий справа от знака операции, передаётся функции.

При перегрузке унарной операции функция-оператор не имеет параметров, а при перегрузке бинарной операции функция-оператор имеет один параметр. (Нельзя перегрузить триадный оператор.) Во всех случаях объект, активизирующий функцию-оператор, передаётся неявным образом с помощью указателя this. Следующие операторы не могут быть перегружены:  . :: .* ?

Функция-оператор может быть другом класса, а не только его членом. Поскольку функции-друзья не являются членами класса, они не могут иметь неявный аргумент this. Поэтому при перегрузке дружественной бинарной функции-оператора оба операнда передаются функции, а при перегрузке унарных операторов передаётся один операнд. Следующие операторы не могут использовать перегрузку с помощью функций-друзей: =, (), [], и ->.

Ортодоксальная каноническая форма класса:

1)    конструктор по умолчанию.

2)    конструктор копирования.

3)    перегруженный оператор присвоения.

4)    деструктор


Ссылка на основную публикацию
Adblock detector