
//
// To jest przykładowy kod z podrozdziału 9.7.3 „Konstruktory domyślne” książki 
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

// Prosta klasa Date (z użyciem typu Month).
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) // Sprawdza poprawność daty i wykonuje inicjację.
    {
        // ...
    }

private:
    int   y;                    // Rok
    Month m;
    int   d;                    // dzień
};

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


int main()
{
    //Date d1;                  // Błąd: brak inicjatora.
    //Date d2(1998);            // Błąd: za mało argumentów.
    //Date d3(1,2,3,4);         // Błąd: za dużo argumentów.
    //Date d4(1,"jan",2);       // Błąd: nieprawidłowy typ argumentu.
    Date d5(1,Date::jan,2);     // Dobrze: użycie trzyargumentowego konstruktora.
    Date d6 = d5;               // Dobrze: użycie konstruktora kopiującego.

    {
        string s1;              // Wartość domyślna: pusty łańcuch "".
        vector<string> v1;      // Wartość domyślna: pusty wektor — zero elementów.
        vector<string> v2(10);  // Wektor dziesięciu domyślnych łańcuchów.
    }

    {
        string s1 = string();   // Wartość domyślna: pusty łańcuch "".
        vector<string> v1 = vector<string>(); // Wartość domyślna:
        // pusty wektor — zero elementów.
        vector<string> v2(10,string());       // Wektor dziesięciu domyślnych łańcuchów.
    }

    {
        // Wolimy równoważną i potoczną wersję:
        string s1;              // Wartość domyślna: pusty łańcuch "".
        vector<string> v1;      // Wartość domyślna: pusty wektor — zero elementów.
        vector<string> v2(10);  // Wektor dziesięciu domyślnych łańcuchów.
    }

    string s;
    s[2] = 'a';                 // Zapisywanie pod losowym adresem.
    s = "hello";

    vector<string> v;
    cout << v[3];               // Odczyt z losowego adresu.

    //Date d;
    //Date::Month m = d.month();// Kopiowanie losowej wartości.

    string s1 = "";
    vector<string> v1(0);
    vector<string> v2(10,"");   // Wektor dziesięciu pustych łańcuchów.
}

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