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

С++ - значение неинициализированного вектора <int>

Я понимаю из ответа на этот вопрос, что значения глобального/статического неинициализированного int будут равны 0. Ответ на этот говорит, что для векторов будет вызываться конструктор по умолчанию для типа объекта.

Я не могу понять - что происходит, когда у меня есть vector<int> v(10) в локальной функции. Что такое конструктор по умолчанию для int? Что делать, если во всем мире объявлено vector<int> v(10)?

То, что я вижу, заключается в том, что vector<int> v(10) в локальной функции приводит к тому, что переменные равны 0, но я не уверен, что это только из-за моего компилятора или является фиксированным ожидаемым поведением.

4b9b3361

Ответ 1

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

Обратите внимание, что это поведение отличается от локальной переменной, такой как int x;, которая оставляет значение неинициализированным (как на языке C, которому наследуется поведение).

Ответ 2

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

Конструктор:

vector( size_type, T t = T() )

а для int тип по умолчанию (возвращаемый int()) равен 0.

В локальной функции это:

int x;

не гарантируется инициализация переменной до 0.

int x = int();

сделает это.

int x();

Печально не объявляет функцию.

Ответ 3

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

explicit vector(size_type n, const T& value = T())

Первый аргумент - это количество элементов, созданных в vector изначально; второй аргумент - это значение для копирования в каждый из этих элементов.

Для любого типа объекта T, T() называется "инициализацией значения". Для числовых типов это дает вам 0. Для типа класса с конструктором по умолчанию он предоставляет объект, который по умолчанию был сконструирован с использованием этого конструктора.

Подробнее о "волшебных круглых скобках", я бы рекомендовал прочитать замечательный ответ Майкла Барра на вопрос "Скобки в скобках после того, как имя типа изменилось с новым?" В нем обсуждается инициализация значений при использовании с new в частности, но по большей части применима к инициализации значений, где бы она ни использовалась.

Ответ 4

значение по умолчанию int равно нулю. Итак, vector<int> v(10) инициализирует все 10 элементов с нулем!

int main() {
        std::vector<int> v(10);
        for ( int i = 0 ; i < 10 ; i++ )
           std::cout << v[i] << std::endl;
        return 0;
}

Вывод:

0
0
0
0
0
0
0
0
0
0

Запуск при идеоне: http://ideone.com/IbcyH

Ответ 5

Инициализация по умолчанию для типа int должна инициализировать его до 0.

Это относится к большинству (если не все) примитивным типам: char будет инициализироваться до (char)0 (или '\0', если вы предпочитаете), float будет инициализироваться до 0.0f, и любой указатель инициализируется NULL. Для других типов вызывается конструктор без параметров.

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

Ответ 6

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

  • нулевая инициализация - это то, что делается для статических объектов, не имеющих явной инициализации, и что сделано для члена, указанного в инициализированном списке с инициализатором (). Для базовых типов используется значение 0, преобразованное в тип.

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

(И С++ 0X вводит инициализацию значения, которая по-прежнему отличается).