2012-02-28 2 views
4

Я всегда думал, что следующий кодC++ 03: конструктор по умолчанию для построения типов в станде :: Карта

std::map<int, int> test; 
std::cout << test[0] << std::endl; 

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

Вопрос: когда нулевое инициализация выполняется для стандартных типов (int/char/float/double/size_t)? Я уверен, что если я объявлю int i; в середине нигде, он будет содержать случайные данные.

P.S. Вопрос о стандарте C++ 03. Причина вопроса заключается в том, что теперь я не уверен, когда у есть, чтобы обеспечить инициализацию встроенных типов, таких как int/float/size_t или когда их можно безопасно пропустить.

+0

Возможный дубликат [std :: map default value для встроенного типа] (http://stackoverflow.com/questions/4523959/stdmap-default-value-for-build-in-type) –

+1

помогает ли это ? http://stackoverflow.com/questions/7084831/difference-between-default-initialize-and-value-initialize-in-c03 – vulkanino

ответ

9

Стандартные контейнеры (map, vector и т.д ...) всегда значение инициализации их элементов.

Грубо говоря, значение инициализация является:

  • по умолчанию инициализация если есть конструктор по умолчанию
  • нулевой инициализации иначе

(Некоторые говорят, что , лучшее из обоих миров)

Синтаксис прост: T t = T(); будет value-initialize tT t{}; в C++ 11).

Когда вы используете map<K,V>::operator[], «значение» части пары инициализируется значением, которое для встроенного типа дает 0.

+3

Я ** мог бы ошибаться в этом, но не 'T t();' a [«самый неприятный синтаксический анализ»] (http://en.wikipedia.org/wiki/Most_vexing_parse) (т.е. это на самом деле объявление функции forward и должно быть 'T t ((T()));' или 'T t = T();')? – SigTerm

+0

@SigTerm, вы правы. Это должно быть 'T t = T();' – wilhelmtell

+0

@SigTerm: right ... и все же я поместил синтаксис C++ 11, чтобы показать, насколько проще это было в C++ 11. –

-3

Простейшим решением является просто создать оболочку шаблона, которая всегда будет инициализирована.

1

Я уверен, что если я объявлю int i; в середине нигде он будет содержать случайные данные.

Нет, не всегда.

Если создать объект типа POD, то он будет неинициализированными:

struct A 
{ 
    int iv; 
    float fv; 
}; 

int main() 
{ 
    A a; // here the iv and fv are uninitialized 
} 

Как только вы добавить конструктор, они становятся инициализирован:

struct A 
{ 
    A(){} // iv and fv initialized to their default values 
    int iv; 
    float fv; 
}; 

int main() 
{ 
    A a; // here the iv and fv are initialized to their default values 
} 
+0

Но каковы значения по умолчанию в вашем втором примере? – Gui13

+0

, так что если есть конструктор, все будет инициализировано до нуля? Как насчет указателей? Или объявления переменных за пределами структур/классов (хотя я полагаю, что переменные некласса не инициализируются)? – SigTerm

+1

Для другого примера «середины нигде», 'int i;' в области файла будет инициализирован на '0'. –

0

Обратите внимание, что типы данных как char, int, float, не инициализируются. , но вместо этого в этом конкретном случае он был инициализирован, потому что он использовался в классе контейнеров stl.

Все объекты класса контейнера stl инициализируются.

1

В частности, для приведенного выше случая:

std::map<int, int> test; 
std::cout << test[0] << std::endl; 

Мы используем std::map::operator[];

Отсносящийся http://www.cplusplus.com/reference/stl/map/operator[]/

Для T & карта :: оператор [] (Const key_type & х);

... Если x не соответствует ключу любого элемента в контейнере, функция вставляет новый элемент с этим ключом и возвращает ссылку на его отображаемое значение. Обратите внимание, что это всегда увеличивает размер карты на единицу, даже если для элемента не назначено сопоставленное значение (элемент построен по его конструктору по умолчанию).

Так, test[0] leades к test[0] = int();

Живой пример здесь: http://ideone.com/8yYSk

Также читайте: std::map default value for build-in type

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