C ++ - значение неинициализированного вектора <int> - PullRequest
42 голосов
/ 07 марта 2011

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

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

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

Ответы [ 6 ]

40 голосов
/ 07 марта 2011

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

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

vector( size_type, T t = T() )

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

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

int x;

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

int x = int();

сделает это.

int x();

к сожалению не делает ни того, ни другого, но объявляет функцию.

40 голосов
/ 07 марта 2011

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

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

10 голосов
/ 07 марта 2011

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

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

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

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

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

3 голосов
/ 07 марта 2011

значение по умолчанию 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

1 голос
/ 07 марта 2011

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

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

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

(А в C ++ 0X вводится инициализация значения, которая все еще отличается).

1 голос
/ 07 марта 2011

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

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

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

...