Evgenii Legotckoi
Шілде 8, 2017, 3:31 Т.Қ.

C++ - Сабақ 006. Құрылымдар

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз