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

Содержание

Слайд 2

Nortel Networks Confidential

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

Можно объявить функции для операторов:
+, -, *, /, &,

Nortel Networks Confidential Операторные функции Можно объявить функции для операторов: +, -,
|, =, >, <, +=, -=, ≈, !=, &&, ||, ++, --, [], (),
new, delete, и т.д.
Нельзя определить:
:: . .* ?: sizeof typedef
Невозможно определить новую лексему оператора
Имя операторной функции - operator@, например operator<< .

Слайд 3

Nortel Networks Confidential

Бинарные операторы

Можно определить в виде:
нестатической функции-члена с одним аргументом,
функции-не-члена с

Nortel Networks Confidential Бинарные операторы Можно определить в виде: нестатической функции-члена с
двумя аргументами.
Выражение aa@bb интерпретируется:
aa.operator@(bb)
operator@(aa, bb)

Слайд 4

Nortel Networks Confidential

Бинарные операторы. Примеры.

class Coord {
int x, y, z;
public:
Coord

Nortel Networks Confidential Бинарные операторы. Примеры. class Coord { int x, y,
operator+ (Coord);
Coord& operator= (Coord);
Coord& operator*= (int);
};
Coord operator*(Coord, int);

Coord Coord::operator+(Coord t) {
Coord temp;
temp.x = x + t.x;
temp.y = y + t.y;
temp.z = z + t.z;
return temp;
}

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

Coord operator*(Coord c,
int m) {
Coord temp = c;
return temp*=m;
}

Слайд 5

Nortel Networks Confidential

Операторы-члены и не-члены.

class Coord {
public:
Coord& operator+=(const Coord&);
//...
};
Coord operator+(const

Nortel Networks Confidential Операторы-члены и не-члены. class Coord { public: Coord& operator+=(const
Coord&, const Coord&);

Coord& operator+=(const Coord& c)
{
x += c.x;
y += y.x;
z += z.x;
return *this;
}

Coord operator+(const Coord& c1, const Coord& c2)
{
Coord temp = c1;
return temp+=c2;
}

Слайд 6

Nortel Networks Confidential

Операторы-члены и не-члены.

class Coord {
public:
bool operator==(const Coord& c) const;

Nortel Networks Confidential Операторы-члены и не-члены. class Coord { public: bool operator==(const
//...
};
bool operator!=(const Coord& c1, const Coord& c2);

bool operator!=(const Coord& c1, const Coord& c2)
{
return !(c1==c2);
}

Слайд 7

Nortel Networks Confidential

Унарные операторы

Можно определить в виде:
нестатической функции-члена без аргументов,
функции-не-члена с одним

Nortel Networks Confidential Унарные операторы Можно определить в виде: нестатической функции-члена без
аргументом.
Выражение @aa интерпретируется как:
aa.operator@ ()
operator@ (aa)

Слайд 8

Nortel Networks Confidential

Унарные постфиксные операторы

Для любого постфиксного оператора выражение aa@ интерпретируется как:
aa.operator@

Nortel Networks Confidential Унарные постфиксные операторы Для любого постфиксного оператора выражение aa@
(int)
operator@ (aa, int)
Аргумент int используется для указания на постфиксную форму
Аргумент является фиктивным

Слайд 9

Nortel Networks Confidential

Унарные операторы. Примеры.

class Coord {
int x, y, z;
public:
Coord&

Nortel Networks Confidential Унарные операторы. Примеры. class Coord { int x, y,
operator- ();
Coord& operator++ ();
}

Coord& Coord::operator- () {
x = -x;
y = -y;
z = -z;
return *this;
}

Coord operator++(Coord& c, int i)
{
Coord temp = c;
++c;
return temp;
}

Coord& Coord::operator++() {
++x;
++y;
++z;
return *this;
}

Слайд 10

Nortel Networks Confidential

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

Оператор может быть объявлен только с синтаксисом, существующем

Nortel Networks Confidential Предопределенный смысл операторов Оператор может быть объявлен только с
для него в грамматике
operator=, operator[ ], operator-> должны быть нестатическими функциями-членами
Некоторые операторы определены так, что они равны комбинации других операторов, например ++a означает a+=1 или a=a+1. Компилятор сам об этом не заботится.
Операторы = и & имеют предопределенный смысл для объектов класса, если они закрытые, этот смысл может стать недоступным.

Слайд 11

Nortel Networks Confidential

Операторы и типы, определяемые пользователем

Операторная функция может быть либо членом,

Nortel Networks Confidential Операторы и типы, определяемые пользователем Операторная функция может быть
либо иметь аргумент типа, определяемого пользователем.
Операторная функция, у которой первый операнд принадлежит к встроенному типу, не может являться членом.

aa+2
aa.operator+(2)

2+aa
2.operator+(aa)

Имя файла: Перегрузка-операторов-.pptx
Количество просмотров: 162
Количество скачиваний: 0