Initialisierung von Aggregaten in C++
Aggregate
Alle Reihungen sind Aggregate.
Außerdem gelten bestimmte einfache Objekte als Aggregate, die Reihungen ähneln, weil sie als eine Folge einfacher Datenfelder angesehen werden können (vereinfacht gesagt).
Wir verwenden in dieser Lektion Reihungen als Beispiele für Aggregate.
Aggregatinitialisierungen
Eine Aggregatinitialisierung erfolgt mit einer Initialisierungsliste. Deren Einträge werden zur Initialisierung der Komponenten des Objektes herangezogen, die sich an der entsprechenden Stelle befinden.
Falls es für eine Komponente eines Objektes keinen Eintrag gibt, so wird diese Komponente mit einem durch die Klasse des Objektes bestimmten Wert initialisiert, bei einer Reihung mit Komponenten elementarer Typen werden diese 0-initialisiert, bei einer Reihung mit Komponenten, deren Typ eine Klasse ist, werden diese mit dem Fehlkonstruktor initialisiert.
Beispiele
Beispiel
Bei den beiden folgenden Definitionen einer Reihung wird die Größe durch den Initialisierer festgelegt: die Reihung umfaßt 3 Komponenten. Die Komponenten haben die Werte 6, 4 und 7.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ { int const a[]{ 6, 4, 7 };
::std::cout << a[ 0 ]<< ", " << a[ 1 ]<< ", " << a[ 2 ]<< ".\n"s; }
{ int const a[] ={ 6, 4, 7 };
::std::cout << a[ 0 ]<< ", " << a[ 1 ]<< ", " << a[ 2 ]<< ".\n"s; }}Protokoll
6, 4, 7.
6, 4, 7.
Beispiel
Bei den beiden folgenden Definitionen einer Reihung wird die Größe durch den Deklarator festgelegt (sie beträgt 3). Die drei Komponenten werden durch die jeweiligen Werte der Initialisierungsliste initialisiert.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ int const a[ 3 ]{ 6, 4, 7 };
::std::cout << a[ 0 ]<< ", " << a[ 1 ]<< ", " << a[ 2 ]<< ".\n"s; }Protokoll
6, 4, 7.
Beispiel
Bei den beiden folgenden Definitionen einer Reihung wird die Größe durch den Deklarator festgelegt (sie beträgt 3). Die drei Komponenten werden durch die jeweiligen Einträge der Initialisierungsliste initialisiert. Die Komponenten ohne entsprechenden Eintrag in der Initialisierungsliste werden 0-initialisiert.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ int const a[ 3 ]{ 6, 4 };
::std::cout << a[ 0 ]<< ", " << a[ 1 ]<< ", " << a[ 2 ]<< ".\n"s; }Protokoll
6, 4, 0.
Beispiel
Eine ganz leere Initialisierungsliste führt entsprechend zur 0-initialisierung aller Komponenten.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ int const a[ 3 ] {};
::std::cout << a[ 0 ]<< ", " << a[ 1 ]<< ", " << a[ 2 ]<< ".\n"s; }Protokoll
0, 0, 0.
Beispiel
Wenn die Komponenten ohne Eintrag in der Initialisierungsliste Exemplare einer Klasse sind, werden sie mit dem Fehlkonstruktor jener Klasse initialisiert. Bei der Klasse »::std::string« erzeugt der Fehlkonstruktor ein Objekt, welches die leere Zeichenfolge repräsentiert.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ ::std::string const a[ 3 ]{ "a"s };::std::cout << R"(")" <<
a[ 0 ]<< R"(", ")" <<
a[ 1 ]<< R"(", ")" <<
a[ 2 ]<< "\".\n"s; }Protokoll
"a", "", "".
Zitate ↓
Zur Definition von Aggregaten ↓
- Zitat C++ 2017e, 11.6.1 Aggregates [dcl.init.aggr] *
- An aggregate is an array or a class with no user-provided, explicit, or inherited constructors, no private or protected non-static data members, no virtual functions, and no virtual, private, or protected base classes.