2016-11-21 2 views
-1

Я узнаю о конструкторах, и мне нужно уточнение. Я могу построить на структуру следующим образом без указания конструктора:Структурный конструктор по умолчанию: будет ли он инициализировать мои члены по умолчанию vaues i.e. 'zeros'

struct MyStruct { 
int member; 
} 

Когда я сделать объект этой структуры сгенерированный конструктор по умолчанию не будет инициализировать member для vlaue по умолчанию, если явно не указано в определенный пользователем конструктор, правильно? Так что это:

MyStruct object; 
cout<<object.member<<endl; 

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

Мой последний вопрос, если я явно не объявлять и определить конструктор будет генерируемый конструктор инициализации member, когда я создаю объект MyStruct или member покинул неинициализированным?

+0

Пожалуйста, смотрите [Это сообщение] (http://stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c) –

+0

Похоже дубликат этого: http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types – aspen100

+1

_ «А, правильно? Да, А. Теперь мой последний вопрос: Что? –

ответ

3

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

Компилятор генерируется конструктор точно так же, как:

MyStruct() {} 

Доступ к MyStruct.member затем приводит к неопределенному поведению. Вы должны явно инициализировать member:

MyStruct() : member(0) {} 
+0

Кроме того, я предлагаю использовать инструмент статического анализа C++, такой как CppCheck, чтобы узнать ошибки/ошибки, подобные этому. Это очень полезно. – peval27

+0

Спасибо за ответ! Это определенно прояснилось. –

0

Если вы явно не использовать «в классе инициализаторе» - как int member = 0;или добавить конструктор, инициализирующий элемент, то его значение будет неопределенную.

Это не будет (обязательно) будет храниться по адресу памяти во время выполнения. Это undefined; что вы не можете использовать его надежно, и , если вы это делаете, ваш компилятор может воспользоваться тем фактом, что вы вызываете «неопределенное поведение» и можете оптимизировать свою программу на основе этого факта - чего-то, чего вы, разумеется, не хотите.

Всегда инициализируйте свои переменные перед использованием.

Смежные вопросы