Frage

Was bedeuten die folgenden Sätze in C ++:

  • Null-Initialisierung,

  • default-Initialisierung und

  • Wert-Initialisierung

Was sollte ein C ++ Entwickler über sie wissen?

War es hilfreich?

Lösung

Eine Sache, zu erkennen, dass ‚Wert-Initialisierung‘ neu ist mit dem C ++ 2003-Standard - es ist nicht in dem ursprünglichen 1998-Standard nicht gibt (ich glaube, es ist vielleicht der einzige Unterschied sein, die als eine Klärung mehr ist). Siehe Kirill V. Lyadvinsky Antwort für die Definitionen direkt aus dem Standard.

Sehen Sie diese vorherige Antwort über das Verhalten von operator new Einzelheiten über die das unterschiedliche Verhalten dieser Art von Initialisierung und wenn sie treten in (und wenn sie sich von c ++ 98 bis C ++ 03):

Der Hauptpunkt der Antwort lautet:

  

Manchmal ist der Speicher durch den neuen Betreiber zurückgegeben werden initialisiert, und manchmal wird es nicht abhängig davon, ob der Typ sind Sie newing bis ein POD ist, oder wenn es eine Klasse, die POD Mitglieder enthält und mit einem Compiler- erzeugt Standardkonstruktors.

     
      
  • In C ++ 1998 gibt es zwei Arten der Initialisierung: Null und default
  •   
  • In C ++ 2003 eine dritte Art der Initialisierung Wert Initialisierung hinzugefügt wurde.
  •   

Zu sagen, sie am wenigsten, es ist ziemlich komplex und wenn die verschiedenen Methoden in Kick ist subtil.

Eine Sache, die sicherlich bewusst ist, dass MSVC die C ++ 98 Regeln, auch in VS 2008 (VC 9 oder cl.exe Version 15.x) folgt.

Der folgende Ausschnitt zeigt, dass MSVC und Digital Mars ++ 98 Regeln C folgen, während GCC 3.4.5 und Comeau der C ++ 03 Regeln befolgen:

#include <stdio.h>
#include <string.h>
#include <new>

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

int main()
{
    char buf[sizeof(B)];
    memset( buf, 0x5a, sizeof( buf));

    // use placement new on the memset'ed buffer to make sure 
    //  if we see a zero result it's due to an explicit 
    //  value initialization
    B* pB = new(buf) B();   //C++98 rules - pB->m is uninitialized
                            //C++03 rules - pB->m is set to 0
    printf( "m  is %d\n", pB->m);
    return 0;
}

Andere Tipps

C ++ 03 Standard-8.5 / 5:

  

zero-initialize ein Objekt vom Typ T bedeutet:
  - wenn T ein skalar Typ (3,9) ist, wird das Objekt auf den Wert von 0 (Null) gesetzt umgewandelt T;
  - wenn T eine nicht gewerkschaftlich Klasse-Typ, jedes nicht-statischen Datenelement und jeder Basisklasse Subobjekt ist Null initialisiert;
  - wenn T ein Union-Typ ist, der zuerst genannte Datenelement des Objekts ist Null initialisiert;
  - wenn T ein Array-Typ ist, ist jedes Element Null initialisiert;
  - wenn T ein Verweistyp ist, wird keine Initialisierung durchgeführt.

     

default-initialize ein Objekt vom Typ T bedeutet:
  - wenn T ein nicht-POD-Klasse-Typ (Ziffer 9), der Standardkonstruktor für T ist aufgerufen wird (und die Initialisierung ist schlecht ausgebildet, wenn T nicht zugänglich Standardkonstruktors hat);
  - wenn T ein Array-Typ ist, ist jedes Element default-initialisiert;
  - andernfalls wird das Objekt Null initialisiert.

     

Wert-initialize ein Objekt vom Typ T bedeutet:
  - wenn T eine Klasse Typ (Ziffer 9) mit einem vom Benutzer deklarierte Konstruktor (12.1) ist, dann wird das Standard-Konstruktor für T genannt (und die Initialisierung ist schlecht ausgebildet, wenn T nicht zugänglich Standardkonstruktors hat);
  - wenn T ein nicht gewerkschaftlich Klassentyp ohne dass ein Benutzer deklarierte Konstruktor ist, dann ist jeder nicht-statisches Datenelement und die Basisklasse Komponente von T-Wert initialisiert;
  - wenn T ein Array-Typ ist, dann ist jedes Element Wert initialisiert;
  - andernfalls wird das Objekt Null-initialisiert

     

Ein Programm, das für Standard-Initialisierung oder Wert-Initialisierung eines Unternehmens von Referenztyp nennt, ist schlecht ausgebildet. Wenn T ein cv-qualifiziert Typ, die cv-unqualifizierte Version des Typ T ist für diese Definitionen von Null-Initialisierung, default-Initialisierung und Wert-Initialisierung verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top