C ++中的variables初始化

我的理解是,一个intvariables将被自动初始化为0 ; 但是,事实并非如此。 下面的代码打印一个随机值。

 int main () { int a[10]; int i; cout << i << endl; for(int i = 0; i < 10; i++) cout << a[i] << " "; return 0; } 
  • 什么规则,如果有的话,适用于初始化?
  • 具体来说,variables在什么条件下自动初始化?

它会被自动初始化

  • 它是一个类/结构实例,其中默认构造函数初始化所有基元types; 像MyClass instance;
  • 你使用数组初始化语法,例如int a[10] = {} (全零)或int a[10] = {1,2}; (除前两项外,全部为零: a[0] == 1a[1] == 2
  • 同样适用于非聚合类/结构体,例如MyClass instance = {}; (更多信息可以在这里find)
  • 这是一个全球/外部variables
  • 该variables被定义为static (无论是在一个函数内部还是在全局/命名空间范围内) – 感谢Jerry

永远不要相信自动初始化的普通types(int,long,…)的variables! 它可能发生在像C#这样的语言中,但不在C和C ++中。

int不会初始化为零。 当你说int i; ,你所做的只是为整数保留空间。 该位置的值不会被初始化。 这只与你说int i = 0; (或int i = 5;在这种情况下,该值被初始化为5)。 无论如何,将variables初始化为某个已知值是一个很好的习惯。 否则, i保留任何随机值在该空间被保留的内存位置。 这就是为什么cout打印出一个随机值。

默认值取决于语言的实现。 有些语言会将其初始化为一些“理智”的值(比如0)。 作为一个经验法则,我总是将一个variables初始化为一个合理的值(除非我知道在我使用它之前我将把它初始化为其他东西)。 正如我之前提到的那样, 假设价值将会是理智的是不明智的。 它可能也可能不会(取决于语言,或者该语言的解释器/编译器的实现)。

请参见4.9.5初始化C ++编程语言。

根据你的variables是否是本地的,静态的,用户定义的或const默认的初始化可能发生。

由于您使用POD(普通旧数据types),自动variables未初始化为任何默认值。

这篇文章说得最好: http : //www.velocityreviews.com/forums/showpost.php?p=1528247&postcount=10

对于非类的types没有“默认”构造函数,但是有默认(零)初始化。 不幸的是,为了braindead与C的兼容性,在下列情况下,PODtypes的默认初始化不会被完成:

裸体(即,声明没有初始化)variables局部的类或函数。

dynamic分配的实例。

然而,在其他地方(特别是静态variables),以及在任何给定的空初始化参数(当它是有效的)的情况下,得到默认(零)初始化。

要强制初始化POD( int是),可以使用复制初始值设定语法:

 #include <iostream> int main() { int i = int(); int j; std::cout << "i: " << i << std::endl; // warning: undefined behavior std::cout << "j: " << j << std::endl; } 

这属于“只为你使用的东西付钱”。 如果你打算随后为variables赋值,或者根本不使用它,那么就没有理由去完成它的初始化工作。 要做到这一点,你必须明确地要求完成这项工作。

在C ++中,自动variables是不确定的,直到它们被明确赋予一个值。 也许你正在考虑C#或其他.Net语言或Java。

不同的操作系统(例如OS X和Ubuntu Linux)会对C ++中未初始化的variables和初始化的variables做出不同的反应。 根据我的经验,OS X版本的gcc将编译并打印出下面两个版本的代码。 就像我在Ubuntu Linux机器上工作一样,第一个代码块将打印出在variables引用的内存位置(循环后的+2)处发生的任何事情。

  int c; for( int i = 0; i < 3; i++ ) { c++; } cout << c << endl; 

在哪里,他们都会给你同样的结果:

  int c = 0; for( int i = 0; i < 3; i++ ) { c++; } cout << c << endl; 

除非你自己做,否则局部variables不会被初始化。 你所看到的是在你的方法被调用之前堆栈中的垃圾。

如果没有为对象指定初始化程序,则该对象将被默认初始化; 如果未执行初始化,则具有自动或dynamic存储持续时间的对象具有不确定的值。

帕。 8.5,最近的C ++ 0x草案第11节N3092.pdf,

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/

虽然你最近的发现可能是不受欢迎的(因为你可能需要初始化一些其他语言将要处理的variables),但这可能意味着更less的cpu周期,从而代码更快。

这里int i; 是一个必须手动初始化的自动variables。 autovariables不会在c和c ++中自动初始化。

如果你想编译器初始化它,那么你需要使用以下的东西,

声明i为静态variables。

static int i; //由编译器分配给我的零。

声明i为全局variables[在main()之外)。