2013-01-10 24 views
14

Właśnie dowiedziałem się wczoraj, że określanie parametrów elementów listy inicjalizatora jest opcjonalne. Jakie zasady obowiązują w tym przypadku?Wartości domyślne na listach inicjalizujących C++

W poniższym przykładzie, czy ptr zostanie zainicjowane na 0, przełączyć na false, a Bar domyślnie skonstruować? Domyślam się, że to pytanie jest zbyteczne, ponieważ lista inicjalizatorów nie miałaby sensu, gdyby nieokreślone wartości argumentów == niezdefiniowane zachowanie.

Czy można również wskazać na sekcję standardu C++, która określa zachowanie w przypadku, gdy pozycje listy inicjalizacyjnej nie mają argumentów?

class Bar 
{ 
    Bar() { } 
}; 

class SomeClass; 
class AnotherClass 
{ 
public: 
    SomeClass *ptr; 
    bool toggle; 
    Bar bar; 

    AnotherClass() : ptr(), toggle(), bar() { } 
    // as opposed to... 
    // AnotherClass() : ptr(NULL), toggle(false), bar(Bar()) { } 
}; 
+0

Możliwy duplikat [listy inicjalizacyjnej konstruktora z pustą inicjalizacją] (https://stackoverflow.com/questions/11164394/constructor-initialization-list-with-empty-initialization) – Justin

Odpowiedz

12

Tak, członkowie zostaną zainicjowani odpowiednio do zera i obiektu domyślnego.

C++ 11 Określono to zachowanie w 12.6.2/7:

Wyrażenie-listy lub usztywnione inicjalizacji-lista w MEM-inicjator stosuje się zainicjować wyznaczony podobiekt (lub w przypadku konstruktora delegującego , kompletny obiekt klasy) zgodnie z zasadami inicjalizacji 8.52 dla bezpośredniej inicjalizacji.

Z kolei, 8,5/10 stanowi:

Przedmiotem których inicjator jest zbiorem pustym z nawiasach, to znaczy() są wartości inicjalizacji.

Punkt 8,5/7 określa wartości inicjalizacji:

do wartości inicjalizacji obiekt typu T oznacza

  • jeżeli T oznacza (ewentualnie CV zastrzeżeniami) typ klasy (Klauzula 9) z konstruktorem podanym przez użytkownika (12.1), następnie wywoływany jest domyślny konstruktor dla T (i inicjalizacja jest źle sformułowana, jeśli T nie ma dostępnej wartości domyślnej konstruktor);
  • jeśli T jest (ewentualnie cv wykwalifikowany) non-union klasa typ bez konstruktora użytkownika pod warunkiem, następnie obiekt jest zero zainicjowany, a jeżeli niejawnie zadeklarowanej domyślny konstruktor T w jest nietrywialne, że konstruktor jest nazywany.
  • jeśli T jest typem tablicy, , to każdy element jest inicjowany wartością; W przeciwnym razie obiekt jest zerem.

I wreszcie, 8,5/5 określa zerowej inicjowane:

zerową zainicjować obiektu lub odniesienia do typu T oznacza

  • Jeżeli T jest typ skalarny (3.9), obiekt jest ustawiony na wartość 0 (zero), przyjmowany jako całkowe wyrażenie stałe, konwertowane na T;
  • jeżeli T jest (prawdopodobnie kwalifikowanym typem cv) niezrzeszonym typem klasy, każdy niestatyczny element danych i każdy podobiekt klasy bazowej jest inicjowany od zera, a wypełnianie jest inicjalizowane na zero bitów;
  • jeśli T jest typem (prawdopodobnie kwalifikowanym cv) związkiem , pierwszy niestatyczny nazwany element danych obiektu jest zerowy- zainicjalizowany, a wypełnienie jest inicjowane na zero bitów;
  • jeśli T jest typem tablicowym , każdy element jest inicjowany od zera;
  • jeśli T jest typem odniesienia , inicjalizacja nie jest wykonywana.
+0

Doskonały i szczegółowy. Właśnie tego szukałem - dzięki! –

2

Initialisations są pokryte [dcl.init] (czyli 8,5)

punkt 10 mówi:

Przedmiotem których inicjator jest zbiorem pustym z nawiasach, to znaczy() zostanie zainicjowany wartością.

Wartość inicjalizacji jest, mówiąc prościej, domyślnie konstrukcja dla klas i zerowej inicjalizacji dla typów non-klasowych.

6

W poniższym przykładzie, PTR być inicjowane na 0, aby przełączać się fałszywe, a bar default-skonstruowany?

Tak. Jeśli inicjator elementu pojawia się na liście inicjalizacyjnej z pustymi nawiasami, to jest to wartość zainicjowana wartością. Oznacza to, że typy liczbowe będą inicjowane do zera, wskaźniki do wartości null i klasy z domyślnymi konstruktorami używającymi tego konstruktora.

Jeśli w ogóle nie uwzględnisz elementu na liście inicjalizacyjnej, to zamiast niego będzie domyślnie domyślnie zainicjowany; w tym wypadku. typy liczb i wskaźników pozostaną niezainicjalizowane.

Czy można również wskazać na sekcję standardu C++, która określa zachowanie w przypadku, gdy pozycje listy inicjalizacyjnej nie mają argumentów?

C++ 11 12.6.2/7 określa, że ​​reguły są takie same jak przy bezpośredniej inicjalizacji.

C++ 11 8.5/16 określa, że ​​jeśli inicjatorem jest (), obiekt jest zainicjowany wartością.

C++ 11 8.5/7 definiuje inicjalizację wartości.

Powiązane problemy