Элементарные типы данных (булевы значения, символы, числа) могут быть соединены в две базовые структуры данных, операции над которыми могут реализованы 1-2 машинными инструкциями.
Свойство | Массивы фиксированного размера | Кортежи (структуры) |
---|---|---|
![]() Однородные |
![]() Неоднородные |
|
Типы элементов | Все элементы имеют одинаковый тип | Элементы могут иметь разный тип |
Объявление | int a[10]; |
struct pair { char c; int k; } a; |
Доступ к элементам | По номеру (индексу): a[i] |
По имени поля: a.k |
Адрес элемента | адрес объекта + i*размер элемента | адрес объекта+суммарный размер предыдущих элементов |
Вычисление адреса элемента | во время выполнения | во время компиляции |
Индекс массива, состоящего из n элементов, является целым числом и принимает значения от 0 до n-1 или от 1 до n. В некоторых языках можно указать явно нижнюю и верхнюю границы изменения индекса.
Комбинируя структуры данных, можно получать более сложные:double b[10][10];
– матрица (массив из массивов)struct string { short len; char str[256]; } s;
– строка (длина и массив символов)
Из элементарных типов данных можно выделить указатель, который хранит адрес объекта. В C++ различают понятия указатель и ссылка (неизменяемый указатель на существующий объект, при использовании ссылки происходит обращение к объекту). В других языках это различие не существенно, так как, с одной стороны, все переменные являются указателями на объекты (даже для элементарных типов данных), а, с другой стороны, не нужны специальные операции доступа к объекту также как у ссылок в С++. В некоторых компилируемых языках (Java, C#) для ускорения вычислений элементарные типы и некоторые структуры могут быть представлены непосредственным значением без указателя.
В С++ использование указателей и ссылок может приводить к ошибкам.
Вместо них лучше использовать optional
и shared_ptr
, а применение обычных указателей
нужно ограничить одной функцией в целях оптимизации вычислений, не передавая и не возвращая их другой функции. Для указателей на внутренние части объекта можно использовать unique_ptr
. Для классов с умными указателями нужно определять конструктор копий и операцию присваивания, но автоматически определяемый деструктор будет корректным.
Для ссылок допустимым является только возврат ссылки на статическое значение или объект, переданный по ссылке, или его часть. Компилятор выдает только предупреждение в случае ошибки.