2010-04-10 18 views
44

Jakie są domyślne wartości dla członków struktury i członków klasy w języku C++ oraz w jaki sposób reguły te różnią się (np. Między klasami/strukturami/elementami pierwotnymi/itd.)? Czy istnieją okoliczności, w których reguły dotyczące wartości domyślnych są różne?Jaka jest wartość domyślna dla członków klasy C++?

+2

Zobacz także: http://stackoverflow.com/questions/1613341/what-do-the-following-phrases-mean-in-c-zero-default-and-value-initializati, http: // stackoverflow. com/questions/2417065/c-does-the-default-constructor-initialize-built-in-types, http://stackoverflow.com/questions/1069621/are-members-of-ac-struct-initialized-to- 0-by-default – outis

Odpowiedz

41

Nie ma różnic między elemencie i klas w tym zakresie w C++. Wszystkie są nazywane po prostu typami klas:.

Członkowie typów klas nie mają wartości domyślnych w ogólnym przypadku. W celu dla członkiem klasy, aby uzyskać deterministyczny wartość musi być zainicjowany, które mogą być wykonywane przez

  • konstruktora domyślnego członu samego
  • Konstruktor listy inicjator klasy otaczającej
  • Jawnie określony inicjator obiektu klasy otaczającej (który zawiera inicjowanie wartości i inicjalizację za pomocą agregującego inicjalizatora).

Dodatkowo, wszystkie obiekty o statycznym czasie przechowywania są zerowane przy inicjalizacji programu.

Oprócz powyższych przypadków, członkowie klasy po raz kolejny nie mają wartości domyślnych i początkowo będą zawierać nieprzewidywalne wartości śmieci.

+0

Jeśli pamięć statyczna zostanie zainicjowana od zera, zależy to od używanego systemu operacyjnego. – jpyllman

+12

@jpyllman: Nie. Pamięć statyczna jest zawsze inicjalizowana od zera. Jest gwarantowany (wymagany) przez język, niezależnie od systemów operacyjnych. – AnT

+0

OK, próbowałem znaleźć takie informacje, ale ich nie znalazłem. Zawsze zakładałem, że jest niezdefiniowana, chyba że ustawisz jakąś wartość. – jpyllman

14

Tak, jest jeden. Jeśli zainicjować obiekt z domyślnego konstruktora i używać nawiasów następnie członkowie POD będzie zero zainicjowany:

someClass * p = new someClass(); 
+0

To stwierdzenie nie jest prawdziwe. Jest bardzo zależny od tego, kto napisał kompilator. Nic w standardzie nie mówi, że wartość POD zostanie zainicjowana na nic, chyba że programista przydzieli jej wartość. Właśnie dlatego istnieją narzędzia programistyczne, takie jak valgrind. – WhoCares

+0

@DamianDixon Nie, patrz: 'C++ 14 8.5 11' *" Obiekt, którego inicjator jest pustym zestawem nawiasów, tj.(), Musi być zainicjalizowany wartością. "*. '8.5 8' *" Aby wartość-zainicjować obiekt typu T oznacza: ... jeśli T jest klasą (prawdopodobnie kwalifikowaną cv) bez dostarczonego przez użytkownika lub usuniętego domyślnego konstruktora, to obiekt jest inicjalizowany od zera ... "*' 8.5 6' * "Aby wyzerować-zainicjować obiekt lub referencję typu T oznacza: ... - jeśli T jest typem klasy niezależnej od klasy (być może kwalifikowanym cv), każdy niestatyczny element danych i każdy obiekt podrzędny klasy podstawowej jest inicjalizowany od zera ... "* – HolyBlackCat

+0

@HolyBlackCat, Musisz jednak użyć pustych nawiasów. Jeśli nie dodajesz(), to znaczy zapewniasz pewien rodzaj inicjalizacji, to nie dostajesz tego zachowania i kończysz z niezainicjowanym POD. Dlatego programista musi coś zrobić, aby zainicjować zmienną. – WhoCares

Powiązane problemy