Операторы-функции
Операторы-функции используются для введения операций, связанных с символами:
+ , - , * , / , % , ^ , & , | , ~ , ! , = , < , > ,+= , [ ] , -> , ( ) , 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;
}