Felder mit Initialisierern in C++ [] (Felder mit Initialisierern in C++), Lektion, Seite 723271
https://www.purl.org/stefan_ram/pub/felder_initialisierer_c++ (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

Felder mit Initialisierern in C++ 

Durch Initialisierer kann der Wert von Feldern innerhalb ihrer Deklaration festgelegt werden.

Die Initialisierung nichtstatischer Felder

In dem folgenden Klassenspezifizierer wird das Feld »entity« mit dem Wert »25« initialisiert. Hierzu kann ein Initialisierer mit geschweiften Klammern hinter den Feldnamen geschrieben werden.

main.cpp

#include <iostream>
#include <ostream>

struct entity { double entity{ 25 }; };

int main(){ entity entity; ::std::cout << entity.entity << '\n'; }

::std::cout
25

Kombination mit der Aggregatinitialisierung

Wenn ein Initialisierer für ein Feld angegeben und  Aggregatinitialisierung für das ganze Objekt verwendet wird, so hat die Aggregatinitialisierung Vorrang.

main.cpp

#include <iostream>
#include <ostream>

struct entity { double entity{ 25 }; };

int main(){ entity entity{ 7 }; ::std::cout << entity.entity << '\n'; }

Protokoll
7

Initialisierung mit dem Gleichheitszeichen

Es ist auch möglich, das Gleichheitszeichen zur Initialisierung eines Feldes in der Felddeklaration zu verwenden.

main.cpp

#include <iostream>
#include <ostream>

struct entity { double entity = 25; };

int main(){ entity entity; ::std::cout << entity.entity << '\n'; }

::std::cout
25

Initialisierung mit runden Klammern

Es ist aber nicht  möglich, die Schreibweise mit runden Klammern  zur Initialisierung eines Feldes zu verwenden zu verwenden.

main.cpp

#include <iostream>

#include <ostream>

struct entity { double entity( 25 ); };

int main(){ entity entity; ::std::cout << entity.entity << '\n'; }

::std::cout
Fehlermeldung

Daß die Schreibweise mit den runden Klammern hier nicht verwendet werden kann, wird in der Norm dadurch ausgedrückt, daß die Syntax nach Abschnitt 9.2 von C++14  für einen »member-declarator« die Syntax mit den runden Klammern nicht  angibt, sondern nur »brace-or-equal-initializer« sowie noch einige andere Möglichkeiten, aber eben nicht »( expression-list )« wie bei dem »initializer« der nach 8.5 beispielsweise in einer »block-declaration« (6.7) verwendet werden kann. Der Ausschluß der Schreibweise mit den runden Klammern soll vielleicht Verwechslungen mit Funktionsdeklarationen vermeiden helfen.

C++ 2015 9.2

member-declaration:

attribute-specifier-seq/opt decl-specifier-seq/opt member-declarator;

...

member-declarator:

declarator brace-or-equal-initializer/opt

...

C++ 2015 8.5

initializer:

brace-or-equal-initializer

( expression-list )

Die Initialisierung im Standard *

Übersetzte Vereinfachung des Absatzes 9 in Abschnitt 12.6.2 des Standards von 2015
Ein nicht-statischer Dateneintrag mit einem geschweifte-Klammer-oder-gleich-Initialisierer wird nach 8.5 initialisiert.

Herleitung der Initialisierung *

Wir sehen oben eine eine Nicht-Initialisierung für die lokale Variable »entity«, weil es in der Definition der lokalen Variablen »entity« keinen Initialisierer gibt.

Bei einem Exemplar einer Klasse bedeutet dies, daß das Exemplar fehlinitialisiert  wird.

If no initializer is specified for an object, the object is default-initialized. ”, 2015 8.5p12

Der Konstruktor der Klasse wird dann mit einer leeren Argumentliste  aufgerufen. Wir haben für die Klasse »entity« keinen Konstruktor definiert. Es wurde jedoch von C++  automatisch ein Konstruktor eingerichtet. Dieser wird nun mit einer leeren Argumentliste aufgerufen.

The constructor thus selected is called, with an empty argument list, to initialize the object. ”, 2015 9.5p7

Bei der Ausführung dieses Konstruktors werden die Felder mit einer Initialisierungsliste dann entsprechend dieser Liste initialisiert.

In a non-delegating constructor ” (9.1) “if the entity is a non-static data member that has a brace-or-equal-initializer« ... »the entity is initialized as specified in 8.5; ”, 2015 12.6.2p9

Das Feld wird also listen-initialisiert.

If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized (8.5.4).”, 2015 8.5p17.1

Da die Liste nur einen einzigen Eintrag hat, wird das Feld von diesem Eintrag initialisiert.

if the initializer list has a single element ” ... “the object ” ... “is initialized from that element ”, 2015 8.5.4p3.7

Der Anfangswert des Feldes wird der Wert dieses Eintrags, also 25 (gewandelt in den Datentyp »double«).

the initial value of the object being initialized is the (possibly converted) value of the initializer expression.”, 2015 8.5p17.8

Geschichte *

In C++98  war die Initialisierung eines Feldes in seiner Deklaration nicht möglich (lediglich »= constant-expression« war bei statischen ganzzahligen const-Feldern gestattet, für die aber trotzdem immer noch eine Definition außerhalb des Klassenspezifizierers nötig ist) (9.2). Mit C++11  wurde dies dann auf »brace-or-equal-initializer« erweitert.

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 stefanram723271 stefan_ram:723271 Felder mit Initialisierern in C++ Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723271, slrprddef723271, 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_initialisierer_c++