Поведение неинициализированных структур C++

Скажем, мы объявляем массив структур в локальной области видимости:

    int main()
{
    RandomStruct array [1000];
}

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

«В настоящее время структуры в массиве не инициализированы». Вызывается конструктор структуры по умолчанию. Содержащие переменные (структуры) не инициализируются, только если конструктор по умолчанию не инициализирует их.

Algirdas Preidžius 16.12.2020 19:42

Действительно? Даже если массив является локальным для основного метода? @AlgirdasPreidžius

12123232 16.12.2020 19:42

Почему нельзя вызывать конструктор по умолчанию, если массив локальный?

Algirdas Preidžius 16.12.2020 19:45

«Вы ошибаетесь». Тем не менее, я сказал: «Содержащие переменные (структуры) не инициализированы, только если конструктор по умолчанию их не инициализирует», а конструктор по умолчанию, сгенерированный компилятором, не инициализирует их. Пожалуйста, не говорите, что люди не правы, если вы не читали всего, что они написали.

Algirdas Preidžius 16.12.2020 19:47

@AlgirdasPreidžius Ага, то есть в случае структур с локальными массивами они создаются конструктором по умолчанию, сгенерированным компилятором, а, например, в статических массивах они создаются конструктором структуры по умолчанию? Это также касается, скажем, массива int? Спасибо за эту информацию, я новичок в C++.

12123232 16.12.2020 19:52

@ 12123232 это не похоже на правильную характеристику. В обоих случаях используется ctor по умолчанию, и он может быть либо сгенерирован компилятором, либо предоставлен пользователем, в зависимости от того, объявили ли вы его при написании фактического определения структуры.

nanofarad 16.12.2020 19:56

@ 12123232 «поэтому в случае структур с локальными массивами они создаются конструктором по умолчанию, сгенерированным компилятором» Не обязательно. Вот почему я написал свой комментарий. Конструктор может быть предоставлен пользователем, который может инициализировать содержащие переменные. Не зная, что такое RandomStruct, невозможно узнать, будут ли инициализированы его значения членов. Если это так, например struct RandomStruct {int a; RandomStruct () : a(-1) {}}; - a будет инициализироваться -1, каждый раз, независимо от того, где выполняется такое построение.

Algirdas Preidžius 16.12.2020 19:58

@nanofarad О, я знаю, что конструктор по умолчанию создается, когда пользователь не определил его. Это то, что подразумевается под конструктором по умолчанию, созданным компилятором? Посмотрите на эту программу: pastebin.com/Da6Xc2He, во-первых, я бы сказал, что структура в ar[3] неинициализирована, и ее переменные неинициализированы, как видно при печати, но если вы назначите конструктор по умолчанию для ar[ 3], то переменные инициализируются.

12123232 16.12.2020 20:00

@ 12123232 Под «конструктором по умолчанию, сгенерированным компилятором» подразумевается то, что, игнорируя то, как вы используете свою структуру, если вы не объявляете/определяете RandomStruct::RandomStruct() или объявляете его RandomStruct() = default, компилятор генерирует ctor по умолчанию (см. «Неявно объявленный конструктор по умолчанию» на en.cppreference.com/w/cpp/language/default_constructor). Вы не можете «назначить конструктор по умолчанию для ar[3]. ... (слишком длинный для комментариев)

nanofarad 16.12.2020 20:35

... Что вы можете иметь в виду, так это то, что вы создаете временное по умолчанию и назначаете его ar[3], используя это

nanofarad 16.12.2020 20:36

@nanofarad Таким образом, в основном конструктор по умолчанию компилятором не делает все члены структуры равными их значениям по умолчанию? Есть ли тогда какая-либо разница между статическими и локальными массивами (если мы говорим, например, о типе int, статические массивы инициализируются значениями по умолчанию, в то время как локальные имеют неопределенные значения).

12123232 16.12.2020 21:46

@AlgirdasPreidžius, так что, если структура представляет собой просто struct RandomStruct {int a;}, конструктор по умолчанию не инициализирует переменную значением 0? Даже если вы напишете имя RandomStruct; и вызвать конструктор? Есть ли вообще разница между статическими массивами и локальными массивами (когда дело доходит до типа int, статические массивы имеют значения по умолчанию, а локальные массивы имеют неопределенные значения).

12123232 16.12.2020 21:49

@ 12123232 Неявный ctor по умолчанию «имеет тот же эффект, что и пользовательский конструктор с пустым телом и пустым списком инициализаторов» - вы можете смешивать его с нулевой инициализацией, которая происходит для определенных классов продолжительности хранения; Я собираюсь бежать на встречу, но я напишу полный ответ позже, если это применимо.

nanofarad 16.12.2020 21:59

@ 12123232 Кажется, вы запутались в продолжительности хранения. Это может хоть как-то помочь: en.cppreference.com/w/cpp/language/storage_duration

Algirdas Preidžius 16.12.2020 22:09

Кроме того, 1000 RandomStructs могут быть немного большими для автоматических переменных, в зависимости от того, насколько велика структура.

Deduplicator 17.12.2020 02:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
15
878
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время структуры в массиве не инициализированы

Нет, они инициализированы по умолчанию.

Хотя это означает, что переменные структуры также не инициализированы

Влияние на участников зависит от определения RandomStruct. В зависимости от этого определения инициализация по умолчанию RandomStruct может иметь эффект инициализации по умолчанию некоторых или всех нестатических членов данных RandomStruct. В конечном итоге это может привести к инициализации по умолчанию переменной неклассового типа как члена RandomStruct или члена члена и т. д. Эта переменная неклассового типа будет иметь неопределенное значение.

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

Если все элементы инициализируются для определения значений перед использованием, все в порядке. Вызовы функций-членов, которые не «наблюдают» за неопределенными значениями, допустимы.

Правильно ли я думаю, что только переменные будут неинициализированы, а массив просто назначает случайную память каждой из переменных структуры?

Это не совсем так. Это означало бы, что наблюдение за неопределенными значениями допустимо, но их значение просто неизвестно. Это не. Но до тех пор, пока вы не наблюдаете ценности, это верная интуиция.

Можно оставить их неопределенными до тех пор, пока их не наблюдают. Но неопределенное поведение «наблюдать» за неопределенным значением, производя его в любой оценке, за исключением очень ограниченных, перечисленных условий.

Это означает, что правильной программе не разрешается наблюдать значение, но и компилятор не обязан его диагностировать. Однако компилятор может предположить, что это никогда не делается (поскольку правильная программа не может этого сделать), а C++ не предъявляет никаких требований к недопустимой программе.

Другие вопросы по теме