Laboratorium nr 11
Temat: Przeci anie operatorów.
1. Koncepcja przeci ania operatorów w C++
W C++ mo na przeci a istniej ce operatory, to znaczy nadawa im nowe znaczenie dla operacji
wykonywanych cz ciowo lub w cało ci na obiektach typu klasa. Aby przeci y operator, np. „+”,
definiuje si funkcj o nazwie operator +, przy czym funkcje te musz by funkcjami składowymi albo
zaprzyja nionymi z obiektami, na których działaj
class klasa{
…
public:
klasa operator +();
…
}
W C++ mo na przeci a zarówno operatory jednoargumentowe (np. ++) jak i dwuargumentowe
(+). Nale y przy tym ograniczy si do przeci ania istniej cych operatorów, przy zachowaniu
odpowiedniej liczby argumentów. Zwykle funkcja operatora zwraca typ obiektu, na którym działa.
Uwaga: do funkcji zaprzyja nionych nie jest przesyłany wska nik this, dlatego te operatory powinny
by wówczas zadeklarowane jako referencyjne – wówczas przekazywany jest sam obiekt, a nie jego
kopia.
# include <conio.h>
# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
using namespace std;
class macierz {
float *tab;
static int licznik;
public:
int x,y;
void wyswietl();
void wprowadz(int n, int m, float w);
macierz operator++(void);
int operator==(macierz m);
macierz * operator+(macierz m);
friend macierz * operator^(const class macierz &, float p);
macierz(int n=0, int m=0, float w=0);
~macierz();
};
int macierz::licznik=0;
void macierz::wyswietl(){
cout << "\nMacierz:" << licznik << endl;
for (int i=0; i<x; i++) {
for (int j=0; j<y; j++) cout << *(this->tab+y*i+j) << "\t";
cout <<"\n";
};
};
void macierz::wprowadz (int n, int m, float w) {
*(this->tab+y*n+m)=w;
};
macierz macierz::operator++(void){
licznik++;
return *this;
};
int macierz::operator==(macierz m){
if ((m.x==this->x)&&(m.y==this->y)) return 1;
else return 0;
};
macierz * macierz::operator+(macierz m){
class macierz *tmp;
tmp=new macierz(m.x,m.y);
for(int i=0; i<m.x; i++)
for(int j=0; j<m.y; j++)
*(tmp->tab+tmp->y*i+j)=*(this->tab+this->y*i+j)+*(m.tab+m.y*i+j);
return tmp;
};
macierz::macierz(int n, int m, float w){
x=n;
y=m;
tab=new float[n*m];
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
*(tab+y*i+j)=w;
}
macierz::~macierz(){
};
macierz * operator^(const class macierz &m1, float p){
class macierz *tmp;
tmp=new macierz(m1.x,m1.y);
for(int i=0; i<m1.x; i++)
for(int j=0; j<m1.y; j++)
*(tmp->tab+tmp->y*i+j)=pow(*(m1.tab+m1.y*i+j),p);
return tmp;
};
int main() {
class macierz A(2,2,2),B(2,2,3),C(3,3),*D,*E;
++A;
A.wyswietl();
B.wyswietl();
C.wyswietl();
if (A==C) D=A+C; else cout << "\nA+C:Blad\n";
if (A==B) D=A+B; else cout << "\nA+B:Blad\n";
D->wyswietl();
E=A^3;
E->wyswietl();
system("PAUSE");
delete &A,&B,&C,D,E;
return 0;
}
2. Zadanie:
Zmodyfikuj powy szy program tak, aby umo liwiał deklaracje szeregu macierzy o dowolnych
wymiarach oraz podstawowe działania na macierzach (dodawanie, mno enie, transpozycja, itp.) z
wykorzystaniem operatorów przeci onych.
Uwaga:
• Program powinien składa si z oddzielnych plików, tzn. pliku głównego oraz plików
zdefiniowanych klas, itp.
• Program powinien posiada szereg zabezpiecze , np. sprawdzanie czy wybrane macierzy maj
odpowiednie wymiary oraz czy istnieje przestrze na utworzenie kolejnej macierzy, itp.
Program powinien posiada krótkie menu wyboru, np.:
1.
Utwórz macierz
2.
Wy wietl macierz
3.
Wypełnij macierz – dane losowe
4.
Dodaj macierze
5.
Pomnó macierze
6.
itp.
7.
Koniec