c ++ 03:std :: map中内置类型的默认构造函数

时间:2012-02-28 11:39:37

标签: c++ stdmap c++03

我一直认为以下代码

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)提供初始化或者可以安全地省略它时,我现在不再确定了。

5 个答案:

答案 0 :(得分:9)

标准容器(mapvector等)将始终值初始化其元素。

粗略地说,值初始化是:

  • 默认初始化,如果有默认构造函数
  • 零初始化否则

(有人会说,两全其美)

语法很简单: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

另请阅读:std::map default value for build-in type

答案 3 :(得分:0)

请注意,char,int,float等数据类型未初始化。 但在这种特殊情况下,它被初始化,因为它在stl容器类中使用。

初始化所有stl容器类对象。

答案 4 :(得分:-3)

最简单的解决方案是简单地创建一个始终初始化的模板包装器。