Скажем, мы объявляем массив структур в локальной области видимости:
int main()
{
RandomStruct array [1000];
}
В настоящее время структуры в массиве не инициализированы. Хотя это означает, что переменные структуры также не инициализированы, означает ли это что-то еще? Например, если я устанавливаю всем переменным из неинициализированной структуры желаемое значение, а затем использую функции этой структуры, или если я использую функции структуры, которые не используют неинициализированные переменные до их установки. Правильно ли я думаю, что только переменные будут неинициализированы, а массив просто назначает случайную память каждой из переменных структуры?
Действительно? Даже если массив является локальным для основного метода? @AlgirdasPreidžius
Почему нельзя вызывать конструктор по умолчанию, если массив локальный?
«Вы ошибаетесь». Тем не менее, я сказал: «Содержащие переменные (структуры) не инициализированы, только если конструктор по умолчанию их не инициализирует», а конструктор по умолчанию, сгенерированный компилятором, не инициализирует их. Пожалуйста, не говорите, что люди не правы, если вы не читали всего, что они написали.
@AlgirdasPreidžius Ага, то есть в случае структур с локальными массивами они создаются конструктором по умолчанию, сгенерированным компилятором, а, например, в статических массивах они создаются конструктором структуры по умолчанию? Это также касается, скажем, массива int? Спасибо за эту информацию, я новичок в C++.
@ 12123232 это не похоже на правильную характеристику. В обоих случаях используется ctor по умолчанию, и он может быть либо сгенерирован компилятором, либо предоставлен пользователем, в зависимости от того, объявили ли вы его при написании фактического определения структуры.
@ 12123232 «поэтому в случае структур с локальными массивами они создаются конструктором по умолчанию, сгенерированным компилятором» Не обязательно. Вот почему я написал свой комментарий. Конструктор может быть предоставлен пользователем, который может инициализировать содержащие переменные. Не зная, что такое RandomStruct, невозможно узнать, будут ли инициализированы его значения членов. Если это так, например struct RandomStruct {int a; RandomStruct () : a(-1) {}}; - a будет инициализироваться -1, каждый раз, независимо от того, где выполняется такое построение.
@nanofarad О, я знаю, что конструктор по умолчанию создается, когда пользователь не определил его. Это то, что подразумевается под конструктором по умолчанию, созданным компилятором? Посмотрите на эту программу: pastebin.com/Da6Xc2He, во-первых, я бы сказал, что структура в ar[3] неинициализирована, и ее переменные неинициализированы, как видно при печати, но если вы назначите конструктор по умолчанию для ar[ 3], то переменные инициализируются.
@ 12123232 Под «конструктором по умолчанию, сгенерированным компилятором» подразумевается то, что, игнорируя то, как вы используете свою структуру, если вы не объявляете/определяете RandomStruct::RandomStruct() или объявляете его RandomStruct() = default, компилятор генерирует ctor по умолчанию (см. «Неявно объявленный конструктор по умолчанию» на en.cppreference.com/w/cpp/language/default_constructor). Вы не можете «назначить конструктор по умолчанию для ar[3]. ... (слишком длинный для комментариев)
... Что вы можете иметь в виду, так это то, что вы создаете временное по умолчанию и назначаете его ar[3], используя это
@nanofarad Таким образом, в основном конструктор по умолчанию компилятором не делает все члены структуры равными их значениям по умолчанию? Есть ли тогда какая-либо разница между статическими и локальными массивами (если мы говорим, например, о типе int, статические массивы инициализируются значениями по умолчанию, в то время как локальные имеют неопределенные значения).
@AlgirdasPreidžius, так что, если структура представляет собой просто struct RandomStruct {int a;}, конструктор по умолчанию не инициализирует переменную значением 0? Даже если вы напишете имя RandomStruct; и вызвать конструктор? Есть ли вообще разница между статическими массивами и локальными массивами (когда дело доходит до типа int, статические массивы имеют значения по умолчанию, а локальные массивы имеют неопределенные значения).
@ 12123232 Неявный ctor по умолчанию «имеет тот же эффект, что и пользовательский конструктор с пустым телом и пустым списком инициализаторов» - вы можете смешивать его с нулевой инициализацией, которая происходит для определенных классов продолжительности хранения; Я собираюсь бежать на встречу, но я напишу полный ответ позже, если это применимо.
@ 12123232 Кажется, вы запутались в продолжительности хранения. Это может хоть как-то помочь: en.cppreference.com/w/cpp/language/storage_duration
Кроме того, 1000 RandomStructs могут быть немного большими для автоматических переменных, в зависимости от того, насколько велика структура.





В настоящее время структуры в массиве не инициализированы
Нет, они инициализированы по умолчанию.
Хотя это означает, что переменные структуры также не инициализированы
Влияние на участников зависит от определения RandomStruct. В зависимости от этого определения инициализация по умолчанию RandomStruct может иметь эффект инициализации по умолчанию некоторых или всех нестатических членов данных RandomStruct. В конечном итоге это может привести к инициализации по умолчанию переменной неклассового типа как члена RandomStruct или члена члена и т. д. Эта переменная неклассового типа будет иметь неопределенное значение.
Например, если я устанавливаю всем переменным из неинициализированной структуры желаемое значение, а затем использую функции этой структуры, или если я использую функции структуры, которые не используют неинициализированные переменные, прежде чем я их установлю
Если все элементы инициализируются для определения значений перед использованием, все в порядке. Вызовы функций-членов, которые не «наблюдают» за неопределенными значениями, допустимы.
Правильно ли я думаю, что только переменные будут неинициализированы, а массив просто назначает случайную память каждой из переменных структуры?
Это не совсем так. Это означало бы, что наблюдение за неопределенными значениями допустимо, но их значение просто неизвестно. Это не. Но до тех пор, пока вы не наблюдаете ценности, это верная интуиция.
Можно оставить их неопределенными до тех пор, пока их не наблюдают. Но неопределенное поведение «наблюдать» за неопределенным значением, производя его в любой оценке, за исключением очень ограниченных, перечисленных условий.
Это означает, что правильной программе не разрешается наблюдать значение, но и компилятор не обязан его диагностировать. Однако компилятор может предположить, что это никогда не делается (поскольку правильная программа не может этого сделать), а C++ не предъявляет никаких требований к недопустимой программе.
«В настоящее время структуры в массиве не инициализированы». Вызывается конструктор структуры по умолчанию. Содержащие переменные (структуры) не инициализируются, только если конструктор по умолчанию не инициализирует их.