Einer der ersten Schritte beim Erstellen neuer Datentypen besteht darin, die Daten in einer Struktur zu organisieren, die mehrere unterschiedliche Variablen mit unterschiedlichen Datentypen kombiniert. Strukturdeklarationen werden mit dem Schlüsselwort struct gemacht.
Lassen Sie uns zum Beispiel eine Vector -Struktur deklarieren, die einen Zeiger auf den Anfang eines Arrays von Elementen des Typs double und eine Variable mit der Anzahl dieser Elemente speichert.
struct Vector { int sz; // Число элементов double∗ elem; // указатель на элементы };
Eine Variable vom Typ Vector kann wie folgt im Code deklariert werden:
Vector v;
Diese Deklaration allein ist jedoch nutzlos, da diese Struktur mit einem Array von Elementen mit einer bestimmten Anzahl von Elementen initialisiert werden muss. Wir können dies mit der folgenden Funktion tun.
void vector_init(Vector& v, int s) { v.elem = new double[s]; // выделение памяти для массива элементов v.sz = s; }
In dieser Funktion werden eine Referenz auf das Vector -Objekt und die Anzahl der Elemente, die diesen Vektor initialisieren müssen, als Argumente übergeben. Da das Vector-Objekt als non-const -Objekt übergeben wird, können wir es ändern.
Der new -Operator weist Speicher im sogenannten freien Speicher (Heap oder Heap) zu.
Eine einfache Verwendung von Vector sieht so aus:
double read_and_sum(int s) // чтение целых чисел из стандартного ввода в возврат их суммы, считаем s положительным { Vector v; vector_init(v,s); // выделяем память под s элементов для v for (int i=0; i!=s; ++i) cin>>v.elem[i]; // считываем данные в массив элементов double sum = 0; for (int i=0; i!=s; ++i) sum+=v.elem[i]; // Суммируем все элементы return sum; }
Es ist noch ein langer Weg, bis Vector so flexibel und elegant wird wie Vector aus der Standardbibliothek.
Sie können einen Punkt ( dot . ) verwenden, um auf Mitglieder einer Struktur zuzugreifen, wenn Sie über einen Namen oder eine Referenz zugreifen, oder −> wenn Sie über einen Zeiger zugreifen. Zum Beispiel:
void f(Vector v, Vector& rv, Vector∗ pv) { int i1 = v.sz; // доступ через имя int i2 = rv.sz; // доступ через ссылку int i4 = pv−>sz; // доступ через указатель }