2012-01-18 12 views
8

Ostatnio dużo czytałem o konstruktorach z dobrze odebranej wersji C++ FAQ. Jeden z wpisów wspomina, że ​​zawsze najlepiej jest używać list inicjujących, w przeciwieństwie do inicjowania członków klasy w bloku kodu samego konstruktora.Inicjowanie niezwiązanych ze wskaźnikiem elementów klasy

Dzieje się tak dlatego, że kompilator ma tendencję do tworzenia wielu kopii członków klasy, a nie tylko jednej kopii.

Przykład

Dobry

Foo::Foo(void) 
    : mBar(new Bar) //pointer to some memory address 
{ 
} 

Bad

Foo::Foo(void) 
{ 
    mBar = new Bar; 
} 

Jedno to również wskazuje (a, a odnosi się to do konstruktorów, ale także odnosi się do czystego inicjalizacja obiektów w rodzajach l nawet z funkcji trzecich) jest to, że podczas inicjowania obiektu za pomocą metod takich jak:

void f(void) 
{ 
    Foo foo(Bar()); //Bad. 

    foo.x(); //error 
} 

będzie, cytuję: "[declare] a non-member function that returns a Foo object".

(aby uzyskać więcej informacji, kliknij link powyżej)

Pytanie

Z tego powodu jest to nierozsądne, aby posiadać:

lub nawet tym:

Geometry::Geometry(void) 
    : mFaces(QVector<GLushort>), 
     mFinalized(false), 
     mNormals(QVector<QVector3D>), 
     mVerticies(QVector<QVector3D>) 

Ze względu na sposób, w jaki t hese są przydzielone (tj. fakt, że nie są one wskaźnikami), sprawia, że ​​zastanawiam się, czy te obiekty NIE POTRZEBUJĄ inicjalizacji na początku. Jeśli tak, to czy jest to właściwa metoda postępowania? Czy istnieje lepsza metoda inicjalizacji?

Jak to odnosi się do kwestii

ten dotyczy ogólnego problemu ze względu na sposób, że metodologia za C++ inicjalizacji konstruktora dotyczy zarówno inicjowanie obiektów przy użyciu funkcji konstruktora, wraz z faktem, że jestem ignorantem do tego, czy obiekty przydzielone na stosie - lub, tak wierzę, i tak - (tak czy inaczej, obiekty bez przydziału wskaźnika) nawet wymagają najpierw inicjalizacji.

Odpowiedz

12

Jeśli zmienna składowa jest typu klasy z konstruktorem domyślnym zadeklarowanym przez użytkownika, nie trzeba jej wyraźnie wymieniać na liście inicjalizacyjnej: jego konstruktor domyślny zostanie wywołany w trakcie budowy przed jego wykonaniem. konstruktor jest wprowadzony.

Jeśli zmienna członkiem jest prymitywny typ (jak int lub bool) lub jest typu klasy, że nie ma żadnych konstruktorów zadeklarowana przez użytkownika, należy go zainicjować jawnie, w przeciwnym razie nie zostaną zainicjowane (a będzie miał nieznaną wartość, nie będzie można odczytać niezainicjowanego obiektu).

+0

Czy to oznacza, że ​​zgodnie z powyższym kodem, właśnie utworzę wiele kopii obiektów, które przydzielam? – zeboidlund

+3

Gdy używasz 'mFaces (QVector < GLushort >())', konstruujesz tymczasowy 'QVector ', kopiujesz konstruktor 'mFaces' z tego tymczasowego obiektu, a następnie zniszcz ten tymczasowy obiekt. Tak, więc tworzysz więcej obiektów niż to konieczne. –

Powiązane problemy