2013-08-15 8 views
6

W C++11 to możliwe, aby zainicjować struct stosując jednolitą inicjalizacji jak poniżej:Kiedy należy używać jednolitej inicjalizacji?

struct BasicStruct { 
    BasicStruct (int x, double y) : x_{x}, y_{y} {} 

private: 
    int x_; 
    double y_; 
}; 

BasicStruct var1{5, 3.2}; 

pytania:

  1. Kiedy należy używać tej składni BasicStruct var1{5, 3.2} zamiast wywołanie konstruktora jak BasicStruct var1(5, 3.2)?

  2. Kiedy należy zainicjować atrybut taki jak x_{x} zamiast starego sposobu mody x_(x)?

+2

Nie, to jest "dlaczego" i jest to "kiedy". Poważnie ludzie. – Potatoswatter

+0

@Potatoswatter http://stackoverflow.com/questions/1863784/uniform-initialization-in-c0x-when-to-use-instead-ofrr=1 itd. – Rapptz

+0

@Rapptz OK, teraz znajdź jeden z odpowiedziami, które sprawiają, że sens, lub są lepsze niż ten, który tu dodałem :) – Potatoswatter

Odpowiedz

4

Wykorzystanie list-inicjalizacji gdy lista ma charakter ogólny i można go zastąpić innym pojemniku, takim jak tablica, kruszywo, lub vector, nie zmieniając jego sens dużo.

Jeśli tworzysz określoną klasę z argumentami dla konkretnego konstruktora, to starsze wersje są bardziej odpowiednie.

Unikalną cechą inicjalizacji z usztywnione-init-listy jest to, że nie pozwala zwężenie konwersje które mogłyby spowodować dane liczbowe zostaną utracone, na przykład część ułamkową liczby zmiennoprzecinkowej lub wysokich bitów z long. Pomaga to oznaczać (lub zapobiegać) błędom wynikającym z zamiany np. węższy typ tablicy podczas refaktoryzacji kodu.

Podobnie, drugi przypadek, w którym x{ y } jest odpowiedni, jest przeprowadzany przy konwersji numerycznej, której nie można uznać za stratną. x(y) będzie bardzo się starał, aby dokonać konwersji, nawet odwołując się do reinterpret_cast, i na ogół należy go unikać.

Terminologia "jednolita inicjalizacja" jest nieco optymistyczna i nie pojawia się w standardzie. Nie jest właściwe we wszystkich przypadkach. Klasyfikacja ogólnie wskazuje na listy, więc jest poprawnie nazywana inicjalizacją listy. I właśnie wtedy należy go użyć.