Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Синтаксис объявления операторной функции

Перегрузка операций основывается на следующем принципе.

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

Синтаксис объявления операторных функций представлен в виде множества БНФ.

operator-declaration ::=

attributes opt operator-modifiers operator-declarator operator-body

operator-modifiers ::= operator-modifier

::= operator-modifiers operator-modifier

operator-modifier ::= public | static | extern

operator-declarator ::= unary-operator-declarator

::= binary-operator-declarator

::= conversion-operator-declarator

unary-operator-declarator ::=

type operator overloadable-unary-operator (type identifier)

overloadable-unary-operator ::= +

::= -

::= !

::= ~

::= ++

::= --

::= true

::= false

binary-operator-declarator ::=

type operator overloadable-binary-operator (type identifier ,type identifier)

overloadable-binary-operator ::= +

::= -

::= *

::= /

::= %

::= &

::= |

::= ^

::= <<

::= >>

::= ==

::= !=

::= >

::= <

::= >=

::= <=

conversion-operator-declarator ::= implicit operator type (type identifier)

::= explicit operator type (type identifier)

operator-body ::= block

::= ;

Унарные операции. Пример объявления и вызова

using System;

class Point2D

{

int x,y;

Point2D()

{

x=0;

y=0;

}

Point2D(Point2D key)

{

x=key.x;

y=key.y;

}

// Перегруженные операции обязаны возвращать значения!

// Операторные функции!

// Они должны объявляться как public и static.

// Префиксная и постфиксная формы операций ++ и –

// НЕ различаются по результату выполнения (что есть криво)!

// Тем не менее, они могут быть объявлены:

// Одна как префиксная!

public static Point2D operator ++ (Point2D par)

{

par.x++;

par.y++;

return par;

}

// Другая как постфиксная!

public static Point2D operator -- (Point2D par)

{

Point2D tmp = new Point2D(par);

// Скопировали старое значение.

par.x--;

par.y--;

// Модифицировали исходное значение. Но возвращаем старое!

return tmp;

}

static void Main(string[] args)

{

Point2D p = new Point2D();

// В соответствии с объявлением, плюсы ВСЕГДА ПРЕФИКСНЫ, а минусы ПОСТФИКСНЫ

p++; // Префиксная.

++p; // Префиксная.

p--; // Постфиксная.

--p; // Постфиксная.

}

}