#include <iostream>	// cin, cout
using namespace std;

class prostokat
{
   	private:
		float dlugosc, szerokosc;     //atrybuty, dostep do nich jest ograniczony
	public:
		prostokat(); // konstruktor bezparametrowy
		prostokat(float d, float s); // konstruktor z parametrami
		~prostokat(); // destruktor
		void wprowadz(float d, float s);
		void drukuj();
		float obliczpole();
		float obliczobwod();
//metody klasy maja bezposredni dostep do atrybutow klasy
};

prostokat::prostokat() //konstruktor bezparametrowy
{
	dlugosc = 0;
	szerokosc = 0;
	cout << "*** Dziala konstruktor bezparametrowy ***" << endl;
}

prostokat::prostokat(float d, float s) : dlugosc(d), szerokosc(s)
{
    cout << "*** Dziala konstruktor z parametrami ***" << endl;
}

prostokat::~prostokat() //destruktor
{
	cout << "*** Zniszczono obiekt klasy prostokat za pomoca destruktora ***" << endl;
}

void prostokat::wprowadz(float d, float s)
{
	dlugosc = d;
	szerokosc = s;
}

void prostokat::drukuj()
{
	cout << "dlugosc = " << dlugosc << ", szerokosc = " << szerokosc << endl;
}

float prostokat::obliczpole()
{
	return dlugosc*szerokosc;
}
float prostokat::obliczobwod()
{
      return 2*dlugosc+2*szerokosc;
}
int main()
{
	/*
	//---------- ZLE! ----------
	prostokat p0;
	p0.dlugosc = 2;    // nieautoryzowany dostep do skladowej prywatnej
	p0.szerokosc = 3;	// j.w.
	cout << p0.dlugosc;	// j.w.
	cout << p0.szerokosc;	// j.w.
	cout << "Pole : " << p0.dlugosc*p0.szerokosc << endl;     // j.w.
	cout << "Obwod: " << 2*p0.dlugosc+2*p0.szerokosc << endl; // j.w.
	//--------------------------
	*/

	// DOBRZE!
	prostokat p1; // konstuktor bezparametrowy
	p1.drukuj();
	p1.wprowadz(2, 3);
	p1.drukuj();
	cout << "Pole : " << p1.obliczpole() << endl;
	cout << "Obwod: " << p1.obliczobwod() << endl;

	prostokat *p2;
	p2 = new prostokat(4, 5); // konstuktor z parametrami
	p2->drukuj();
	cout << "Pole : " << p2->obliczpole() << endl;
	cout << "Obwod: " << p2->obliczobwod() << endl;
	delete p2; //zwalnia miejsce zajmowane przez obiekt, wywoluje destruktor.
	cout << "*** wywolano operator delete! ***" << endl;
	cout << "**********************ostatnia instrukcja funkcji main()*********"<<endl;
    
    system("pause>nul");
	return 0;
}
