Felder ohne Initialisierer in C++ (Felder ohne Initialisierer in C++), Lektion, Seite 723257
https://www.purl.org/stefan_ram/pub/felder_ohne_initialisierer_c++ (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

Felder ohne Initialisierer in C++ 

Felder ohne Initialisierer werden bei Anlegen eines Exemplars einer Klasse, das ohne Initialisierer erfolgt, fehlinitialisiert. Die Fehlinitialisierung wurde bereits früher in diesem Kurs behandelt. Daher können wir uns in dieser Lektion auf eine Beispiel beschränken.

In dem folgenden Programm wird mit »test test;« eine Exemplar »test« der Klasse »test« angelegt. In der Variablendefinition »test test;« steht zuerst der Klassenname, es folgt der Variablenname. Dabei werden die Felder fehlinitialisiert, weil für sie in der Klassendefinition kein Initialisierer angegeben wurde. Die Felder mit fundamentalen Typen werden dabei gar nicht initialisiert. Für Klassentypen, wie »::std::string«, wird der Konstruktor zur Initialisierung verwendet, der zu einem Aufruf mit leeren Klammern »()« paßt. Im Falle der Klasse »::std::string« ist dies ein Konstruktor, der einen leeren String anlegt.

Da das folgende Programm nicht-initialisierten Speicher n« und »x«) ausliest, hat es undefiniertes Verhalten!

Dokumentation der Klasse »::std::string« nach n3797, 21.4.2 (vereinfacht)
::std::string …();
Anlegen eines leeren ::std::string-Exemplars
main.cpp

#include <iostream>
#include <ostream>
#include <string>

struct test
{ int n;
double x;
::std::string s; };

int main ()
{

test test; /* <- Hier wird ein Exemplar der Klasse "test" angelegt. */

::std::cout << test.n << '\n';
::std::cout << test.x << '\n';
::std::cout << '"' << test.s << '"' << '\n'; }

::std::cout
-1
2.09962e-317
""

Wenn das Objekt mit einem Initialisierer angelegt wird, wird es wertinitialisiert, und dies bedeutet bei Objekten ohne benutzerdefiniertem Konstruktor (n4762 9.3p8.2) eine Nullinitialisierung, bei der alle Dateneinträge nullinitialisiert werden.

main.cpp

#include <iostream>
#include <ostream>
#include <string>

struct test
{ int n;
double x;
::std::string s; };

int main ()
{

test test{}; /* <- Hier wird ein Exemplar der Klasse "test" angelegt. */

::std::cout << test.n << '\n';
::std::cout << test.x << '\n';
::std::cout << '"' << test.s << '"' << '\n'; }

Protokoll
0
0
""

Im folgenden wird eine Typwandlung in Funktionsschreibweise zum Anlegen eines Objekts verwendet, um eine Interpretation der Variablendefinition als Funktionsdeklaration »test test();« zu vermeiden.

main.cpp

#include <iostream>
#include <ostream>
#include <string>

struct test
{ int n;
double x;
::std::string s; };

int main ()
{

auto t = test(); /* <- Hier wird ein Exemplar der Klasse "test" angelegt. */

::std::cout << t.n << '\n';
::std::cout << t.x << '\n';
::std::cout << '"' << t.s << '"' << '\n'; }

Protokoll
0
0
""

Zitate *

C++ 2015 12.6.2p9.3
otherwise, the entity is default-initialized (8.5)
C++ 2015 8.5p7
To default-initialize an object of type T means:
— If T is a (possibly cv-qualified) class type (Clause 9), constructors are considered. The applicable constructors are enumerated (13.3.1.3), and the best one for the initializer () is chosen through overload resolution (13.3). The constructor thus selected is called, with an empty argument list, to initialize the object.
— If T is an array type, each element is default-initialized.
— Otherwise, no initialization is performed.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723257 stefan_ram:723257 Felder ohne Initialisierer in C++ Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723257, slrprddef723257, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/felder_ohne_initialisierer_c++