С++ - значение неинициализированного вектора <int>
Я понимаю из ответа на этот вопрос, что значения глобального/статического неинициализированного int будут равны 0. Ответ на этот говорит, что для векторов будет вызываться конструктор по умолчанию для типа объекта.
Я не могу понять - что происходит, когда у меня есть vector<int> v(10)
в локальной функции. Что такое конструктор по умолчанию для int? Что делать, если во всем мире объявлено vector<int> v(10)
?
То, что я вижу, заключается в том, что vector<int> v(10)
в локальной функции приводит к тому, что переменные равны 0, но я не уверен, что это только из-за моего компилятора или является фиксированным ожидаемым поведением.
Ответы
Ответ 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 вводит инициализацию значения, которая по-прежнему отличается).