2010-09-02 12 views

Odpowiedz

17

Nie, nie mają na myśli dokładnie tego samego.

Po wykonaniu konstruktora, przed wprowadzeniem bloku kodu (kodu między nawiasami klamrowymi) konstruuje on wszystkie elementy danych obiektu. To, co robisz w inicjalizatorach (kod po dwukropku i przed nawiasami klamrowymi), to określenie, których konstruktorów użyć dla tych elementów. Jeśli nie określisz konstruktora dla określonego elementu danych, użyty zostanie domyślny konstruktor.

Tak więc, jeśli używasz listy inicjalizacji (pierwszy przykład), prawe konstruktory będą używane dla każdego członka i nie jest potrzebny żaden dodatkowy kod. Jeśli nie, najpierw używany jest domyślny konstruktor, a następnie wykonywany jest kod wewnątrz nawiasów klamrowych.

Podsumowując:

  1. W pierwszym przykładzie, każdy element jest inicjowany za pomocą odpowiedniego konstruktora, prawdopodobnie konstruktor kopiujący.
  2. W drugim przykładzie każdy element jest konstruowany przy użyciu domyślnego konstruktora, a następnie wykonywany jest dodatkowy kod w celu jego inicjalizacji, prawdopodobnie operator przypisania.

EDYCJA: Przepraszam, zapomniałem odpowiedzieć na twoje pytania w ostatnim wierszu.

Nazwa kodu między dwukropkiem a nawiasami klamrowymi jest listą inicjalizacji.

Jeśli wiesz, który konstruktor jest właściwy dla zmiennej lub elementu danych, używaj go. Z tego powodu większość klas ma różne konstruktory, a nie tylko domyślny konstruktor. Więc lepiej jest korzystać z listy inicjalizacji.

Lista inicjalizacyjna prawie nigdy nie jest wolniejsza od innej techniki i może być z łatwością szybsza. Dobrze znaną zasadą przy pisaniu kodu jest "nie optymalizuj przedwcześnie", ale nie ma tak dobrze znanego odpowiednika: nie pesymizuj przedwcześnie. Jeśli masz dwie możliwości napisania kodu, a jedna z nich może być lepsza od drugiej, ale nie wymaga dodatkowej pracy lub złożoności, użyj go. W twoim przykładzie nie ma różnicy, ponieważ używasz wbudowanego typu (int). Ale jeśli korzystasz z klas, istnieje różnica, więc przyzwyczaj się do listy inicjalizacji.

+1

Oprócz tego, co napisał Gorpik ("+ 1" ode mnie, BTW): W językach takich jak Java i C#, gdzie wszystkie zmienne są _referencje_, to nie ma znaczenia, ponieważ członek Inicjalizacja jest po prostu zadaniem przypisania adresu. W C++ elementy danych klas są często obiektami oryginalnymi, zainicjowanymi na miejscu, a nie referencjami (wskaźnikami) zainicjowanymi w celu odniesienia do obiektów na stercie. Na przykład, dla uzasadnionej implementacji 'std :: string', inicjowanie domyślne, a następnie przypisanie może być znacznie wolniejsze niż inicjalizacja przy użyciu właściwych danych natychmiast. – sbi

+0

@sbi: Nie wszystkie zmienne są referencjami w języku C#. Język ma również typy wartości :) – jalf

+0

@jalf: Celowo trochę upraszczałem. – sbi

3

To pierwsze jest nazywane listami inicjalizacji. Możesz uzyskać wiele artykułów do tego.

Szczególne powody korzystania intializer list podano tutaj http://www.learncpp.com/cpp-tutorial/101-constructor-initialization-lists/

Można odwołać Effective C++, aby uzyskać pełny wgląd intializer list. Mam nadzieję, że jest jasne.

+2

Podobnie jak [this] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6). –

+0

^^ bardzo to ^^ –

0

BTW, Bjarne Stroustrup powiedział w C++ Programming Language że niektóre efektywność może być uzyskana z listy inicjalizacji i polecił nam korzystać z listy inicjalizacji!

+1

Jeśli możesz podać odniesienie do tego, możesz dostać kilka głosów –

Powiązane problemy