28

这有效:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

但这会产生编译器错误(“使用未分配的局部变量'a'”):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

据我所知,这是因为在第一个示例中,从技术上讲,编译器不知道没有分配“a”。在后一个示例中,“a”是在本地定义的,因此很容易跟踪。

但是为什么后一个例子不起作用?

整数不是默认为0吗?这是编译器为“最佳实践”而强制执行的。还是另有原因?

4

5 回答 5

42

在第一个示例中,它是一个字段。字段自动默认为 0/false/null。在第二个示例中,它是一个变量。变量不是默认的,在使用之前必须有“明确的赋值”。

本质上,在创建对象(或初始化结构)时,它会将内存归零(或者在非默认结构 ctor 的情况下,强制您手动初始化所​​有内容)。但是,变量非常常见(在每种方法中),它不希望始终将堆栈归零的开销。相反,它会强制您指示初始值。

于 2009-09-14T19:32:53.587 回答
12

整数不是默认为0吗?

当它们是类的数据成员时它们会这样做,但当它们是局部变量时则不会:局部变量需要在使用之前显式初始化,因此会出现编译器错误。

于 2009-09-14T19:31:42.120 回答
2

当您实例化一个类的新实例时,对象所需的所有内存都“归零” int 设置为 0 字符串设置为 null 等。这是为了避免在 C 中可能出现的许多奇怪的内存错误和黑客攻击(++)。不幸的是,这也有一个小的处理成本,所以当你创建一个局部变量时,语言假设你很快就会自己设置这个值,并且不会费心将它归零以减少所需指令的总数。为了抵消使用未设置内存的风险,这引入了编译器检查以确保在允许您使用变量之前已经设置了一个值。

于 2009-09-14T19:34:13.317 回答
2

这可能是因为在类级别声明的变量不能在同一范围内赋值(声明时除外)

例如

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

然而

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}
于 2009-09-14T19:34:57.850 回答
-1

据我所知,当我们在类中声明一个变量并创建一个对象时,默认构造函数会初始化该变量,因此不需要初始化类变量。但是对于类中的方法,没有构造函数或任何东西来初始化这些变量,因此我们不能在方法中分配未初始化的变量。

于 2017-07-17T08:43:53.297 回答