Objekte mit mehreren Feldern in C++
Es ist auch möglich, mehrere Felder in einem Klassenspezifizierer zu deklarieren.
In dem folgenden Programm wird eine Klasse definiert, deren Objekte zwei double-Felder namens »x« und »y« haben. Das Programm zeigt, daß jedes Feld unabhängig vom anderen jeweils einen double-Wert speichern kann.
main.cpp
#include <iostream>
#include <ostream>struct pair
{ double x;
double y; };int main()
{ pair o;
o.x = 2.0;
o.y = 3.0;
::std::cout << o.x << '\n';
::std::cout << o.y << '\n'; }::std::cout
2
3
Das folgende Beispiel illustriert die Unabhängigkeit zweier Felder zweier Objekte.
main.cpp
#include <iostream>
#include <ostream>struct pair
{ double y;
double x; };int main()
{ pair p;
pair q;
p.x = 1.0;
p.y = 2.0;
q.x = 3.0;
q.y = 4.0;
::std::cout << p.x << '\n';
::std::cout << p.y << '\n';
::std::cout << q.x << '\n';
::std::cout << q.y << '\n'; }::std::cout
1
2
3
4
Aggregatinitialisierung
Es ist erlaubt, daß bei einer Aggregatinitialisierung die Initialisierer für einige Felder weggelassen werden, dann werden die Einträge, für die kein Initialisierer festgelegt wurde, mit ihrem Eintragsinitialisierer initialisiert (falls keiner vorhanden ist, werden sie wertinitialisiert).
main.cpp
#include <iostream>
#include <ostream>struct pair
{ double a;
double b{ 1.0 };
double c{ 5.0 };
double d; };int main()
{ pair o{ 2.0, 3.0 };
::std::cout << o.a << '\n';
::std::cout << o.b << '\n';
::std::cout << o.c << '\n';
::std::cout << o.d << '\n'; }transcript
2
3
5
0
Für das Feld »b« wurde ein Initialisierer »{ 1.0 }« im Klassenspezifizierer angegeben, doch dann hatte der Wert »3.0« aus der Aggregatinitialisierung Vorrang. Das folgende Programm zeigt den Ablauf der Initialisierung.
main.cpp
#include <iostream>
#include <ostream>
#include <string>using namespace ::std::literals;
template< class C >
C value( C const x )
{ ::std::cout << "value: "s << x << '\n';
return x; }struct pair
{ double b{ value( 1.0 ) }; };int main()
{ pair o{ value( 2.0 ) };
::std::cout << o.b << '\n'; }transcript
value: 2
2