#include <iostream>
#include <string>
using namespace std;
class Liczby
{
private:
int liczba;
string nazwa_liczby;
public:
static int liczba_obiektow;
Liczby(); //konstruktor domyslny
Liczby(int liczba_jakas, string nazwa); //konstruktor z parametrem
Liczby(const Liczby &); //konstruktor kopiujacy
~Liczby(); //destruktor
//metody przeciazajace operatory
Liczby operator+(const Liczby & liczba_zmienna) const; //obiekt + obiekt
Liczby operator+(double liczba_zmienna); //obiekt + liczba
Liczby operator*(const Liczby & liczba_zmienna) const; //obiekt * obiekt
Liczby operator*(double liczba_zmienna); //obiekt + liczba
Liczby & operator=(const Liczby & przypisanie);
//funkcje zaprzyjaznione przeciazajace operatory
friend Liczby operator+(double liczba_zmienna, const Liczby & liczba_zmienna_druga); //liczba + obiekt
friend Liczby operator*(double liczna_zmienna, const Liczby & liczba_zmienna_druga); //liczba * obiekt
friend ostream & operator<<(ostream & wyswietlenie, const Liczby & liczba_zmienna); //wyswietlenie obiektu
//metoda statyczna
static int ile_obiektow();
};
//inicjalizacja statycznej skladowej klasy
int Liczby::liczba_obiektow = 0;
//metoda statyczna
int Liczby::ile_obiektow()
{
return liczba_obiektow;
}
Liczby::Liczby()
{
liczba = 0;
nazwa_liczby = "";
liczba_obiektow++;
}
Liczby::Liczby(int liczba_jakas, string nazwa)
{
liczba = liczba_jakas;
nazwa_liczby = nazwa;
liczba_obiektow++;
}
Liczby::Liczby(const Liczby & liczba_zmienna)
{
cout << "WYWOLANIE KONSTRUKTORA KOPIUJACEGO" << endl;
liczba = liczba_zmienna.liczba;
nazwa_liczby = liczba_zmienna.nazwa_liczby;
liczba_obiektow++;
}
Liczby::~Liczby()
{
cout << "WYWOLANIE DETSRUKTORA" << endl;
liczba_obiektow--;
cout << "Obiektow pozostalo: " << liczba_obiektow << endl;
}
Liczby Liczby::operator+(const Liczby & liczba_zmienna) const
{
Liczby dodawanie;
dodawanie.liczba = liczba + liczba_zmienna.liczba;
return dodawanie;
}
Liczby Liczby::operator+(double liczba_zmienna)
{
Liczby dodawanie;
dodawanie.liczba = liczba + liczba_zmienna;
return dodawanie;
}
Liczby Liczby::operator*(const Liczby & liczba_zmienna) const
{
Liczby mnozenie;
mnozenie.liczba = liczba * liczba_zmienna.liczba;
return mnozenie;
}
Liczby Liczby::operator*(double liczba_zmienna)
{
Liczby mnozenie;
mnozenie.liczba = liczba * liczba_zmienna;
return mnozenie;
}
Liczby & Liczby::operator=(const Liczby & przypisanie)
{
cout << "WYWOLANIE PRZYPISANIA DEEP COPY" << endl;
if (this == &przypisanie)
return *this;
liczba = przypisanie.liczba;
return *this;
}
Liczby operator+(double liczba_zmienna, const Liczby & liczba_zmienna_druga)
{
Liczby dodawanie;
dodawanie.liczba = liczba_zmienna + liczba_zmienna_druga.liczba;
return dodawanie;
}
Liczby operator*(double liczba_zmienna, const Liczby & liczba_zmienna_druga)
{
Liczby mnozenie;
mnozenie.liczba = liczba_zmienna * liczba_zmienna_druga.liczba;
return mnozenie;
}
ostream & operator<<(ostream & wyswietlenie, const Liczby & liczba_zmienna)
{
wyswietlenie << "Liczba wynosi: " << liczba_zmienna.liczba;
}
int main()
{
Liczby liczba1(5, "number_1");
Liczby liczba2(12, "number_2");
cout << endl;
cout << "liczba1 + 2" << endl;
liczba1 = liczba1 + 2;
cout << endl;
cout << "3 + liczba1" << endl;
liczba1 = 3 + liczba1;
cout << endl;
cout << "liczba2 * 2" << endl;
liczba2 = liczba2 * 2;
cout << endl;
cout << "3 * liczba2" << endl;
liczba2 = 3 * liczba2;
cout << endl;
cout << "liczba1 + liczba2" << endl;
Liczby liczba3 = liczba1 + liczba2; //BRAK KONSTRUKTOROW???
cout << endl;
cout << "liczba1 * liczba2" << endl;
Liczby liczba4 = liczba1 * liczba2; //BRAK KONSTRUKTOROW???
cout << endl;
cout << "Teraz zajmiemy sie konstruktorem kopiujacym" << endl;
Liczby liczba11(20, "number_11");
Liczby liczba12 = liczba11; // konstruktor kopiujacy
Liczby liczba13 (liczba11); // konstruktor kopiujacy
Liczby liczba14 = Liczby(liczba11); // konstruktor kopiujacy
Liczby * liczba15 = new Liczby(liczba11); // konstruktor kopiujacy
}
Witam serdecznie po raz kolejny. Tym razem przychodzę z powyższym kodem. Mam pytania dotyczące wykonywania płytkiej i głębokiej kopii danego obiektu.
1) W tej części poniżej program korzysta z głębokiej kopii obiektu. Moje pierwsze pytanie: Dlaczego w tym miejscu korzysta akurat z głębokiej kopii obiektu a nie z konstruktora kopiującego?
cout << "liczba1 + 2" << endl;
liczba1 = liczba1 + 2;
cout << endl;
cout << "3 + liczba1" << endl;
liczba1 = 3 + liczba1;
cout << endl;
cout << "liczba2 * 2" << endl;
liczba2 = liczba2 * 2;
cout << endl;
cout << "3 * liczba2" << endl;
liczba2 = 3 * liczba2;
cout << endl;
2) Zaś w tej części poniżej program nie korzysta ani z głębokiej kopii obiektu, ani z konstruktora kopiującego. To jest moje drugie pytanie: Dlaczego nie jest wywoływany ani konstruktor kopiujący ani nie jest wykonywana głęboka kopia?
cout << "liczba1 + liczba2" << endl;
Liczby liczba3 = liczba1 + liczba2; //BRAK KONSTRUKTOROW???
cout << endl;
cout << "liczba1 * liczba2" << endl;
Liczby liczba4 = liczba1 * liczba2; //BRAK KONSTRUKTOROW???
cout << endl;
3) Za to w tych linijkach poniżej kopia dokonywana jest za pomocą konstruktora kopiującego. I tu trzecie pytanie: Dlaczego właśnie w tej sytuacji program korzysta z konstruktora kopiującego a nie głębokiej kopii obiektu?
Liczby liczba11(20, "number_11");
Liczby liczba12 = liczba11; // konstruktor kopiujacy
Liczby liczba13 (liczba11); // konstruktor kopiujacy
Liczby liczba14 = Liczby(liczba11); // konstruktor kopiujacy
Liczby * liczba15 = new Liczby(liczba11); // konstruktor kopiujacy
4) Program korzysta z licznika obiektów. Zauważyłem, że przy obecnym kodzie ilość obiektów na końcu wykonania programu wynosi 1. Czyli tak, jakby nie został wykonany jeden destruktor. Zauważyłem też, że jest to spowodowane ostatnią linijką kodu:
Liczby * liczba15 = new Liczby(liczba11); // konstruktor kopiujacy
Jeśli usuniemy ją z kodu, to ilość obiektów na końcu wykonania programu jest poprawna i wynosi 0. Pytanie moje brzmi więc: Jak powinien wyglądać destruktor dla tak tworzonego obiektu? Wiem, że można go stworzyć jawnie, dopisując na końcu kodu linijkę: delete liczba15. Ale może jest sposób praktyczniejszy napisany w destruktorze.