
//
// To jest przykładowy kod z podrozdziału 9.7.4 „Stałe funkcje składowe” książki 
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include <iostream>

using namespace std;

//------------------------------------------------------------------------------

class Date {
public:
    enum Month {
        jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
    };

    Date(int yy, Month mm, int dd) : y(yy), m(mm), d(dd) {}

    int   day()   const;         // Stała składowa: nie może modyfikować obiektów.
    Month month() const;         // Stała składowa: nie może modyfikować obiektów.
    int   year()  const;         // Stała składowa: nie może modyfikować obiektów.

    void add_day(int n);         // Niestała składowa: może modyfikować obiekty.
    void add_month(int n);       // Niestała składowa: może modyfikować obiekty.
    void add_year(int n);        // Niestała składowa: może modyfikować obiekty.
private:
    int   y;                     // Rok
    Month m;
    int   d;                     // Dzień miesiąca
};

//------------------------------------------------------------------------------

int Date::day() const
{
    //++d;        // Błąd: próba zmodyfikowania obiektu za pomocą stałej funkcji składowej.
    return d;
}

//------------------------------------------------------------------------------

void Date::add_day(int n) {}

//------------------------------------------------------------------------------

void some_function(Date& d, const Date& start_of_term)
{
    int a = d.day();             // ok
    int b = start_of_term.day(); // Powinno być dobrze (czemu?).
    d.add_day(3);                // dobrze
    //start_of_term.add_day(3);  // błąd
}

//------------------------------------------------------------------------------

int main()
{
    Date d(2000, Date::jan, 20);
    const Date cd(2001, Date::feb, 21);

    cout << d.day() << " - " << cd.day() << endl;        // ok
    d.add_day(1);                // ok
    //cd.add_day(1);             // Błąd: cd jest const.
    some_function(d,cd);
    //some_function(cd,d);       // Błąd: cd jest const.
    return 0;
}

//------------------------------------------------------------------------------
