Подтвердить что ты не робот

Разница между различными инициализаторами в С++

Я только недавно начал изучать С++ как часть моей программы 10-го ранга, и я знаю только основы, поэтому простые ответы (если это возможно) будут оценены. Я довольно путаюсь между инициализацией и назначением.

//Case 1
int a=5; //This is initialization
a=6; //This is assignment

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

Как насчет:

//Case 2
int b;
{
//Block of code which does not call variable b
.
.
.
//End of block
}
b=6; // Is this initialization as well?

В то время как 'b' не инициализируется, когда мы объявляем, мы позже присваиваем значение '6'. Можем ли мы сказать, что "b" инициализируется сейчас? Или термины, инициализированные и неинициализированные, неприменимы к "b"?

Я читаю, что неинициализированная переменная хранит "значения мусора" до тех пор, пока она не будет инициализирована. Что такое "значения мусора"?

В чем разница между следующими инициализаторами: '()', '{}' и '='?

4b9b3361

Ответ 1

Хорошо, как только вы объявите переменную без назначения какого-либо значения, например

int b; 

это означает, что компилятор резервирует некоторое пространство в памяти для хранения значения (точнее, в этом случае память зарезервирована в стеке). Но так как вы не назначили какое-либо значение переменной, оно все еще сохраняет значение, которое ранее занимало пространство памяти. И это может быть что угодно. Это значения мусора.

Инициализаторы:

int b(1);

присваивает значение 1 (в общем случае он вызывает конструктор типа)

Скобки могут использоваться для инициализации таких массивов (edit):

int b[] = {1, 3, 5, 7};

И = = просто присваивает значение. Разница между этим и первым будет интересна только при работе с более сложными типами (классами), где у вас есть конструкторы

Ответ 2

Проще говоря:

Неинициализировать переменную:

 int a;

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

Инициализированная переменная:

int a = 0;

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

Значения Assign:

a = 10;

Вы назначаете rvalue (в этом случае 10) на lvalue (a). Таким образом, вы не выделяете новую память.

Ответ 3

Вы в основном правы.

Некоторые старые тексты называют первое присваивание неинициализированной переменной "инициализацией", хотя это не является строго точным.

"Значения мусора" являются произвольными значениями. Они могут выглядеть значимыми или быть абсолютно случайными.

Ответ 4

Инициализация служит для инициализации неинициализированного значения.

Это могут быть мои средства конструктора копирования, т.е. int a = 1; или int a(1);, это можно сделать с помощью назначения, то есть int a; a = 1;, это можно сделать с помощью функции, то есть int a; init(a);. Инициализация не является "языковой вещью", это всего лишь акт указания неопределенного значения.

Значение "мусора" - произвольное значение. Некоторое хранилище будет отдано неинициализированному объекту, и попытка его прочитать приведет к тому, что все будет в этой памяти.