Discussion:
Konstruktor i lista inicjalizacyjna
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
krzysztof posłuszny
2010-10-20 14:17:27 UTC
Permalink
Mamy taki sobie programik zbudowany z dwóch klas, klasy Baza i klasy Base. W
klasie Baza obiekty są inicjalizowane w ciele konstruktora a w klasie Base
obiekty są inicjalizowane przy pomocy listy inicjalizacyjnej konstruktora.
Czy oba te sposoby inicjalizacji są sobie równoważne czy też nie? A jeżeli
nie to dlaczego? Mógłby to ktoś w przystępny sposób wyjaśnić? A tutaj kod
programiku:

//kode
#include <iostream>
using namespace std;

class Baza
{
private:
int num;
int bum;
public:
Baza();
int func();

};

Baza::Baza()
{
num=0;
bum=0;
}
int Baza::func()
{
cout<<num<<endl;
cout<<bum<<endl;

return 0;
}

class Base
{
private:
int num;
int bum;
public:
Base(int a, int b);
int func();

};
Base::Base(int a, int b):num(a),bum(b)
{

}

int Base::func()
{
cout<<num<<endl;
cout<<bum<<endl;

return 0;
}

int main()
{
int a=0,b=0;
Baza ba;
cout<<"Funkcja z klasy Baza"<<endl;
ba.func();
Base bas(a,b);
cout<<"Funkcja z klasy Base"<<endl;
bas.func();

cin.get();
return 0;

}
Witold Kuzminski
2010-10-20 15:11:57 UTC
Permalink
Post by krzysztof posłuszny
Mamy taki sobie programik zbudowany z dwóch klas, klasy Baza i klasy Base. W
klasie Baza obiekty są inicjalizowane w ciele konstruktora a w klasie Base
obiekty są inicjalizowane przy pomocy listy inicjalizacyjnej konstruktora.
Czy oba te sposoby inicjalizacji są sobie równoważne czy też nie? A jeżeli
nie to dlaczego? Mógłby to ktoś w przystępny sposób wyjaśnić? A tutaj  kod
W przypadku programiku: tak.
Gdy klasa zawiera sub-objekty nie bedace typami wbudowanymi, albo
ma klasy bazore: nie.
Konstrukcja obiektu pstepuje tak:
1. virtual base jest inicjalizowana (jesli to najbardziej derived
konstruktor)
2. bezposrednie klasy bazowe sa inicjalizowane
3. nie-statyczne member obiekty
4. cialo konstruktora jest wykonywane

Dla 1, 2 i 3, jesli cos jest na liscie inicjalizacyjnej, to ta
inicjalizacja
jest wykonana (np. nie-default konstruktor membera albo bazy).
Biorac to pod uwage, latwo zauwazyc, ze czasem lista inicjalizacyjna
to jedyny sposob inicjalizacji.
Krzysiek
2010-10-20 15:16:25 UTC
Permalink
Post by krzysztof posłuszny
Mamy taki sobie programik zbudowany z dwóch klas, klasy Baza i klasy Base. W
klasie Baza obiekty są inicjalizowane w ciele konstruktora a w klasie Base
obiekty są inicjalizowane przy pomocy listy inicjalizacyjnej konstruktora.
Czy oba te sposoby inicjalizacji są sobie równoważne czy też nie?
Nie są. Mają różne możliwości, chociaż cel jest taki sam.
Post by krzysztof posłuszny
A jeżeli
nie to dlaczego? Mógłby to ktoś w przystępny sposób wyjaśnić? A tutaj kod
Proste, niestatycznych pól const nie da się zainicjalizować inaczej niż
w liście inicjalizacyjnej. Podobnie z obiektami klas, które z jakiegoś
powodu nie mają domyślnego konstruktora. W liście inicjalizacyjnej
musisz również inicjalizować klasy, po których dziedziczysz.
--
Pozdrawiam,
Krzysiek
Paweł Kierski
2010-10-25 19:43:01 UTC
Permalink
W dniu 2010-10-20 17:16, Krzysiek pisze:
[...]
Post by Krzysiek
Proste, niestatycznych pól const nie da się zainicjalizować inaczej niż
w liście inicjalizacyjnej. Podobnie z obiektami klas, które z jakiegoś
powodu nie mają domyślnego konstruktora. W liście inicjalizacyjnej
musisz również inicjalizować klasy, po których dziedziczysz.
To jeszcze dołożę - jedyny sposób na inicjowanie pól referencji.
--
Paweł Kierski
***@pkierski.net
klops
2010-10-20 13:44:16 UTC
Permalink
Sprawa jest prosta:
Jeśli użyjesz listy inicjaizacyjnej, to konstruktor obiektu zostanie raz
wywołany. Natomiast gdy wybierzesz przypisanie w konstruktorze to
zostaną wywołane 2 konstruktory (pierwszy dla utworzenia, drugi dla
przypisania wartości), lub jeden konstruktor i jedna funkcja
przypisująca wartość (to praktycznie to samo). Dlatego zaleca się listę
inicjailzacyjną ze względów wydajnościowych. Mimo, że wygląda to okropnie...
Loading...