C ++中的variables初始化
我的理解是,一个int
variables将被自动初始化为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] == 1
和a[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,
虽然你最近的发现可能是不受欢迎的(因为你可能需要初始化一些其他语言将要处理的variables),但这可能意味着更less的cpu周期,从而代码更快。
这里int i;
是一个必须手动初始化的自动variables。 autovariables不会在c和c ++中自动初始化。
如果你想编译器初始化它,那么你需要使用以下的东西,
声明i
为静态variables。
static int i;
//由编译器分配给我的零。
声明i
为全局variables[在main()之外)。