Przeciążanie metod
Przykład
#include <iostream.h>
class osoba
{
char nazwa[20];
int liczba;
char znak;
public:
wypisz (char*tekst, char znak, int liczba);
wypisz (int liczba, char*tekst);
wypisz (char*tekst, int liczba);
};
osoba::wypisz (char*tekst ,char znak, int liczba)
{
cout <<" \n Imie i Nazwisko: "<<tekst<<"\n Plec:"<<" \t\t "<<znak<<endl;
cout<<" Nr albumu: "<<liczba<< endl;
}
osoba::wypisz (int liczba, char*tekst)
{
cout <<" Rok studiow: "<<" " <<liczba<<tekst<< endl;
}
osoba::wypisz (char*tekst, int liczba)
{
cout<<" Adres uczelni: "<<tekst <<" "<<liczba<<endl;
}
void main ( )
{
osoba dane;
dane.wypisz ("Jan Nowak", 'M' , 12345 ); dane.wypisz (3, " LKZR");
dane.wypisz ("Sucharskiego" , 2);
}
Wynik wykonania 1:
Imie i Nazwisko: Radoslaw Kosakowski
Plec: M
Nr. Albumu: 25195
Rok studiow: 3 LKZR
Adres uczelni: Sucharskiego 2
1: w programie posługujemy się trzema funkcjami o identycznej nazwie. Widzimy deklaracje tych funkcji. Nazwa funkcji wypisz jest trzykrotnie przeciążona. Poszczególne funkcje różnią się typem i ilością argumentów.
2: zastrzeżenie o odmiennym typie argumentów dotyczy również kolejności. Mogą być dwie funkcje, które pracują na tym samym zestawie argumentów. W obu wpadkach chodzi o argumenty int oraz char, jednak ich inna kolejność sprawia, że funkcje są łatwo rozróżniane. Jest tylko jedna taka funkcja o nazwie wypisz, której pierwszy argument ma typ int, a drugi - char. Podobnie jest tylko jedna funkcja wypisz, której pierwszy argument jest typu char, a drugi - int.
3: wywołania funkcji wypisz. Kompilator przygląda się argumentom i stąd dobiera funkcje, do której one pasują.
Przeciążanie operatorów
Przykład
#include<iostream.h>
class zespolona // deklaracja klasy
{
double re, im;
public:
zespolona ( ) {re = 0; im = 0; }
zespolona (double r, double i): re(r), im(i) { }
// konstruktor
zespolona operator + (zespolona z);
zespolona operator * ( );
zespolona operator / (zespolona z);
/* deklaracje operatorów przeciążonych */
friend zespolona operator - (zespolona z1, zespolona z2);
friend ostream& operator << (ostream& wyjscie, zespolona z);
friend istream& operator >> (istream& wejscie, zespolona &z);
};
zespolona zespolona::operator * ( )
{
return zespolona (re, -im);
}
zespolona zespolona::operator + (zespolona z)
{
return zespolona (re+z.re, im+z.im);
}
zespolona operator-(zespolona z1, zespolona z2)
{
return zespolona(z1.re-z2.re, z1.im-z2.im);
}
zespolona zespolona ::operator /(zespolona z)
{
return zespolona(re/z.re,im/z.im);
}
ostream& operator <<(ostream& wyjscie, zespolona z)
{
return wyjscie <<'(' <<z.re<<",j"<<z.im<<')';
}
istream& operator >>(istream& wejscie, zespolona &z)
{
cout<<"re: ";
wejscie>>z.re;
cout<<"im: ";
wejscie>>z.im;
return wejscie;
}
void main ( )
{
zespolona z, z1(12, 22), z2 (5.5, -6), z3;
cout<<"\t Mamy podane nastepujace liczby zespolone:"<<endl;
cout<<"\n z1= "<<z1<<endl;
cout<<" z2= "<<z2<<endl<<endl;
cout<<"\tPodaj nowa liczbe zespolona"<<endl;
cin>>z3;
cout<<"\n z3= "<<z3<<endl<<endl;
cout<<"\tWykonujemy operacje matematyczne"<<endl;
cout<<"\n z= z1+ z3" ;
z=z1+z3; cout<<"\t z= "<<z<<endl; // operator +
cout<<"\n z= z2- z1";
z=z2-z1; cout<<"\t z= "<<z<<endl; // operator -
cout<<" \n z= *z2";
z=*z2; cout<<"\t\t z= "<<z<<endl; // operator *
cout<<"\n z= (z2+ z3)- z1" ;
z=z2+z3-z1; cout<<" z= "<<z<<endl;
cout<<"\n z= z1/ z3" ; // operator /
z=z1/z3; cout<<"\t z= "<<z<<endl;
cout<<endl;
}
Przykład ten zawiera szereg operatorów jedno i dwuargumentowych, definicją klasy jest klasa zespolona, funkcje operatorowe zostały zdefiniowane jako składowe i funkcje zaprzyjaźnione tejże klasy.
1: definicje funkcji składowych klasy i funkcji zaprzyjaźnionych z klasą.
2: operator << przeciążony w klasie ostream umożliwia wysyłanie danych do standardowego urządzenia wyjściowego, którym jest najczęściej monitor ekranowy.
Wartością wyrażenia zawierającego operator << jest referencja obiektu reprezentujący strumień wyjściowy, w powyższym przykładzie jest to wyjscie.
Operator << został przeciążony dla wszystkich podstawowych typów danych: char, short, int, long, float, double, long double, char* i void.
Definicję takiego przeciążania zadaje się za pomocą funkcji zaprzyjaźnionej.
3: operator >> przeciążony w klasie istream umożliwia pobieranie danych z wejścia standardowego. Zastosowanie tego operatora do obiektu cin (reprezentującego wejście standardowe) powoduje pobranie z wejścia odpowiedniej liczby znaków, wykonanie konwersji i przypisanie zmiennej obliczonej wartości. Operator >> został przeciążony dla wszystkich podstawowych typów danych: char, short, int, long, float, double, long double oraz char*.
5