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.
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)
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)
ąż
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;
}