Создать массив объектов класса c с конструктором

Обновлено: 05.05.2024

Пытается выделить и инициализировать объект или массив объектов указанного типа или заполнителя и возвращает подходящий типизированный ненулевой указатель на объект (или на исходный объект массива).

Синтаксис

new-expression :
:: Выбрать new new-placement Выбрать new-type-id new-initializer Выбрать
:: Выбрать new new-placement Выбрать ( type-id ) new-initializer Выбрать

new-placement :
( expression-list )

new-declarator :
ptr-operator new-declarator необ.
noptr-new-declarator

noptr-new-declarator :
[ expression ] attribute-specifier-seq opt
noptr-new-declarator [ constant-expression ] attribute-specifier-seq Выбрать

new-initializer :
( expression-list необ. )
braced-init-list

Комментарии

В случае неудачи new возвращается ноль или возникает исключение. Дополнительные сведения см. в разделе "Операторы new " и delete "Операторы". Это поведение по умолчанию можно изменить, написав настраиваемую подпрограмму обработки исключений и вызвав _set_new_handler функцию библиотеки времени выполнения с именем функции в качестве аргумента.

Сведения о создании объекта в управляемой куче в C++/CLI и C++/CX см. в разделе gcnew.

Расширения компонентов Microsoft C++ (C++/CX) обеспечивают поддержку ключевого new слова для добавления записей слота vtable. Дополнительные сведения см. в разделе new (новый слот в vtable)

Если new используется для выделения памяти для объекта класса C++, конструктор объекта вызывается после выделения памяти.

delete Используйте оператор, чтобы освободить память, выделенную оператором new . delete[] Используйте оператор для удаления массива, выделенного оператором new .

В следующем примере выделяется и затем освобождается двумерный массив символов размером dim на 10. При выделении многомерного массива все измерения, кроме первых, должны быть константными выражениями, которые оцениваются как положительные значения. Крайнее левое измерение массива может быть любым выражением, результатом которого является положительное значение. При выделении массива new с помощью оператора первое измерение может быть равным нулю; new оператор возвращает уникальный указатель.

Не type-id может содержать const , volatile объявления классов или объявления перечисления. Следующее выражение имеет неправильный формат:

Оператор new не выделяет ссылочные типы, так как они не объекты.

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

Если оператор используется new без дополнительных аргументов и компилируется с параметром /GX , /EHa или /EHs параметром, компилятор создает код для вызова оператора delete , если конструктор создает исключение.

В следующем списке описаны элементы грамматики new :

new-placement
Предоставляет способ передачи дополнительных аргументов при перегрузке new .

type-id
Указывает тип, который нужно выделить; это может быть встроенный или определяемый пользователем тип. Если спецификация типа является сложной, она может быть окружена круглыми скобками, чтобы принудительно реализовать порядок привязки. Тип может быть заполнителем ( auto ), тип которого определяется компилятором.

new-initializer
Предоставляет значение для инициализированного объекта. Инициализаторы не могут быть указаны для массивов. Оператор new создает массивы объектов только в том случае, если у класса есть конструктор по умолчанию.

noptr-new-declarator
Задает границы массива. При выделении многомерного массива все измерения, кроме первых, должны быть константными выражениями, которые оценивают положительные значения, преобразуемые std::size_t в . Крайнее левое измерение массива может быть любым выражением, результатом которого является положительное значение. Применяется attribute-specifier-seq к связанному типу массива.

Пример. Выделение и освобождение массива символов

В следующем примере кода выделяется и освобождается массив символов и объект класса CName .

Пример: new оператор

Если используется форма new размещения оператора (форма с большим количеством аргументов, чем размер), компилятор не поддерживает форму delete размещения оператора, если конструктор создает исключение. Пример:

Инициализация объектов, выделенных с помощью new

Необязательное new-initializer поле включается в грамматику new для оператора. Это поле позволяет инициализировать новые объекты с помощью определяемых пользователем конструкторов. Дополнительные сведения о том, как выполняется инициализация, см. в разделе "Инициализаторы". В следующем примере показано, как использовать выражение инициализации с оператором new :

В этом примере объект CheckingAcct выделяется с помощью new оператора, но инициализация по умолчанию не указана. Поэтому вызывается конструктор по умолчанию для класса Acct() . Затем объект SavingsAcct выделяется таким же образом, за исключением того, что он явно инициализирован до 34,98. Так как 34.98 имеет тип double , конструктор, принимаюющий аргумент этого типа, вызывается для обработки инициализации. Наконец, тип HowMuch , отличный от класса, инициализируется до версии 43.0.

Если объект относится к типу класса и имеет конструкторы (как показано в предыдущем примере), объект может быть инициализирован оператором new только в том случае, если выполняется одно из следующих условий:

Аргументы, указанные в инициализаторе, соответствуют аргументам конструктора.

Класс имеет конструктор по умолчанию (конструктор, который можно вызвать без аргументов).

Явная инициализация для каждого элемента не может быть выполнена при выделении массивов с помощью new оператора. Вызывается только конструктор по умолчанию ( если он присутствует). Дополнительные сведения см. в разделе "Аргументы по умолчанию".

Если выделение памяти завершается сбоем ( operator new возвращает значение 0), инициализация не выполняется. Такое поведение защищает от попыток инициализации данных, которые не существуют.

Как и при вызовах функций, порядок вычисления инициализированных выражений не определен. Кроме того, вы не должны полагаться на эти выражения, вычисляемые полностью перед выделением памяти. Если выделение памяти завершается сбоем, а new оператор возвращает ноль, некоторые выражения в инициализаторе могут быть полностью оценены.

Время существования объектов, выделенных с помощью new

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

После того как указатель AnotherArray в этом примере вышел за пределы области видимости, объект невозможно удалить.

Как работает new

Выражение new-expression , содержащее new оператор, выполняет три действия:

Находит и резервирует хранилище для объекта или объектов, которым нужно выделить память. После завершения этого этапа выделяется правильный объем хранилища, но он еще не является объектом.

Инициализирует объекты. После завершения инициализации имеется достаточно информации, чтобы выделенная память являлась объектом.

Возвращает указатель на объекты типа указателя, производного от new-type-id или type-id . Программа использует этот указатель для доступа к новому объекту, которому выделена память.

Оператор new вызывает функцию operator new . Для массивов любого типа и для объектов, которые не class struct являются или union типами, глобальной функцией, ::operator new вызывается для выделения хранилища. Объекты типа класса могут определять собственную operator new статическую функцию-член на основе каждого класса.

Когда компилятор обнаруживает new оператор для выделения объекта типа T , он выдает вызов T::operator new( sizeof(T) ) или, если пользователь не определен operator new , ::operator new( sizeof(T) ) . new Оператор может выделить правильный объем памяти для объекта.

Параметр в грамматике разрешает спецификацию new-placement (см. грамматику для new оператора). Параметр new-placement можно использовать только для определяемых пользователем реализаций operator new ; он позволяет передавать operator new дополнительные сведения в . Выражение с таким полем new-placement , как T *TObject = new ( 0x0040 ) T; преобразуется T *TObject = T::operator new( sizeof( T ), 0x0040 ); , если класс T имеет член operator new , в противном случае — в T *TObject = ::operator new( sizeof( T ), 0x0040 ); .

Первоначальное new-placement намерение поля заключается в том, чтобы разрешить выделение объектов, зависимых от оборудования, на указанных пользователем адресах.

Хотя в предыдущем примере показано только один аргумент в new-placement поле, нет ограничений на то, сколько дополнительных аргументов можно передать operator new таким образом.

Даже если operator new для типа T класса определен, глобальный оператор new можно использовать явным образом, как в следующем примере:

Оператор разрешения области ( :: ) принудительно использует глобальный new оператор.

Как правильно объявить массив объектов, чтоб для каждого элемента вызвался конструктор? В C++ аналогичная конструкция работает как надо, и конструктор вызывается.

@Grundy можно, только она будет инициализироваться дефолтными значениями типов, иначе говоря нулями и null-значениями. Так что все равно придется пробегать по массиву и инициировать внутреннюю логику, если она есть.

@rdorn, забавно, что хотели добавить возможность объявлять конструктор без параметров для структур, но передумали :)

4 ответа 4

Тут вы создаете сам объект класса MyClass

А тут вы создаете массив ссылок на объекты класса MyClass

Что бы создать массив объектов класса MyClass вам требуется создать каждый объект собственноручно:

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

Никак. Массив - это отдельный объект. То есть грубо говоря мы создаем не "Пять объектов типа MyClass". А: "Один объект, размером в пять объектов MyClass". Как следствие создавать объекты при конструировании массива нельзя. Но объекты можно создавать после создания массива, Например в инициализаторе:

Либо через "for" (как в соседнем ответе).

"Один объект, размером в пять объектов MyClass" в корне не верно, если MyClass не является структурой. Размер массива для ссылочных типов не зависит от размера объектов и не содержит самих объектов.

Ответ AGS17 жизнеспособен, но можно также воспользоваться и обобщенным методом:

Использовать можно так:

В чем профит использования этого метода? Экономия 2 строчек кода? Он же (метод) сделает код чуточку медленней (или заинлайнится?), требует чуточку памяти (что не критично), и делает код чуточку менее понятней (читателю надо будет пройти и поглядеть, что же там происходит внутри метода), ещё и название метода не совсем верное, так как тут не только инициализация массива, но и элементов. Метод ещё и работает только с типами с дефолтным конструктором. По мне так вещь бесполезная.

Этот метод при активном использовании будет работать значительно медленнее, чем при использовании цикла - new T() в генериках разворачивается в рефлекшн, Activator.CreateInstance, который значительно медленнее обычного new.

Может, просто плохо искала, но не могу найти. Есть класс, атрибутом которого является массив объектов другого класса. Как составить конструктор класса, чтобы этот массив инициализировать, при том, что объекты классов как атрибуты разрешается (преподом) инициализировать только через список инициализации? Или это невозможно, а я что-то неправильно понимаю?

Инициализация объектов класса в конструкторе другого класса
У меня есть класс Subscriber,в котором есть несколько объектов другого класса Date,мне нужно,чтобы.

Создание объектов класса через random
Есть строка кода kot.Add(new kot(r.Next(6) * 40,r.Next(6) * 40)); Как при создании этого объекта.

Может, просто плохо искала, но не могу найти. Есть класс, атрибутом которого является массив объектов другого класса. Как составить конструктор класса, чтобы этот массив инициализировать, при том, что объекты классов как атрибуты разрешается (преподом) инициализировать только через список инициализации? Или это невозможно, а я что-то неправильно понимаю?

Ну, в новом стандарте все нескалярные объекты можно инициализировать через списки инициализации. Ваша задача наверно как раз чтобы в этом потренироваться.

Ну, в новом стандарте все нескалярные объекты можно инициализировать через списки инициализации. Ваша задача наверно как раз чтобы в этом потренироваться.

А как это реализовать то можно? С инициализацией одного объекта проблем не возникает, вопрос именно в массиве.

А как это реализовать то можно? С инициализацией одного объекта проблем не возникает, вопрос именно в массиве.

Я, Абрашина Надежда Александровна, даный код предадлежит мне.
У меня паранойя на счет того, что проект после сдачи могут проверить плагиат-тестом, не обращайте внимания.

Сейчас у меня в классе UserList прописан один обьект класса User, но предполагается, что таких объектов будет масив из количества элементов, задаваемого с клавиатуры.

DrOffset, либо я чего-то не понимаю в этом коде, либо это не тот случай. Не ясно, как таким образом можно инициализировать обьект более чем с одной переменной.

Добавлено через 32 минуты

nd2, теперь поняла, спасибо. Но мне это все равно явно не годится (даже если я зафиксирую количество элементов в массиве, оглашать их по одному - это явно плохой стиль).

Если значения не поддаются выражению через какую-либо формулу, то вполне нормально. Для большого количества элементов можно вызывать приватную функцию инициализации из конструктора.
Однако, большое количество данных лучше хранить не в коде, а, например, получать из файла/БД.
Также, можно использовать std::fill/std::generate.

Если значения не поддаются выражению через какую-либо формулу, то вполне нормально. Для большого количества элементов можно вызывать приватную функцию инициализации из конструктора.
Однако, большое количество данных лучше хранить не в коде, а, например, получать из файла/БД.
Также, можно использовать std::fill/std::generate.

К сожалению, я не знаю ни что там будет (инициализировать предполагается через конструктор по умолчанию), ни даже сколько их (хотя если прям без вариантов, могу определить конкретное количество, черт с ним). Работать с базами данных я не умею от слова "совсем". По поводу файлов - подумаю.

Добавлено через 4 минуты

Впервые вижу такую строку.

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

К сожалению, я не знаю ни что там будет (инициализировать предполагается через конструктор по умолчанию), ни даже сколько их (хотя если прям без вариантов, могу определить конкретное количество, черт с ним).

Вообще тут все упирается опять же в твое знание языка. Пока что можно сказать, что ответ был дан ровно на то, о чем просили. Т.к. в итоге оказалось, что требуется нечто другое, то вопрос необходимо уточнить.
Вариантов вообще очень много. Просто сейчас твои требования противоречивы. Надо привести все в порядок и решение будет найдено.

Итак, есть задача создавать массив произвольного количества элементов, при этом инициализация должна быть только (почему?) в констукторе по умолчанию? А данные для инициализации этот конструктор сам откуда-то возьмет? При этом и сам массив и данные его элементов нужно обязательно заполнять через список инициализации? В общем, раскрой побольше деталей задачи.

Пока что можно предложить такой вариант:


Впрочем, все равно необходимо определиться откуда данные будут поступать в случае, если объект создается не по умолчанию.

Есть класс, название которого Class_Array. В него есть 5 перегруженных конструкторов Class_Array (), Class_Array ( int count ),
Class_Array( int arr[], int count ), Class_Array( char arr[], int count ), Class_Array( float arr[], int count ). В задании написано, что каждый конструктор должен создавать массив (первые 3 конструктора создают массив типа int, Class_Array( char arr[], int count ) массив типа char и Class_Array( float arr[], int count ) массив типа float). Также есть методы
void setElement ( int index, float val ), int getIntElement ( int index, int & err ), int getCharElement ( int index, int & err ),
int getFloatElement ( int index, int & err ). Проблема заключается вот в чём: методы возвращают значение
элемента массива соответствующего типа. Но они не имеют доступ к массивам, которые я создал внутри конструкторов. Я сделал 3 массива в полях класса, но не уверен, что это нужно именно так. Как можно обратиться к массивам, если функции не имеют к ним доступа?

Макрос который создает класс
Создал макрос который создает класс, но почему то он не работает, инициализация класса не.


Необходимо создать класс, который создает линию разлива воды
необходимо создать класс, который создает линию разлива воды.дан объем общего бака линии. бутылки.

Решение

remag7, вы думаете вернуть число с плавающей точкой преобразовав к целому это то что нужно?
Есди вы в классе собрались хранить кучу разных указателей на разные массивы, то нужно обеспечить нормальный доступ. Кроме того нужно обеспечить проверку на готовность указателя. Я бы обеспечил равенство нулевому указателю для всех случаев когда массив не выделен. А вообще, задание с прибабахом. имхо.

Я не думал, а просто скопировал прототип функции Только благодаря вам заметил подвох. Не ожидал такого.

remag7, класс это тип. Это значит что он даёт какие-то гарантии (контракт) об операциях и данных. Если зашить в него зоопарк и возложить на внешний код задачу по выяснению, того что можно делать с данным конкретным объектом, то свитчей и ифов в контексте обращений к объекту будет немерено. Это нивелирует пользу от класса. Иногда в буфере размещённом в объединении лепят разношерстные массивы, но это другой разговор.
В любом разе - советую назвать указатели так чтобы их имена говорили о типе. Снизит головную боль вдвое.

Лучше все указатели в ноль установить от греха. Делайте это в конструкторах. Не нужно писать в тело то что не нужно. Напишите конструкторы принимающие указатель каждого типа (там все остальные - в ноль). Если понаписать конструкторы принимающие все возможные комбинации указателей получите комбинаторную сложность. Я бы не стал этого делать. Совесть того кто вам такое задал выдержит такое и не крякнет.
Может вы не верно толкуете условие?
Наберите-ка его слово-в-слово.

Задание:
1. Создать класс Class_Array. Класс должен иметь следующие конструкторы:
 Class_Array (). Конструктор создает массив целого типа, размером 1 элемент
со значением 0.
 Class_Array ( int count ). Конструктор создает массив целого типа с
количеством элементов count. Все элементы должны иметь значение 0.
 Class_Array( int arr[], int count ). Конструктор создает массив целого типа
с количеством элементов count. Значения элементов копируются из массива
arr. Если arr = NULL или count размером 1 элемент со значением 0.
 Class_Array( char arr[], int count ). Конструктор создает массив типа char
с количеством элементов count. Значения элементов копируются из массива
arr. Если arr = NULL или count 1 элемент со значением 0.
 Class_Array( float arr[], int count ). Конструктор создает массив типа float
с количеством элементов count. Значения элементов копируются из массива
arr. Если arr = NULL или count 1 элемент со значением 0.
Кроме этого, класс Class_Array должен иметь следующие методы:
 void setElement ( int index, float val ). Метод присваивает значение элементу
массива соответствующего типа (который определен в конструкторе).
 int getIntElement ( int index, int & err ). Метод возвращает значение
элемента массива типа int. В случае неправильного значения index, err
устанавливается в -1, иначе в 0.
 int getCharElement ( int index, int & err ). Метод возвращает значение
элемента массива типа char. В случае неправильного значения index, err
устанавливается в -1, иначе в 0.
 int getFloatElement ( int index, int & err ). Метод возвращает значение
элемента массива типа float. В случае неправильного значения index, err
устанавливается в -1, иначе в 0.
Класс Class_Array должен иметь деструктор, который выполняет корректное
освобождение выделенных ресурсов.
2. Написать консольную программу, демонстрирующую работу с экземплярами
класса Class_Array, созданными с помощью каждого из конструкторов и
использующими перечисленные методы.

Массив — это последовательность объектов того же типа, которые занимают непрерывную область памяти. Традиционные массивы в стиле C являются источником многих ошибок, но по-прежнему являются распространенными, особенно в старых базах кода. В современном C++ настоятельно рекомендуется использовать std::vector или std::array вместо массивов в стиле C, описанных в этом разделе. Оба этих стандартных типа библиотек хранят свои элементы в виде непрерывного блока памяти. Однако они обеспечивают гораздо большую безопасность типов и поддерживают итераторы, которые гарантированно указывают на допустимое расположение в последовательности. Дополнительные сведения см. в разделе "Контейнеры".

Объявления стека

В объявлении массива C++ размер массива указывается после имени переменной, а не после имени типа, как в некоторых других языках. В следующем примере для стека объявляется массив из 1000 двойников. Число элементов должно быть предоставлено в виде целочисленного литерала или в виде константного выражения. Это связано с тем, что компилятору необходимо знать, сколько пространства стека необходимо выделить; Он не может использовать значение, вычисленное во время выполнения. Каждому элементу в массиве присваивается значение по умолчанию 0. Если вы не назначаете значение по умолчанию, каждый элемент изначально содержит любые случайные значения, которые будут находиться в этом расположении памяти.

Первый элемент в массиве является нулевым элементом. Последним элементом является элемент (n-1), где n — количество элементов, которые может содержать массив. Число элементов в объявлении должно быть целочисленным типом и должно быть больше 0. Ваша ответственность заключается в том, чтобы программа никогда не передает значение оператору подстрока, который больше (size - 1) .

Массив нулевого размера является допустимым только в том случае, если массив является последним полем в struct или union если расширения Майкрософт включены ( /Za или /permissive- не заданы).

Массивы на основе стека быстрее выделяют и получают доступ, чем массивы на основе кучи. Однако пространство стека ограничено. Количество элементов массива не может быть настолько большим, что использует слишком много памяти стека. Сколько слишком много зависит от вашей программы. Средства профилирования можно использовать для определения того, слишком ли большой массив.

Объявления кучи

Может потребоваться слишком большой массив для выделения в стеке или размер которого неизвестлен во время компиляции. Этот массив можно выделить в куче с помощью new[] выражения. Оператор возвращает указатель на первый элемент. Оператор подстрока работает с переменной указателя так же, как и в массиве на основе стека. Можно также использовать арифметические указатели для перемещения указателя на любые произвольные элементы в массиве. Вы несете ответственность за обеспечение следующего:

  • Всегда хранится копия исходного адреса указателя, чтобы можно было удалить память, если массив больше не нужен.
  • Адрес указателя не увеличивается или уменьшается после границ массива.

В следующем примере показано, как определить массив в куче во время выполнения. В нем показано, как получить доступ к элементам массива с помощью оператора подстрока и с помощью арифметики указателя:

Инициализация массивов

Массив можно инициализировать в цикле, по одному элементу за раз или в одной инструкции. Содержимое следующих двух массивов идентично:

Передача массивов в функции

Когда массив передается функции, он передается в качестве указателя на первый элемент, будь то массив на основе стека или кучи. Указатель не содержит дополнительных сведений о размере или типе. Такое поведение называется разложением указателя. При передаче массива в функцию необходимо всегда указывать количество элементов в отдельном параметре. Это также означает, что элементы массива не копируются при передаче массива в функцию. Чтобы предотвратить изменение элементов функцией, укажите параметр в качестве указателя на const элементы.

В следующем примере показана функция, которая принимает массив и длину. Указатель указывает на исходный массив, а не копию. Так как параметр не const задан, функция может изменять элементы массива.

Объявите и определите параметр p массива так, const чтобы он был доступен только для чтения в блоке функции:

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

Многомерные массивы

Массивы, созданные из других массивов, являются многомерными. Такие многомерные массивы определяются путем последовательного размещения нескольких константных выражений, заключенных в квадратные скобки. Рассмотрим, например, следующее объявление:

Он задает массив типа int , концептуально упорядоченный в двумерной матрице из пяти строк и семи столбцов, как показано на следующем рисунке:


Концептуальная структура многомерного массива

Можно объявить многомерные массивы с списком инициализаторов (как описано в инициализаторах). В этих объявлениях можно опустить константное выражение, указывающее границы для первого измерения. Пример:

В показанном выше объявлении определяется массив, состоящий из трех строк и четырех столбцов. Строки представляют фабрики, а столбцы — рынки, на которые фабрики поставляют свою продукцию. Значения — это стоимости транспортировки с фабрик на рынки. Первое измерение массива опущено, но компилятор заполняет его, проверяя инициализатор.

Использование оператора косвенного обращения (*) в типе n-мерного массива приводит к получению массива n-1. Если n равно 1, создается скаляр (или элемент массива).

Массивы C++ размещаются в памяти по срокам. Построчный порядок означает, что быстрее всего изменяется последний индекс.

Пример

Можно также опустить спецификацию границ для первого измерения многомерного массива в объявлениях функций, как показано ниже:

Эта функция FindMinToMkt записывается таким образом, что добавление новых фабрик не требует каких-либо изменений в коде, а просто перекомпиляции.

Инициализация массивов

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

Рассмотрим класс Point , определяющий два конструктора:

Первый элемент aPoint создается с помощью конструктора Point( int, int ) , а оставшиеся два элемента — с помощью конструктора по умолчанию.

Статические массивы элементов (независимо от того, можно ли const ) инициализировать в их определениях (за пределами объявления класса). Пример:

Доступ к элементам массива

К отдельным элементам массива можно обращаться при помощи оператора индекса массива ( [ ] ). Если вы используете имя одномерного массива без подстрока, оно вычисляется как указатель на первый элемент массива.

Если используются многомерные массивы, в выражениях можно использовать различные сочетания.

В приведенном выше коде multi представляет собой трехмерный массив типа double . Указатель p2multi указывает на массив типа double размера 3. В этом примере массив используется с одним, двумя и тремя индексами. Хотя обычно указываются все подстроки, как в инструкции cout , иногда бывает полезно выбрать определенное подмножество элементов массива, как показано в следующих cout инструкциях.

Перегруженный оператор подстрочного индекса

Как и другие операторы, оператор подстрока ( [] ) может быть переопределен пользователем. Поведение оператора индекса по умолчанию, если он не перегружен, — совмещать имя массива и индекс с помощью следующего метода.

Как и во всех дополнениях, включающих типы указателей, масштабирование выполняется автоматически для настройки размера типа. Результирующая величина не является n байтами из источника array_name ; вместо этого это n-й элемент массива. Дополнительные сведения об этом преобразовании см. в разделе "Аддитивные операторы".

Аналогично, для многомерных массивов адрес извлекается с использованием следующего метода.

((array_name) + (subscript1 * max2 * max3 * . * maxn) + (subscript2 * max3 * . * maxn) + . + subscriptn))

Массивы в выражениях

Если идентификатор типа массива отображается в выражении, отличном от sizeof адреса ( & ) или инициализации ссылки, он преобразуется в указатель на первый элемент массива. Пример:

Указатель psz указывает на первый элемент массива szError1 . Массивы, в отличие от указателей, не являются изменяемыми l-значениями. Вот почему следующее назначение является незаконным:

Читайте также: