2011-06-27 26 views
7

Jeśli mam strukturę z elementem tablicy, a ja jawnie wywołuje domyślny konstruktor tablicy w konstruktorze struktury, czy elementy zostaną ustawione domyślnie? (W przypadku tablicy całkowitoliczbowej oznaczałoby to rozpoczęcie inicjalizacji zerowej).Czy domyślnie skonstruujesz tablicę liczb całkowitych zero, aby ją zainicjować?

struct S 
{ 
    S() : array() {} 

    int array[SIZE]; 
}; 

... 

S s; 
// is s.array zero-initialized? 

Szybki test z gcc sugeruje, że jest to przypadek, ale chciałem, aby potwierdzić, że mogę polegać na tym zachowaniu.

(Zauważyłem, że jeśli nie jawnie default-skonstruować tablicę w konstruktorze konstrukcji, elementy tablicy mają wartości losowe.)

+2

Jakiś szczególny powód, dla którego nie używasz 'std :: vector'? – AJG85

+2

@ AJG85: Tak. Jeśli przydzielę tablicę 100000 z tych struktur, chciałbym, aby to spowodowało pojedynczą alokację 100000 * SIZE bajtów, zamiast pojedynczego przydziału 100000 * sizeof (int *) bajtów plus 100000 alokacji SIZE bajtów. (Z drugiej strony, mogę * być * trochę bardziej C++ - y przy użyciu 'boost :: array' (lub' std :: array' w C++ 0x)). – HighCommander4

+3

@High: Twój mentalny model 'std :: vector ' jest całkowicie błędny. Ma stały narzut około 12 bajtów plus trochę narzut na wolnym sklepie. – fredoverflow

Odpowiedz

12

Tak (kopalnia podkreślając):

(C++ 03 8,5)

do wartości inicjalizacji obiekt typu T oznacza

  • jeśli T jest typem klasy (klauzula 9) z konstruktem deklarowanym przez użytkownika (12.1), wówczas wywoływany jest domyślny konstruktor dla T (i inicjalizacja jest źle sformułowana, jeśli T nie ma dostępnego domyślnego konstruktora);

  • Jeżeli T jest bez związek klasy typu bez konstruktora dla deklarowanej, wówczas każdy niestatyczny> element danych i elementem klasy bazowej t ma wartość zainicjowany

  • Jeżeli T jest macierzowych , następnie każdy element jest inicjowany wartością;

  • inaczej, obiekt jest zero-zainicjowany

...

obiekt, którego inicjator jest zbiorem pustym nawiasów, czyli(), będzie wartość -inicjalizowane.

+0

Tak, masz rację, S jest domyślnie zainicjalizowane. Oznacza to, że tablica wewnątrz jest zbyt domyślnie zainicjowana, ponieważ S jest POD, a domyślna inicjalizacja dla tablicy nie jest taka sama jak inicjalizacja zerowa. –

+0

Przykro mi, nie zauważyłem konstruktora i pomyślałem, że to POD . Niestety, Twoja odpowiedź jest poprawna –

+0

+1: Do edycji w celu uwzględnienia wszystkich baz. – AJG85

Powiązane problemy