Przeciążanie metod

Przykład

#include <iostream.h>

class osoba

{

char nazwa[20];

int liczba;

char znak;

public:

  1. wypisz (char*tekst, char znak, int liczba);

wypisz (int liczba, char*tekst);

  1. 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;

  1. 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);

};

  1. 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);

}

  1. ostream& operator <<(ostream& wyjscie, zespolona z)

{

return wyjscie <<'(' <<z.re<<",j"<<z.im<<')';

}

  1. 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