Witam. Zaczynam się uczyć podstaw programowania obiektowego. Po poznaniu konstruktorów zacząłem czytać sobie o liście inicjalizacyjnej, która jest rozszerzeniem możliwości zwykłego konstruktora. Jej zadaniem jest inicjalizacja składowych nowego obiektu. Ważnym jest fakt, że wykonuje się ona jeszcze zanim obiekt zacznie istnieć. Czyli m.in. można dzięki niej przypisać wartość do pól w klasie, które są zadeklarowane jako const. Napisałem z przykładu z internetu taki program:
#include <iostream>
#include <string>
using namespace std;
class Osoba {
public:
const int wiek;
const int wzrost;
string imie;
Osoba(int wk, int WZROST, string IMIE) : wiek(wk), wzrost(WZROST) {
this->imie = IMIE;
}
};
int main()
{
Osoba Karol(24,185,"Karol"); //powyzej jest konst. wieloargumentowy, wiec musimy podac argumenty
//przy tworzeniu obiektu klasy
cout<<Karol.wiek<<endl; //wypisanie elementow
cout<<Karol.wzrost<<endl;
cout<<Karol.imie<<endl;
return 0;
}
Tutaj wszystko rozumiem. Ale w poprzednim artykule ze strony, z której się uczyłem, przeczytałem o przeciążeniu konstruktorów (coś podobnego do przeciążenia funkcji). Jeżeli użyjemy w klasie tylko jednego konstruktora i będzie to np. konstruktor wieloargumentowy, to zawsze podczas stworzenia obiektu klasy będziemy musieli podać argumenty. Jeżeli przeciążymy konstruktory i zrobimy drugi konstruktor domyślny bez parametrów, to będziemy mieli wybór, czy podczas stworzenia obiektu klasy podajemy argumenty, czy nie. W powyższym programie chciałem właśnie przeciążyć konstruktor, tworzący drugi konstruktor domyślny bez parametrów, abym nie musiał przy każdym nowym obiekcie klasy Osoba podawać danych. Napisałem coś takiego:
#include <iostream>
#include <string>
using namespace std;
class Osoba {
public:
const int wiek;
const int wzrost;
string imie;
Osoba(int wk, int WZROST, string IMIE) : wiek(wk), wzrost(WZROST) {
this->imie = IMIE;
}
Osoba() //konstruktor domyslny - blad kompilacji
{
}
};
int main()
{
Osoba Karol(24,185,"Karol"); //powyzej jest konst. wieloargumentowy, wiec musimy podac argumenty
//przy tworzeniu obiektu klasy
cout<<Karol.wiek<<endl; //wypisanie elementow
cout<<Karol.wzrost<<endl;
cout<<Karol.imie<<endl;
Osoba Karol2(); //tu miał być nowy obiekt klasy Osoba, bez podanych argumentow podczas tworzenia,
//co miało byc mozliwie dzieki przeciazeniu konstruktorow
return 0;
}
IDE pokazuje mi, że błąd jest w zmiennej const, czyli mam rozumieć, ze gdy w polach klasy mamy zmienne typu const, to musimy użyć konstruktora wieloargumentowego z listą inicjalizacyjną i nie możemy przeciążyć go, doając nowy konstruktor bezargumentowy?
I jeszcze mam jedno pytanie odnośnie nazewnictwa: Jak stworzyłem powyżej klasę Osoba, to mówię o tym: "to jest klasa osoba", tak?. A jak potem napisałem:
Osoba Karol(24,185,"Karol");
To mówię wtedy, że "stworzyłem obiekt danych typu Osoba"? Czy też można powiedzieć, że jest to po prostu klasa Osoba?