我一直认为以下代码
std::map<int, int> test;
std::cout << test[0] << std::endl;
会打印随机值,因为它会在map中创建单位化值。但是,事实证明,创建的int实际上总是初始化为零,并且标准内置类型在某些情况下也是零初始化的。
问题是:当对标准类型(int / char / float / double / size_t)执行零初始化时?我很确定如果我在不知名的地方声明int i;
,它将包含随机数据。
P.S。问题是关于C ++ 03标准。问题的原因是,当我 为内置类型(如int / float / size_t)提供初始化或者可以安全地省略它时,我现在不再确定了。
答案 0 :(得分:9)
标准容器(map
,vector
等)将始终值初始化其元素。
粗略地说,值初始化是:
(有人会说,两全其美)
语法很简单:T t = T();
将值初始化t
(以及C ++ 11中的T t{};
)。
当您使用map<K,V>::operator[]
时,该对的“值”部分会进行值初始化,对于内置类型,会生成0
。
答案 1 :(得分: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
}
答案 2 :(得分:1)
特别是对于上述情况:
std::map<int, int> test;
std::cout << test[0] << std::endl;
我们正在使用std::map::operator[];
参考http://www.cplusplus.com/reference/stl/map/operator[]/
T&amp; map :: operator [](const key_type&amp; x);
... 如果x与容器中任何元素的键不匹配,则该函数会使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用默认构造函数构造元素),这也会将地图大小增加1。
所以,test[0]
指向test[0] = int();
此处的实例:http://ideone.com/8yYSk
答案 3 :(得分:0)
请注意,char,int,float等数据类型未初始化。 但在这种特殊情况下,它被初始化,因为它在stl容器类中使用。
初始化所有stl容器类对象。
答案 4 :(得分:-3)
最简单的解决方案是简单地创建一个始终初始化的模板包装器。