background image

Programowanie obiektowe 03

Przeciążanie operatorów

Przykład 1: przeciążanie funkcji

using namespace std;
#include <iostream>

double suma (double a, double b)
{
   return a + b;
}
int suma (int a, int b)
{
   return a + b;
}
int suma (int a)
{
   return a + a;
}
int main ()
{
   double   m = 7,  n = 4;
   int      k = 5,  p = 3;

   cout << suma(m, n) << " , " << suma(k, p) << endl;

   return 0;
}

Zastosowanie: np. w klasie możliwie jest deklarowanie wielu konstruktorów o różnych 
parametrach formalnych.

background image

Przykład 2: przeciążanie operatora <<

using namespace std;
#include <iostream>

class vector

{
   double x;

   double y;
public:

 vector(int a, int b){x=a;y=b;};
};

ostream& operator << (ostream& o, vector a)

{
   o << "(" << a.x << ", " << a.y << ")";

   return o;
}

int main ()

{
   vector a(23,35);

   cout << a << endl;     // (35, 23)

   return 0;

}

Przykład 3: Przeciążenie operatora '*'

using namespace std;
#include <iostream>

struct vector

{
   double x;

   double y;
};

vector operator * (double a, vector b)

{
   vector r;

   r.x = a * b.x;

   r.y = a * b.y;

   return r;
}

int main ()

{
   vector k, m;              // deklaracje struktur

   k.x =  2;                 // k = vector (2, ­1)

background image

   k.y = ­1;                 // 
   m = 3.1415927 * k;        // uzycie operatora ‘*’

   cout << "(" << m.x << ", " << m.y << ")" << endl;

   return 0;
}

Zadanie 1. Zdefiniuj funkcję max:

i

nt max(int, int);

int max(int tab[], n);

Zadanie 2. Napisz klasę student, w której wykorzystuje się operator << do wyswietlenia 
średniej_ocen a i nr_indeksu obiektu Student

class Student
{   
   int nr_indeksu;
   float srednia_ocen; 
   public:
      Student(int nr=0, float sr=0) {nr_indeksu=nr; srednia_ocen=sr;};  // 
konstruktor
      friend ostream & operator<< (ostream &wyjscie, const Student &s);
};

ostream & operator<< (ostream &wyjscie, const Student &s)         
{
   wyjscie << "Nr indeksu : " <<s.nr_indeksu << endl << "Srednia ocen : " 
<<s.srednia_ocen<<endl;
   return wyjscie;
}

Zadanie 3. Napisz klasę complx (liczba zespolona), która wykorzystuje przeciążony operator '+' 
do realizacji sumy obiektów tej klasy.

#include <iostream>
using namespace std;

class complx
{
      double real,
             imag;
public:
      complx( double real = 0., double imag = 0.); // konstruktor
      complx operator+(const complx&) const;       // operator+()
};

// definicja konstruktora
complx::complx( double r, double i )
{
      real = r; imag = i;
}

// definicja przeci onego operatora + (plus) 

ąż

background image

complx complx::operator+ (const complx& c) const
{
      complx result;
      result.real = (this­>real + c.real);
      result.imag = (this­>imag + c.imag);
      return result;
}

int main()
{
      complx x(4,4);//inicjacja obiektow (liczb zespolonych)
      complx y(6,6);
      complx z = x + y; // wywołanie complx::operator+()

Zadanie 4. W klasie Tablica zdefiniuj operator << który będzie służył do wyświetlenia 
zawartości tablicy.

#include <cstdlib>
#include <iostream>

using namespace std;

class Tablica
{
protected:
int rozmiar; // liczba wierszy

int *ti; // adres
public:
Tablica(int n){rozmiar=n;ti = new int[rozmiar];for(int i=0;i<rozmiar;i++) 
ti[i]=0;}// konstruktor
~Tablica(){delete [] ti;}; // destruktor
friend ostream & operator<< (ostream & ob, Tablica & wek);
};

ostream & operator<< (ostream & ob, Tablica & wek)
{
ob << endl << "ELEMENTY WEKTORA " << endl;
for(int i=0; i < wek.rozmiar; i++)
ob << wek.ti[i] << endl;
return ob;
}

int main(int argc, char *argv[])
{
      Tablica tab(3);
      cout<<tab;
   
    system("PAUSE");
    return EXIT_SUCCESS;
}