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

Операторы-функции используются для введения операций, связанных с символами:

+ , - , * , / , % , ^ , & , | , ~ , ! , = , < , > ,+= , [ ] , -> , ( ) , new, delete.

Оператор-функция является членом класса или дружественной классу. Общая форма оператора-функции члена класса:

возвращаемый_тип имя_класса::operator#(список_аргум){

/*выполняемые действия */ }

После этого вместо operator#(a,b)можно писать a#b. Здесь символ # представляет один из введенных выше символов. В качестве примера можно привести операции >>, <<, перегружаемые для ввода-вывода. Отметим, что при перегрузке нельзя менять приоритет операторов и число операндов. Если оператор-функция, являющаяся членом класса перегружает бинарный оператор, у функции будет только один параметр-объект, находящийся справа от знака оператора. Объект слева вызывает оператор-функцию и передается неявно с помощью указателя this. Например:

// перегрузка +, = и ++ для класса coord. // пример 27

#include <iostream.h>

#include <conio.h>

class Coord {

int x, y; // значения координат

public:

Coord(int i=0, int j=0) { x = i; y = j; }

void getXY(int &i, int &j) { i = x; j = y; }

Coord operator+(Coord ob2);

Coord operator=(Coord ob2);

Coord operator++(); // префиксная форма

};

Coord Coord::operator+(Coord ob2) //перегрузка +

{ Coord temp;

temp.x = x + ob2.x; // temp.x=this->x+ob2.x

temp.y = y + ob2.y; // temp.y=this->y+ob2.y

return temp;

}

Coord Coord::operator=(Coord ob2) //перегрузка =

{ x = ob2.x; // this->x=ob2.x

y = ob2.y; // this->y=ob2.y

return *this;//возвращение объекта, которому присвоено значение

}

Coord Coord::operator++() //перегрузка ++, унарный оператор

{ x++; y++;

return *this;

}

int main(){

Coord o1(10, 10), o2(5, 3), o3;

int x, y;

o3 = o1 + o2; //сложение двух объектов. Вызов operator+()

o3.getXY(x, y);

cout << "(o1 + o2) X: " << x << ", Y: " << y << "\n";

o3 = o1; //присваивание объектов

o3.getXY(x, y);

cout << "(o3 = o1) X: " << x << ", Y: " << y << "\n";

++o1; //инкрементация объекта

o1.getXY(x, y);

cout << "(++o1 ) X: " << x << ", Y: " << y << "\n";

while(!kbhit());

return 0;

}

Результат:

(о1+о2) X:15 ,y:13

(о3=о1) X:10, y:10

(++o1) X:11, Y:11

При перегрузке унарного оператора ++ единственный параметр-объект передается через указатель this.

В следующем примере вводятся класс “множество” и операции && – пересечения, << – вывод множества.

#include <iostream.h> //пример 28

#include <conio.h>

class Set {

char *pl; //указатель на множество элементов типа char

public:

Set(char *pl)//конструктор

{pi=new char[strlen(pl)+1];strcpy(pi,pl);}//конструктор

Set &operator &&(Set &); //перегрузка &&-пересечение

friend ostream &operator<<(ostream &stream,Set &ob);//перегрузка<<

~Set(){delete [] pi;}//деструктор

} ;

Set& Set::operator &&(Set &s) // пересечение A=A^B

{int l=0;

for (int j=0;pi[j]!=0;j++)

for (int k=0;s.pi[k]!=0;k++)

if (pi[j]==s.pi[k]) {

pi[l]=pi[j];l++;break;}

pi[l]=0;

return *this;

}

ostream &operator<<(ostream &stream, Set &ob) {

stream << ob.pi << '\n'; /*перегрузка вывода */

return stream;

}

int main(){

Set s1("1f2bg5e6"),s2("abcdef");

Set s3=s2;

cout<<(s1&&s2)<<endl;//результат fbe

cout<<s3<<endl;//результат abcdef

while(!kbhit());

return 0;

}