Одним из первых шагов в построении новых типов данных является организация данных в структуру, объединяющую несколько различных переменных с разными типами данных. Объявления структуры выполняется с помощью ключевого слова 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; // доступ через указатель
- }