background image

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(); 
}; 

background image

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; 
}; 

background image

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