Evgenii Legotckoi
8 июля 2017 г. 15:31

C++ - Урок 006. Структуры

Одним из первых шагов в построении новых типов данных является организация данных в структуру, объединяющую несколько различных переменных с разными типами данных. Объявления структуры выполняется с помощью ключевого слова struct .

Например, объявим структуру Vector , в котором будет храниться указатель на начало массива элементов типа double и переменная с количеством этих элементов.

  1. struct Vector {
  2. int sz; // Число элементов
  3. double elem; // указатель на элементы
  4. };

Переменная типа Vector может быть объявлена в коде следующим образом:

  1. Vector v;

Однако само по себе это объявление не имеет пользы, поскольку необходимо инициализировать эту структуру некоторым массивом элементов с заданным количеством элементов. Можем сделать это с помощью следующей функции.

  1. void vector_init(Vector& v, int s)
  2. {
  3. v.elem = new double[s]; // выделение памяти для массива элементов
  4. v.sz = s;
  5. }

В данной функции в качестве аргументов передаётся ссылка на объект Vector и количество элементов, которым необходимо инициализировать этот вектор. Поскольку объект типа Vector передаётся как неконстантный объект, то мы можем модифицировать его.

Оператор new выделяет память в так называемом свободном хранилище (динамической памяти или по простому куче).

Простое использование Vector выглядит следующим образом:

  1. double read_and_sum(int s)
  2. // чтение целых чисел из стандартного ввода в возврат их суммы, считаем s положительным
  3. {
  4. Vector v;
  5. vector_init(v,s); // выделяем память под s элементов для v
  6. for (int i=0; i!=s; ++i)
  7. cin>>v.elem[i]; // считываем данные в массив элементов
  8.  
  9. double sum = 0;
  10. for (int i=0; i!=s; ++i)
  11. sum+=v.elem[i]; // Суммируем все элементы
  12. return sum;
  13. }

Впереди ещё долгий путь до того, как Vector станет гибким и элегантным, как vector из стандартной библиотеки.

Для доступа к элементам структуры можно использовать точку ( dot . ), если используется доступ через имя или ссылку, или −>, если доступ используется через указатель. Например:

  1. void f(Vector v, Vector& rv, Vector pv)
  2. {
  3. int i1 = v.sz; // доступ через имя
  4. int i2 = rv.sz; // доступ через ссылку
  5. int i4 = pv−>sz; // доступ через указатель
  6. }

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь