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.
Czy to oznacza, że zgodnie z powyższym kodem, właśnie utworzę wiele kopii obiektów, które przydzielam? – zeboidlund
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. –