Void matr::vvod()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
*(x+i*m+j)=5+random(10);
}
//==============================================
//деструктор
matr::~matr ()
{
delete[]x;
puts("\n работал деструктор");
}
//==============================================
//глобальная операторная функция переопределения //операции +
matr operator+(matr& P1, matr& P2)
{
matr rez(P1.n, P1.m);
puts("\n rez dla + ");
for(int i=0;i<rez.n;i++)
for(int j=0;j<rez.m;j++)
*(rez.x +i*rez.m+j)=*(P1.x+i*P1.m+j)+*(P2.x+i*P2.m+j);
return rez;
}
//операторная функция переопределения операции =
matr& matr::operator=(matr& P2)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
*(x+i*m+j)=*(P2.x+i*P2.m+j);
return * this;
}
//функция-член печати матрицы
Void matr::ww()
{
for(int i=0;i<n;i++)
{
cout<<"\n" ;
for(int j=0;j<m;j++)
cout<< *(x+i*m+j)<<" "; }
}
//==================================
//основная программа
Void main()
{
matr P1(3,4);
P1.vvod();
P1.ww();
matr P2(3,4);
P2.vvod();
P2.ww();
matr P3(3,4);
P3=P1+P2;
P3.ww();
}
На экране
rabotal konstruktor
5 5 8 5
10 6 12 14
6 11 10 5
rabotal konstruktor
11 12 13 14
14 13 14 13
11 10 10 12
rabotal konstruktor
rabotal konstruktor
rabotal konstruktor kopii
rabotal destruktor
rabotal destruktor
16 17 21 19
24 19 26 27
17 21 20 17
rabotal destruktor
rabotal destruktor
rabotal destruktor
Перегрузка унарных операторов.
Унарным операторам необходим только один операнд. При перегрузке унарного оператора с помощью функции члена этот единственный операнд представляет собой объект, для которого и выполняется операция.
Когда операторная функция унарного оператора объявляется как нестатическая функция-член, она должна быть объявлена в виде:
<возвр_тип> operatorX();
где
<возвр_тип> -тип возвращаемого функцией значения
X – перегружаемый унарный оператор.
Когда операторная функция унарного оператора объявляется как глобальная, она должна быть объявлена в виде:
<возвр_тип> operatorX(<тип_пар> par);
где
<возвр_тип> -тип возвращаемого функцией значения
X – перегружаемый унарный оператор.
<тип_пар> - тип параметра
рar- параметр
В качестве примера рассмотрим унарную операцию + и унарную операцию -
class Coord
{
int x,y;
public:
Coord(int xx, int yy)
{
x=xx; y=yy;
printf("\n конструктор с параметрами \n");
}
Void ww();
Coord operator+();
Coord operator-();
~Coord()
{
printf("\n деструктор\n");
}
};
Void Coord::ww()
{
cout<<"\n x="<<x<<"y= "<<y;
}
Coord Coord::operator +()
{
x=+x;
y=+y;
return *this;
}
Coord Coord::operator -()
{
x=-x;
y=-y;
return *this;
}
void main()
{
Coord a(15,2);
a.ww();
a=+a;
a.ww();
a=-a;
a.ww();
}
Те же операторы могут быть перегружены с помощью глобальных функций
friend Coord Coord::operator -( Coord &ob)
friend Coord Coord::operator +( Coord &ob)
friend Coord Coord::operator +( Coord &ob)
{
ob.x=+ob.x;
ob.y=+ob.y;
return ob;
}
friend Coord Coord::operator -( Coord &ob)
{
ob.x=-ob.x;
ob.y=-ob.y;
return ob;
}
Результат с такими функциями будет такой же.
