Referencja i wskaznik – prośba o wytłumaczenie kilku linijek kodu

0

Witam, czy mógłby ktoś łopatologicznie, wytłumaczyć mi i opisać, co się dzieje w poniższym kodzie w miesjcach ktorych zaznaczylem ? Skad wiedziec kiedy tak nalezy zapisac i jak dokladnie to dziala ? Z gory dziekuje :)

#include<iostream>

using namespace std;

class adres
{
    string _miasto, _kod_pocztowy, _ulica;
    unsigned _nr;
public:

     // konstruktor
    adres (string miasto, string kod_pocztowy, string ulica, unsigned nr)
    {
        _miasto = miasto;
        _kod_pocztowy = kod_pocztowy;
        _ulica = ulica;
        _nr = nr;
    }

    // dostêpówki
    string &m(){return _miasto;}
    string &kp(){return _kod_pocztowy;}
    string &u(){return _ulica;}
    unsigned &nr(){return _nr;}

    const string &m()const {return _miasto;}
    const string &kp()const {return _kod_pocztowy;}
    const string &u()const {return _ulica;}
    const unsigned &nr()const {return _nr;}

    //operator " << "
   friend ostream& operator << (ostream& out, const adres &wsk)
       {
        out << wsk.m() << " " << wsk.kp() << " " << wsk.u() << " " << wsk.nr();
        return out;
       }

    adres (adres& wsk) // konstruktor kopiuj¹cy.
    {
        _miasto = wsk.m();
        _kod_pocztowy = wsk.kp();
        _ulica = wsk.u();
        _nr = wsk.nr();
    }

    // potrzebne do pierwszego konstruktor OSOBA;
    adres (const adres& wsk)
    {
        _miasto = wsk.m();
        _kod_pocztowy = wsk.kp();
        _ulica = wsk.u();
        _nr = wsk.nr();
    }


    adres () // konstruktor domyœlny .
    {
        _miasto = "brak";
        _kod_pocztowy = "brak";
        _ulica = "brak";
        _nr = 0;
    }

/*
   friend adres operator = ( adres &adr) // operator przypisania;
   {
        _miasto = adr.m();
        _kod_pocztowy = adr.kp();
        _ulica = adr.u();
        _nr = adr.nr();  // TUTAJ PROSZE WYTLUMACZYC
   } */
};

class osoba
{
    string _imie, _nazwisko;
    unsigned _wiek;
    adres* _adr;
public:

    // TUTAJ PROSZE WYTLUMACZYC
    osoba (string imie, string nazwisko, unsigned wiek,const adres& wsk)
    {
        _imie = imie;
        _nazwisko = nazwisko;
        _wiek = wiek;
        _adr = new adres(wsk); // TUTAJ PROSZE WYTLUMACZYC
    }

    adres* POKAZ_ADRES() {return _adr;}
    const adres* POKAZ_ADRES() const {return _adr;}

   friend ostream &operator << (ostream& out, const osoba &o)
   {
       out << o.i() << " " << o.n() << " " << o.w();
   }

   string &i(){return _imie;}
   string &n(){return _nazwisko;}
   unsigned &w(){return _wiek;}

   const string &i()const {return _imie;}
   const string &n()const {return _nazwisko;}
   const unsigned &w()const {return _wiek;}

    //kostrutkor domyslny
    osoba ()
    {
        _imie = "brak";
        _nazwisko = "brak";
        _wiek = 0;
        _adr = new adres();  // TUTAJ PROSZE WYTLUMACZYC


};

int main()
{
    adres* wsk = new adres("Czestochowa", "42-200", "Dabrowskiego", 73);
    cout <<"*wsk :"<< *wsk << "\n\n";

    adres a1(*wsk);
    delete wsk;
    cout << "*wsk kopiuje do obiektu a1, usuniety zostal 'wsk'... " << "\n\n";

    const adres* wsk1 = new adres("Warszawa", "00-950", "Mysliwiecka", 357);
    cout << "Obiekt a1: " << a1 << "\n\n";
    cout << "*wsk1: " << *wsk1 << "\n\n";

    adres a2;
    cout << "Obiekt a2, stworzony przez domyslny konstruktor: " << a2 << "\n\n";

    a2 = a1;
    cout <<"Obiekt a2, przekopioway z a1: " << a2 << "\n\n";

    osoba o("Jan", "Kos", 25, *wsk1);
    cout << "Obiekt o: " << o << " " << *o.POKAZ_ADRES()<<"\n\n";
    cout << "teraz kopiuje o do o1..." << "\n\n\n\n";
    osoba o1(o);
    cout << "Obiekt o1: " << o1 << " " << *o1.POKAZ_ADRES()<<"\n\n";

    o.POKAZ_ADRES()->m() = "aaaaa";
    o.POKAZ_ADRES()->kp() = "aaaaa";
    o.POKAZ_ADRES()->u() = "aaaaa";
    o.POKAZ_ADRES()->nr() = 0;
    o.i() = "xxxx";
    o.n() = "xxxxxxxx";
    o.w() = 100;
    cout << "Zmieniony obiekt o: " << o << " " << *o.POKAZ_ADRES()<<"\n\n";
    osoba o2;
    cout << "Obiekt o2, przepisany z obiektu o1: " << o2 << " " << *o2.POKAZ_ADRES()<<"\n\n";
    o2 = o1;
    cout << "Obiekt o2: " << o2 << " " << *o2.POKAZ_ADRES()<<"\n\n";
    delete wsk1;


    return 0;
}
0

ale, co wytlumaczyc? Bo tak srednio to wytlumaczone czego nie rozumiesz
pierwszy z symbolem & przyjmuje referencje do wskaznika
drugi po prostu tworzy nowy skaznik.

uzyj smart pointerow i nie bedziesz miec takich problemow i zagadek

1 użytkowników online, w tym zalogowanych: 0, gości: 1