Одним из первых шагов в построении новых типов данных является организация данных в структуру, объединяющую несколько различных переменных с разными типами данных. Объявления структуры выполняется с помощью ключевого слова struct .
Например, объявим структуру Vector , в котором будет храниться указатель на начало массива элементов типа double и переменная с количеством этих элементов.
struct Vector { int sz; // Число элементов double∗ elem; // указатель на элементы };
Переменная типа Vector может быть объявлена в коде следующим образом:
Vector v;
Однако само по себе это объявление не имеет пользы, поскольку необходимо инициализировать эту структуру некоторым массивом элементов с заданным количеством элементов. Можем сделать это с помощью следующей функции.
void vector_init(Vector& v, int s) { v.elem = new double[s]; // выделение памяти для массива элементов v.sz = s; }
В данной функции в качестве аргументов передаётся ссылка на объект Vector и количество элементов, которым необходимо инициализировать этот вектор. Поскольку объект типа Vector передаётся как неконстантный объект, то мы можем модифицировать его.
Оператор new выделяет память в так называемом свободном хранилище (динамической памяти или по простому куче).
Простое использование Vector выглядит следующим образом:
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; }
Впереди ещё долгий путь до того, как Vector станет гибким и элегантным, как vector из стандартной библиотеки.
Для доступа к элементам структуры можно использовать точку ( dot . ), если используется доступ через имя или ссылку, или −>, если доступ используется через указатель. Например:
void f(Vector v, Vector& rv, Vector∗ pv) { int i1 = v.sz; // доступ через имя int i2 = rv.sz; // доступ через ссылку int i4 = pv−>sz; // доступ через указатель }