5

我一直认为下面的代码

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

将打印随机值,因为它会在地图中创建统一值。然而,事实证明,创建的 int 实际上总是被初始化为零并且标准内置类型在某些情况下也被初始化为零。

问题是:什么时候对标准类型(int/char/float/double/size_t)执行零初始化?我很确定,如果我int i;在不知名的地方声明,它将包含随机数据。

PS 这个问题是关于 C++03 标准的。问题的原因是,现在我不再确定何时必须为 int/float/size_t 等内置类型提供初始化,或者何时可以安全地省略它。

4

5 回答 5

9

标准容器(map,vector等...)将始终对它们的元素进行值初始化。

粗略地说,值初始化是:

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

(有人会说,两全其美)

语法很简单:T t = T();将值初始化tT t{};在 C++11 中)。

当您使用map<K,V>::operator[]时,该对的“值”部分是值初始化的,这对于内置类型会产生0

于 2012-02-28T12:12:51.150 回答
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
}
于 2012-02-28T11:49:56.207 回答
1

特别是对于上述情况:

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

我们正在使用 std::map::operator[];

参考http://www.cplusplus.com/reference/stl/map/operator[]/

对于 T& map::operator[] ( const key_type& x );

...如果 x 不匹配容器中任何元素的键,则该函数使用该键插入一个新元素并返回对其映射值的引用。请注意,这总是将映射大小增加一,即使没有为元素分配映射值(该元素是使用其默认构造函数构造的)

所以,test[0]导致 test[0] = int();

现场示例:http: //ideone.com/8yYSk

另请阅读:std::map 内置类型的默认值

于 2012-02-28T11:57:56.667 回答
0

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

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

于 2012-02-28T11:52:04.400 回答
-3

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

于 2012-02-28T11:48:59.823 回答